MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Code & DevOps

net.hookpulse/hookpulse

Know when a job stops or a site goes down after the agent exits. Free monitors; paid extra coverage.

Checks passed
14 / 22

0 failed · 8 not measured

Median response
891 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
29

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
400
Publisher identityCan the publisher be traced to its source?
402

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 891 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-06-18, serverInfo.name HookPulse.

  • Pass
    Lists tools

    tools/list returned 29 tools.

  • Pass
    Current protocol

    Negotiated 2025-06-18. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 891 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 891 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Pass
    Parameters documented

    79 of 79 parameters have a description (100%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Pass
    Source repo linked

    A repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-10T16:19:43.550201Z, within 180 days.

  • Not measured
    Open-source licence

    The GitHub licence lookup has not returned an OSI result yet.

Start using net.hookpulse/hookpulse

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http net-hookpulse-hookpulse https://hookpulse.net/mcp

Capabilities

Tools 29

api_index

Full index of the HookPulse API.

Discovered
buy_plan

Buy a plan: starter (40 more monitors, up to 50), team (90 more monitors, up to 100), business (490 more monitors, up to 500). Each purchase lasts 30 days, with no automatic renewal. Answers 402 with the price; pay with x402 or prepaid credit and repeat. Each purchase lasts 30 days, with no automatic renewal. Without payment, the answer is 402 with the price. Pay with prepaid credit (`X-Credito`) or x402 (`PAYMENT-SIGNATURE` v2 or `X-PAYMENT` v1). Without an account, the verified paying wallet owns the purchase. Use wallet agent authentication to read its plan, or claim it after account sign-in. The `compra` mark prevents repeat credit debits. An x402 nonce can settle only once; keep the receipt after a delivery error.

Discovered
cancel_plan

Cancel the active plan. Nothing else is charged; a purchase under 7 days and a paid period that has not started are refunded and end now, and the rest of the paid period stays active until keeps_until. Requires accept_data_removal: true. Send `{ "accept_data_removal": true }`. The monthly card subscription stops. A purchase made less than 7 days ago and a paid period that has not started yet, such as a renewal, go back the same way they were paid (card or Pix) and end now. The rest of the paid period stays active until `keeps_until`; then what the plan added ends (`account.cancel.losses` in `GET /api/plans` says what). A purchase paid with USDC or with credit from another purchase stays active until its end; ask for its refund by e-mail, as the cancellation page says.

Discovered
check_site

Check a site monitor now. One call every 10 seconds per destination host. One call every 10 seconds per destination host, for everyone: the button cannot hammer a site. The first state of a new site comes from here, without an alert — you are looking at it. After that, the state and the alerts come from the check that runs every minute.

Discovered
contact

Write to the people behind the product: a question, or a sponsorship/partnership/advertising proposal. Free, no captcha and no payment; one message every 10 s per network (one that arrives sooner waits its turn). One route for a question and for a sponsorship, partnership or ad proposal (`tipo`, with the placements of `GET /api/partners`). No captcha, no account, no payment. One message every 10 seconds per network: one that arrives sooner waits its turn and then goes out — no error. The message reaches the team by e-mail, with `email` as the reply address. For voice, send multipart/form-data: `dados` is this JSON (up to 32 KiB), and `audio` is one WebM, Ogg or M4A audio file (up to 2 MB). Audio can replace message. The browser records up to two minutes. Audio is attached to the owner's e-mail.

Discovered
create_endpoint

Create a monitor for a routine. Use cron, tz and grace_sec for a schedule, or interval_sec for a fixed check-in interval. Set max_duration_sec to detect an open run that exceeds its time limit. Without an owner token, creation returns guest_token; keep it private for later calls. Read billing before a paid option. A charged request returns HTTP 402. We keep the schedule, detect missing runs and send configured alerts. Your agent can stop after setting up the monitor. A check-in proves the signal arrived, not that a backup can be restored. Alert timing depends on the check cycle. A single paid probe does not create continuous monitoring.

Discovered
create_guest

Creates a guest token hp_… Keep the token: without it there is no way back to the monitors, unless you have already tied them to an e-mail.

Discovered
create_site

Monitor a website: HookPulse calls check.url every interval_sec (default 300) and alerts when it goes down and when it is back. Without an owner token, creation returns guest_token; keep it private. Read billing before a paid option. A charged request returns HTTP 402. We keep the schedule, detect missing runs and send configured alerts. Your agent can stop after setting up the monitor. A check-in proves the signal arrived, not that a backup can be restored. Alert timing depends on the check cycle. A single paid probe does not create continuous monitoring.

Discovered
delete_endpoint

Removes the owner's endpoint.

Discovered
get_api_x402_check

Checks a URL once for an agent, paid per call: status, response time, keyword and TLS certificate, with no account and no monitor. One reading with the probe of the site monitors, and the certificate of an https address that answered. A request without payment gets the 402 with the price; a paid one gets the reading in the same response, with the payment in `cobranca`. A site that is down is the answer (`ok: false` with `reason`) and is charged: the call was made. When our own probe network fails, the answer is 503 and nothing is charged.

Discovered
get_endpoint

Status of one endpoint (use the endpoint token if you have it). The monitor token only reads: it lets you put the state on a third-party dashboard without handing over the owner's credential. With a schedule it is here that `next_expected_at` says when the next run is due. Only this endpoint carries `duration`: `p50_ms` (the low median, so always a duration that really happened) and `max_ms` over the last runs we measured, computed at read time over the event window we already keep — the list does not pay for it.

Discovered
health

Read service liveness before using HookPulse. Returns the health response; does not check a monitor.

Discovered
import_crontab

Reads a crontab and proposes one monitor per scheduled line. Without apply=1 nothing is written; the proposal says what was ignored and why. Passwords in the command are redacted. The body is the crontab itself, as `text/plain`. Without `?apply=1` **nothing is written**: you get the proposal — what would become a monitor, what was ignored and why, and what still fits in the free tier. With `apply=1` it is all or nothing, under the same rules as `POST /api/endpoints`. Comments, variables and `@reboot` are ignored (there is no way to know when to expect a reboot); `@daily` and friends become the equivalent expression. The command becomes the monitor name, with passwords and tokens redacted first — the name travels in the alert e-mail, in the public dashboard and in the badge. Returns: { applied, recognized, ignored, existing, would_create, created?, free_tier } Example: crontab -l | curl -s -XPOST "$ORIGIN/api/import/crontab?apply=1" -H "X-Guest-Token: $HP" -H "content-type: text/plain" --data-binary @- Errors: 400: `crontab_sem_agenda` — no schedule line was recognised.; 401: No credential, or an invalid one. See this endpoint's auth.; 402: Payment required. The x402 terms (USDC on Base) come in the `PAYMENT-REQUIRED` header and in `accepts[]`: pay and repeat the same call with `PAYMENT-SIGNATURE` (x402 v2) or `X-PAYMENT` (v1). A standard x402 client such as `@x402/fetch` does this for you.

Discovered
ingest_key

Returns (minting the first time) the key for /in/<key>/<slug>, where a ping creates its own monitor inside the free tier. Instruments a whole fleet with no setup call per job. One key per owner. Point a whole fleet at `/in/<key>/<slug>` and each job creates its monitor on the first check-in, **inside the free tier** — beyond it the ping answers 402 without creating anything. The key survives signing in: the crontab you deployed keeps working.

Discovered
ingest_key_rotate

Rotates the ingest key; the previous one stops creating monitors. Existing ones keep working. Monitors already created keep working — rotating only revokes the power to create new ones.

Discovered
list_endpoints

Lists the guest's/session's endpoints.

Discovered
list_events

Latest ingest pings.

Discovered
list_plans

The plans for sale, with price and term, and the account's active plan. Each purchase lasts 30 days, with no automatic renewal. Each purchase lasts 30 days, with no automatic renewal. Without an account or wallet credential, `account` is `null`.

Discovered
list_sites

The state of every site you monitor (up, down, waiting, paused), with the last check. The same answer is the snapshot of the live subscription (`/api/realtime/`): after it, every check arrives as an event, so a screen never has to poll.

Discovered
list_templates

Ingest snippets and the JSON HookPulse POSTs on a miss. It exists so nobody guesses the alert format: `miss_json` and `recovery_json` here are the same bodies that arrive at your `alert_url`. Slack and Discord receive only the field they read.

Discovered
ping_ingest

Simulates the cron: GET on /in/:id. No credential on purpose — the caller is a cron, and the ID is already the secret. It costs nothing and there is no quota per ping.

Discovered
ping_slug

Create a monitor on its first check-in. The same slug uses the same monitor. Service and billing limits apply. A rejected creation writes no monitor or event. The slug becomes the monitor name and its identity: the same slug always means the same monitor, so a retry never creates a second one. Normalised to lowercase, `[a-z0-9-]`, 40 chars. Creation happens **only inside the free tier** (or the trial); past it the ping is a 402 with `accepts[]` and nothing is written — not even the event. Works by GET or POST. Returns: { ok, endpoint_id, created } Example: curl -fsS "$ORIGIN/in/$INGEST_KEY/nightly-backup?cron=0%203%20*%20*%20*&tz=UTC&grace_sec=900" Errors: 400: `slug_invalido` — nothing usable left after normalising. With `cron`: `cron_invalido`, `tz_invalida`, `grace_invalido` or `cron_sem_ocorrencia`.; 402: The free tier is full: pay and repeat, or delete a monitor.; 404: Unknown or rotated ingest key.

Discovered
pricing

Read current free allowances, options with billing off, prices and the account's 7-day trial. E-mail alerts cost $0.10 once per additional monitor, even with a reused address. Check before creating the second monitor or lowering the interval: it is the number IN FORCE, not the documentation's. After the account's trial, alerts come from the ten oldest monitors and from each extra monitor that was paid for; the other monitors need a plan for alerts (`GET /api/plans`).

Discovered
signal_exit_code

The shell exit status: 0 behaves like a ping, 1-255 record the code as a failure. `curl -fsS $ORIGIN/in/ID/$?` at the end of a script is the whole integration. `0` behaves exactly like a plain ping; 1 to 255 record the code and leave the failure for the cron.

Discovered
signal_fail

Record a failed run. The next five-minute check sends the alert with reason fail. The monitor's alert_repeat_sec controls repeated alerts; the default is 24 hours. Failing is not proof of life either: the clock keeps running. The ingest never sends e-mail and never calls out — it records `alert_pending` and the cron turns it into an alert with `reason: "fail"` within 5 minutes, under the same one-per-24h cap. Works by GET or POST.

Discovered
signal_slug

Send start, fail or an exit code by name, with the ingest key; the first signal of a new name creates its monitor. The same signals as `/in/:id/start`, `/in/:id/fail` and `/in/:id/:exit_code`, for a fleet that only knows the ingest key: the job sends its name, not the monitor id. The first signal of a new name creates the monitor, with the same rules and the same `cron`, `tz` and `grace_sec` as the plain ping by name.

Discovered
signal_start

Says the run STARTED. Does not clear the dead-man clock: a routine that starts and hangs still becomes a miss. The next success records the duration. `start` is not proof of life: it does not move `last_event_at` and does not clear the miss counter, so a routine that starts and hangs still becomes a miss at the right time. The next success closes the run and records `last_duration_ms` — pass `?rid=` on both ends when runs can overlap, or the duration is measured against the wrong start. With `max_duration_sec` set on the monitor, a run left open past that ceiling alerts with `reason: "too_long"` on the next 5-minute check. Works by GET or POST.

Discovered
status_feed_rotate

Rotates the status feed token; the previous URL stops working.

Discovered
status_feed_url

Public URL (JSON and RSS) with the status of all the owner's endpoints. The feed token only reads status: it does not create, change or delete. Whoever has the link sees the dashboard — treat it as a secret.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected891 ms29