Server definition
- Hash
- sha256:66707304f0858007a9a431d925ccefed5713876b26dde3172b1f0e554a4ddb97
- What it is
- What a remote MCP server returned when asked what it offers: 7 tools
The blob, as servednamed by its sha256
{
"instructions": "Cronping is a free dead-man's-switch heartbeat monitor for AI agents, autonomous loops, workers, and cron jobs. Instead of pinging you when a job runs, it alerts when an expected ping STOPS arriving — so you catch a job (or an agent) that silently died, hung, or was never scheduled, even when nothing threw an error.\n\nCore idea: your job sends one HTTP GET to its unique ping URL AFTER it finishes its work successfully. If Cronping doesn't hear from it within period+grace seconds, it flags the check DOWN and emails the alert address. Ping the URL with /fail appended to actively report a failure.\n\nQuickstart (one call): call create_heartbeat with { name, period_seconds, grace_seconds, email } — it returns a ping_url, a claim_token, and a public status/badge URL. Have your job curl the ping_url on every successful cycle. That's it — no account or signup required.\n\nLifecycle tools: create_heartbeat, ping_heartbeat, get_heartbeat_status, set_heartbeat_alert (change email/period/grace), pause_heartbeat (silence during planned maintenance, then resume), delete_heartbeat (remove ephemeral checks so they can't leak stale DOWN alerts — needs the claim_token), import_crontab (arm monitors from a pasted crontab).\n\nTip for agents: arm a heartbeat on your own main loop and ping it after each completed iteration — if your loop exits, OOMs, or wedges, Cronping notices the silence and alerts even though your process never logged an error. Built and operated by an autonomous AI agent.",
"tools": [
{
"description": "Create a Cronping heartbeat monitor (dead-man's-switch). Returns a ping_url to call on each successful run of your agent loop, worker, or cron job, plus a claim_token to manage it. If pings stop arriving within period+grace, Cronping raises an alert. No account required. After creating, send one verification ping (call ping_heartbeat with the returned id) to confirm setup — the check flips from 'new' to UP so you know it's wired correctly. Alternatively, pass pull_url to make a PULL check: Cronping fetches that URL on schedule and alerts if it fails — for targets that can't call a ping URL (a health endpoint, status page, or API).",
"inputSchema": {
"properties": {
"email": {
"description": "Email address for DOWN and recovery alerts. STRONGLY RECOMMENDED — without an email or webhook_url, Cronping tracks status but cannot notify anyone when the job stops, which defeats the purpose. Use your operator's email.",
"type": "string"
},
"grace_seconds": {
"description": "Extra slack before marking DOWN, in seconds. Default 3600.",
"type": "number"
},
"name": {
"description": "Label for what is monitored, e.g. \"nightly-backup\" or \"research-agent-loop\".",
"type": "string"
},
"period_seconds": {
"description": "How often you expect a ping, in seconds (min 60). Default 86400 (daily).",
"type": "number"
},
"pull_contains": {
"description": "Optional (pull checks only). The fetched response body must contain this text to count as UP; otherwise Cronping alerts.",
"type": "string"
},
"pull_url": {
"description": "Optional. If set, creates a PULL check instead: Cronping itself fetches this URL every period_seconds and alerts if it fails — use for a target that can't call a ping URL (a public health endpoint, status page, or API). No ping needed.",
"type": "string"
},
"stuck_after": {
"description": "Optional. Flip to STUCK if the progress_token passed to ping_heartbeat stays identical for this many consecutive runs (default 3, 0 disables). Catches zombie runs that keep pinging but make no progress.",
"type": "number"
},
"webhook_url": {
"description": "https webhook (Slack/Discord/generic) for DOWN and recovery alerts. Set this OR email so someone is actually notified when the monitored job goes silent.",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_heartbeat",
"outputSchema": null
},
{
"description": "Permanently delete a Cronping heartbeat monitor and all its events. Use this to tear down an ephemeral check your agent created (e.g. at shutdown, or after a one-off job) so it stops being monitored and can never raise a stale DOWN alert. Requires the claim_token returned by create_heartbeat. This is irreversible — the id and ping_url stop working immediately. To silence a check temporarily instead of deleting it, use pause_heartbeat.",
"inputSchema": {
"properties": {
"claim_token": {
"description": "The claim_token returned by create_heartbeat.",
"type": "string"
},
"id": {
"description": "The check id returned by create_heartbeat.",
"type": "string"
}
},
"required": [
"id",
"claim_token"
],
"type": "object"
},
"name": "delete_heartbeat",
"outputSchema": null
},
{
"description": "Get the live status of a Cronping check (up/down/new, last ping time, ping count, and whether an alert channel is set).",
"inputSchema": {
"properties": {
"claim_token": {
"description": "The claim_token returned by create_heartbeat.",
"type": "string"
},
"id": {
"type": "string"
}
},
"required": [
"id",
"claim_token"
],
"type": "object"
},
"name": "get_heartbeat_status",
"outputSchema": null
},
{
"description": "Arm a dead-man's-switch for EVERY line of a crontab in one call. Paste raw crontab text; Cronping parses each schedule, derives the expected interval from the cron expression itself (using the longest gap between runs so weekend/twice-daily schedules don't false-alarm), and creates one heartbeat monitor per job. Returns, for each line, a ping_url plus the same command with `&& curl -fsS <ping_url>` already appended so you can drop it straight back into the crontab. Also anchors each new check's first deadline to the schedule's real next run — so a fresh switch neither pages at t=0 nor sleeps a full period. No account required. Ideal when an agent or operator wants to instrument a whole box's scheduled jobs at once. Up to 20 lines per call. Lines with no fixed interval (e.g. @reboot) are skipped.",
"inputSchema": {
"properties": {
"crontab": {
"description": "Raw crontab text, one job per line (comments and FOO=bar env lines are ignored). Standard 5-field expressions plus @daily/@hourly/@weekly/@monthly/@yearly macros and named days/months are supported.",
"type": "string"
},
"email": {
"description": "Optional. Email address for DOWN and recovery alerts, applied to every check created. STRONGLY RECOMMENDED — without it the checks track status but cannot notify anyone.",
"type": "string"
}
},
"required": [
"crontab"
],
"type": "object"
},
"name": "import_crontab",
"outputSchema": null
},
{
"description": "Pause or resume monitoring on an existing Cronping check without deleting it. Pause during planned maintenance or a known downtime window so a silent job does not raise a false DOWN alert; resume to re-arm the dead-man's-switch. While paused, missed pings are ignored and no alerts fire. Requires the claim_token returned by create_heartbeat.",
"inputSchema": {
"properties": {
"claim_token": {
"description": "The claim_token returned by create_heartbeat.",
"type": "string"
},
"id": {
"description": "The check id returned by create_heartbeat.",
"type": "string"
},
"paused": {
"description": "true to pause monitoring, false to resume it. Defaults to true.",
"type": "boolean"
}
},
"required": [
"id",
"claim_token"
],
"type": "object"
},
"name": "pause_heartbeat",
"outputSchema": null
},
{
"description": "Send a heartbeat signal to a Cronping check. signal=\"success\" (default) marks it UP and resets the timer; \"start\" records that a run began (for duration); \"fail\" marks it DOWN immediately and alerts. Optionally pass progress_token (a digest of your run's actual output) on success pings: if the same token repeats for several consecutive runs, the check flips to STUCK — catching a \"zombie\" job that keeps pinging on schedule while its real work has stalled.",
"inputSchema": {
"properties": {
"id": {
"description": "The check id returned by create_heartbeat.",
"type": "string"
},
"progress_token": {
"description": "Optional. A short digest/hash of this run's output (e.g. last-processed id, row count, content hash). If it stays identical across stuck_after consecutive runs, the check flips to STUCK and alerts.",
"type": "string"
},
"signal": {
"description": "success | start | fail. Default success.",
"enum": [
"success",
"start",
"fail"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "ping_heartbeat",
"outputSchema": null
},
{
"description": "Add or change the alert channel on an EXISTING Cronping check (use this instead of creating a duplicate). Sets the email and/or webhook (Slack/Discord/generic https) that Cronping notifies when the monitor goes silent or recovers. Without an alert channel a check tracks status but can't warn you — call this once per check to make the dead-man's-switch actually protect you.",
"inputSchema": {
"properties": {
"claim_token": {
"description": "The claim_token returned by create_heartbeat.",
"type": "string"
},
"email": {
"description": "Email address to notify (e.g. the operator/owner). Pass empty string to clear.",
"type": "string"
},
"id": {
"description": "The check id returned by create_heartbeat.",
"type": "string"
},
"webhook_url": {
"description": "Optional https webhook (Slack/Discord/generic) to notify. Pass empty string to clear.",
"type": "string"
}
},
"required": [
"id",
"claim_token"
],
"type": "object"
},
"name": "set_heartbeat_alert",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:66707304f0858007a9a431d925ccefed5713876b26dde3172b1f0e554a4ddb97 | sha256sum