Claude Code
claude mcp add --transport http fastmonitor https://<your-api-origin>/mcp \
--header "Authorization: Bearer mcp_xxxxxxxx"docs
Copy the whole setup as one markdown file and paste it into your agent: the monitor, the API key, reporting job runs, the SDKs and the MCP connection.
Create a monitor, report your jobs with one HTTP call, and connect your coding agent. For every field, response and error code, see the API reference.
Sign in and add a monitor in the dashboard. Uptime, SSL, DNS and broken-link checks run from FastMonitor's side and need no code. For a cron job or worker, add a job monitor with its schedule and grace period, and note its monitor key.
In Settings → API, create a key with the monitor:telemetry scope. It is shown once and stored only as a hash, so keep it in a server-side secret.
Send RUN when the job starts, then COMPLETE or FAIL when it ends. FastMonitor opens an issue if a run fails, runs too long or never arrives.
POST /e/execution-events
Authorization: Bearer <api-key>monitorKey and state are required.{
"monitorKey": "daily-report",
"state": "RUN",
"timestamp": "2026-06-13T10:00:00.000Z",
"duration": 1234,
"errorMessage": "optional error",
"metadata": { "deployment": "prod", "region": "eu-west-2" },
"idempotencyKey": "daily-report:2026-06-13T10:00:00Z:RUN"
}Responses, error codes and retry rules: the endpoint reference.
Publishing pending: the SDKs are not on npm, PyPI or Packagist yet, so these install commands will not work until they are published. Until then, send the HTTP request above: the SDKs send exactly that request.
@maki/monitor on npm
npm install @maki/monitormakimonitor on PyPI
pip install makimonitormaki/monitor-php on Packagist
composer require maki/monitor-phpUsage examples for each SDK are on the API page.
Ask your coding agent what is failing, triage an incident or plan a check. FastMonitor serves a remote MCP endpoint at your API address followed by /mcp (Streamable HTTP, Authorization: Bearer with an MCP token). In the dashboard, open Settings → AI agents & MCP, create a token with only the permissions it needs, and copy it: it is shown once, next to ready-made setup with your server address filled in. Revoke it there at any time.
claude mcp add --transport http fastmonitor https://<your-api-origin>/mcp \
--header "Authorization: Bearer mcp_xxxxxxxx"export FASTMONITOR_MCP_TOKEN=mcp_xxxxxxxx
codex mcp add fastmonitor --url https://<your-api-origin>/mcp --bearer-token-env-var FASTMONITOR_MCP_TOKENmcp_servers:
fastmonitor:
url: "${FASTMONITOR_MCP_URL}"
headers:
Authorization: "Bearer ${FASTMONITOR_MCP_TOKEN}"| Tool | Permission | Does |
|---|---|---|
| list_monitors | Read monitors | Your monitors with type, host, current state and status. |
| get_monitor_summary | Read monitors | One monitor by id or key, with its last run. |
| list_open_issues | Read issues | Open incidents. |
| get_issue_summary | Read issues | One incident with its five latest updates. |
| acknowledge_issue | Acknowledge issues | Adds a note and moves an unresolved incident to investigating. Nothing else. |
Tokens are scoped to your own monitors and issues, hashed at rest, limited to 60 requests a minute and audited on every call. The Claude Code, Codex and Hermes plugins (the MCP connection plus skills such as a status summary and cron instrumentation) are publishing pending: they are not listed in the Claude, OpenAI or Nous plugin directories yet. The MCP setup above works without them.
Plans: Starter & Enterprise
Add a webhook in Settings → Integrations with its URL, the method (POST, PUT or GET), any custom header fields and, optionally, a signing secret. FastMonitor sends each alert as JSON (a GET sends no body) and retries a failed delivery with backoff, so use dedupeKey to ignore one you have already handled. eventType is triggered or resolved.
With a signing secret, every request carries X-Alert-Signature: sha256=<hex HMAC-SHA256 of the body>. A GET is signed over the empty string. Check it against the raw body, before parsing it, and compare in constant time; reject the request when the function returns false.
{
"alertEventId": "<alert event id>",
"monitorId": "<monitor id>",
"issueId": "<issue id>",
"ownerId": "<account id>",
"severity": "critical",
"title": "<short summary>",
"body": "<what failed>",
"dedupeKey": "<idempotency key>",
"eventType": "triggered",
"links": { "issueUrl": "<link to the issue in the dashboard>" }
}const crypto = require('node:crypto');
function verifyAlertSignature(rawBody, signatureHeader, signingSecret) {
const expected =
'sha256=' +
crypto.createHmac('sha256', signingSecret).update(rawBody).digest('hex');
const received = Buffer.from(String(signatureHeader || ''));
const wanted = Buffer.from(expected);
return (
received.length === wanted.length &&
crypto.timingSafeEqual(received, wanted)
);
}Plans: All plans
An HTTP check requests your URL on a schedule. It passes when the status code is one you expect and every assertion passes. An assertion that cannot be evaluated, such as a JSON path on a body that is not JSON, fails instead of passing silently.
| Assertion | Checks | Operators |
|---|---|---|
| response.code | The final status code | < <= = != > >= |
| response.time | How long the request took, in milliseconds | < <= = != > >= |
| response.body | The response body (the first 1 MiB) | contains does not contain = != |
| response.json | A JSON value at a path such as data.items[0].status | = != contains does not contain |
| response.header | A response header, by name | = != contains does not contain |
To avoid alerts for a single blip, set how many failed checks in a row, from 1 to 100, it takes before FastMonitor opens an issue. The issue resolves on its own when the check passes again.
Plans: Starter & Enterprise
ssl_certificate.expires_in, the days left on the certificate.Plans: All plans
A notification list is a named group of email recipients and integrations. Each monitor alerts one list; a monitor without a list alerts your default list. Alert channels: email on every plan, Slack, webhooks, Microsoft Teams, Discord, Google Chat, Telegram, Lark / Feishu, Twilio SMS and voice, Pushover and n8n on Starter and Enterprise, and PagerDuty, Opsgenie and Splunk On-Call on Enterprise. Notification lists per account: 1 on Free, 10 on Starter and unlimited on Enterprise.
Environments, such as production and staging, group your monitors, and you switch between them in the dashboard. Environments per account: 2 on Free, 10 on Starter and unlimited on Enterprise. See every channel and its plans on Integrations.
Plans: Starter & Enterprise
A status page shows the uptime of the monitors you pick and any open incidents, with your logo and brand colour, at its own address from us. Status pages per account: up to 5 on Starter and unlimited on Enterprise.
To serve a page on your own domain, verify the domain in the dashboard with a TXT record, attach it to the page, and point a CNAME record at the target the dashboard shows. The page goes live on your domain once our team has confirmed the CNAME record.
Plans: Enterprise plan
Routing rules decide which notification lists receive an alert. A rule matches on any mix of monitor type, check type, environment, tags, monitor group, severity and schedule (days and hours in a time zone you choose), and sends to one or more lists. Rules run in priority order, lowest number first, and a rule set to stop processing keeps the rules after it from running.
"Where would this alert go?" in the dashboard shows which of your rules a sample alert matches and which lists it reaches. If no rule matches, the monitor's own notification list is alerted, or your default list when the monitor has none.
Plans: Enterprise plan
After an alert, an automation rule can call a webhook, start an n8n workflow, post an update to a status page or create a ticket. A run can wait for approval, retries with backoff when the target fails, and keeps an audit trail. Before a rule is enabled it can be dry-run: the dry run checks the rule and its target and shows what it would send, without sending anything.
There is no automation screen in the dashboard yet: our team sets up your automation rules and handles run approvals with you, on request.
Plans: All plans
Create an organization and invite people by email. Each member has one of 5 roles: owner, admin, billing, member and viewer. Owners and admins invite and manage members and teams, the billing role manages billing, and viewers have read-only access. There is no per-seat pricing. Monitors, notification lists and API keys belong to the person who created them.
Everyone can turn on two-factor sign-in with an authenticator app (TOTP) in Settings → Account, with single-use backup codes, and can sign in with Google or GitHub.
Plans: All plans
API keys authenticate the telemetry API. In Settings → API, create a key with the Telemetry purpose (the monitor:telemetry and monitor:write scopes), or choose Custom and pick from monitor:telemetry, monitor:read, monitor:write, issue:read and issue:write. You can limit a key to certain monitors and give it an expiry date. A key is shown once and stored only as a hash, and it can never report for another account's monitors.
Coding agents use separate MCP tokens, created in Settings → AI agents & MCP (see Agent plugins and MCP).
The public API is the telemetry endpoint, POST /e/execution-events. Authentication, every field, the responses, error codes and retry advice are on the API page. Monitors, alert settings and billing are set up in the dashboard.
Running the FastMonitor backend yourself? It serves an interactive Swagger UI at /api-docs in development, and in production only when API_DOCS_ENABLED=true. The hosted service keeps it switched off.
Alert channels and what each plan includes.
Plans, limits and setup.
What changed, newest first.
Questions we have not answered.
Come on, give it a go. You won't be disappointed.