/ docs / mcp
Connect Fettle to Claude, Cursor or Windsurf over the Model Context Protocol — a hosted endpoint or the fettle-mcp npm package.
Fettle speaks the Model Context Protocol in two ways. Both authenticate with an ordinary Fettle API key and expose exactly the same tools, because both read the same generated contract.
https://api.fettle.sh/mcp. Nothing to install, and it always offers the current tools.fettle-mcp npm package, run over stdio by your client. For clients that cannot speak remote MCP, or when you would rather the key stayed in a local config file.Prefer remote when your client supports it. Neither channel supports OAuth yet — a client that offers only one-click OAuth sign-in needs the local package.
Point your client at the endpoint and send your key as a bearer token. The exact config file differs by client; the two fields never do.
{
"mcpServers": {
"fettle": {
"url": "https://api.fettle.sh/mcp",
"headers": { "Authorization": "Bearer fettle_your_key_here" }
}
}
}Requires Node.js 20 or newer. There is nothing to install ahead of time — your MCP client fetches and runs the package on demand.
claude mcp add fettle \
--env FETTLE_API_KEY=fettle_your_key_here \
-- npx -y fettle-mcpClaude Desktop, Cursor and Windsurf are configured with a JSON file instead — claude_desktop_config.json, ~/.cursor/mcp.json and ~/.codeium/windsurf/mcp_config.json respectively. All three take the same block:
{
"mcpServers": {
"fettle": {
"command": "npx",
"args": ["-y", "fettle-mcp"],
"env": { "FETTLE_API_KEY": "fettle_your_key_here" }
}
}
}Restart the client after editing its config: most read MCP settings only at launch.
Read tools need a key with read scope; write tools need write scope. Ask for something a read key cannot do and the assistant is told, in words, to get a write key — it will not fail silently.
| Tool | Scope | What it does |
|---|---|---|
| list_monitors | read | List the monitors in the organization the API key belongs to. |
| get_monitor | read | Read one monitor's full configuration and current status by id. |
| create_monitor | write | Create a monitor that checks a URL, host or port on a schedule. |
| update_monitor | write | Change an existing monitor's settings. |
| pause_monitor | write | Stop checking a monitor without deleting it — use before planned downtime. |
| resume_monitor | write | Resume checks on a paused monitor. |
| delete_monitor | write | Soft-delete a monitor: it stops being checked and no longer appears in the organization's monitor list. |
| check_now | write | Re-arm a monitor to run on the scheduler's next tick instead of waiting out its interval. |
| get_uptime_summary | read | Uptime percentage, average response time and incident counts for one monitor over the 24-hour, 7-day and 30-day windows at once. |
| list_incidents | read | List incidents across the organization's monitors, optionally filtered to one monitor, to open or resolved ones, or to a period. |
| acknowledge_incident | write | Acknowledge an open incident so repeat notifications stop while someone works on it. |
| list_heartbeats | read | List heartbeat (cron / dead-man's-switch) monitors and when each was last pinged. |
| create_heartbeat | write | Create a heartbeat monitor and get back the URL a scheduled job should ping. |
| list_status_pages | read | List the organization's status pages, including each page's slug and whether it is currently published. |
Generated from the tool contract at /public-api/mcp-tools.json, the same document both channels read.
A tool call is an API call: it spends one unit of your organization’s per-minute request budget, the same budget your own scripts use. There is no separate MCP allowance and no surcharge. The numbers per plan are on the API keys page.
node -v reports 20 or newer, then run npx -y fettle-mcp in a terminal: it should print a missing-key message and exit, which proves the package itself runs.