Dead Man's Snitch MCP by usefulapi

Read Dead Man's Snitch monitors and status; create, tag, pause and unpause snitches.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
80%
Poisoning risk
60%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin deadmanssnitch_get_snitch
  • MEDIUMTool description contains URL to non-standard domainin deadmanssnitch_create_snitch

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,300Tokens (tool definitions)
~1.9 KBTypical response size
Moderate attention impact (1.80% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "dead-mans-snitch": {
      "url": "https://dead-mans-snitch.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://dead-mans-snitch.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢deadmanssnitch_list_snitches(tags, status)

List the snitches (cron/heartbeat monitors) of the account with status (pending, healthy, failed, errored, paused), interval, alert type, tags and last check-in. Tokens are masked (the token is also the check-in secret); pass the masked token or the name to the other snitch tools. The API has no paging: all snitches come back. Optionally filter by tags (must have all) or status. GET /v1/snitches.

Input Schema

{
  "type": "object",
  "properties": {
    "tags": {
      "description": "Only snitches that have ALL of these tags.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100,
        "description": "A tag."
      }
    },
    "status": {
      "description": "Only snitches in this status (filtered here).",
      "type": "string",
      "enum": [
        "pending",
        "healthy",
        "failed",
        "errored",
        "paused"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢deadmanssnitch_get_snitch(snitch)

One snitch with its full details, including the check-in URL (https://nosnch.in/<token>). The check-in URL is a secret: anyone who has it can check in and so silence the alert; share it only where the job runs. GET /v1/snitches/{token}.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    }
  },
  "required": [
    "snitch"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡deadmanssnitch_create_snitch(name, interval, alert_type, alert_email, notes, ...)

WRITE: create a new snitch (monitor). Returns it with its check-in URL (https://nosnch.in/<token>), which the job must call on every run; keep it secret. Fails with 402 when the plan's snitch limit is reached. POST /v1/snitches.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Name of the snitch."
    },
    "interval": {
      "type": "string",
      "enum": [
        "1_minute",
        "2_minute",
        "3_minute",
        "5_minute",
        "10_minute",
        "15_minute",
        "30_minute",
        "hourly",
        "2_hour",
        "3_hour",
        "4_hour",
        "6_hour",
        "8_hour",
        "12_hour",
        "daily",
        "weekly",
        "monthly"
      ],
      "description": "Expected check-in frequency. The *_minute values are only available on the Basic plan; weekly = Monday to Monday."
    },
    "alert_type": {
      "description": "Default basic.",
      "type": "string",
      "enum": [
        "basic",
        "smart"
      ]
    },
    "alert_email": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 254,
        "format": "email",
        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      },
      "description": "Email addresses that get this snitch's alerts instead of all team members (max 10; this limit is ours, not the vendor's). An empty list clears the override."
    },
    "notes": {
      "type": "string",
      "maxLength": 5000,
      "description": "Free-text notes."
    },
    "tags": {
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100,
        "description": "A tag."
      }
    }
  },
  "required": [
    "name",
    "interval"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴deadmanssnitch_update_snitch(snitch, name, interval, alert_type, alert_email, ...)

WRITE: change a snitch. Only the fields you pass change. `tags` REPLACES the whole tag list (use deadmanssnitch_add_tags to add) and `alert_email` replaces the alert recipients (an empty list = all team members). Returns the updated snitch with the token masked. PATCH /v1/snitches/{token}.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    },
    "name": {
      "description": "New name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "interval": {
      "type": "string",
      "enum": [
        "1_minute",
        "2_minute",
        "3_minute",
        "5_minute",
        "10_minute",
        "15_minute",
        "30_minute",
        "hourly",
        "2_hour",
        "3_hour",
        "4_hour",
        "6_hour",
        "8_hour",
        "12_hour",
        "daily",
        "weekly",
        "monthly"
      ],
      "description": "Expected check-in frequency. The *_minute values are only available on the Basic plan; weekly = Monday to Monday."
    },
    "alert_type": {
      "type": "string",
      "enum": [
        "basic",
        "smart"
      ],
      "description": "basic = fixed deadline; smart = learns when the job usually checks in and alerts earlier."
    },
    "alert_email": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 254,
        "format": "email",
        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      },
      "description": "Email addresses that get this snitch's alerts instead of all team members (max 10; this limit is ours, not the vendor's). An empty list clears the override."
    },
    "notes": {
      "description": "New notes; null clears them.",
      "anyOf": [
        {
          "type": "string",
          "maxLength": 5000,
          "description": "Free-text notes."
        },
        {
          "type": "null"
        }
      ]
    },
    "tags": {
      "description": "The complete new tag list (replaces the old one; [] removes all tags).",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100,
        "description": "A tag."
      }
    }
  },
  "required": [
    "snitch"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡deadmanssnitch_add_tags(snitch, tags)

WRITE: add one or more tags to a snitch, keeping the existing ones. Returns the snitch's full tag list. POST /v1/snitches/{token}/tags.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    },
    "tags": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100,
        "description": "A tag."
      }
    }
  },
  "required": [
    "snitch",
    "tags"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴deadmanssnitch_remove_tag(snitch, tag)

WRITE: remove one tag from a snitch (the snitch itself is untouched). Returns the remaining tags. DELETE /v1/snitches/{token}/tags/{tag}.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    },
    "tag": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "A tag."
    }
  },
  "required": [
    "snitch",
    "tag"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴deadmanssnitch_pause_snitch(snitch, until)

WRITE: pause a snitch, which SILENCES its alerts: a job that stops running goes unnoticed while it is paused. `until` says when alerting resumes: 'healthy' (default: on the next healthy check-in), 'unpaused' (stays paused until deadmanssnitch_unpause_snitch) or a future ISO 8601 time. A snitch that has never checked in (pending) cannot be paused. POST /v1/snitches/{token}/pause.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    },
    "until": {
      "description": "'healthy' (default), 'unpaused', or a future ISO 8601 time with timezone, e.g. 2026-10-20T08:00:00Z.",
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    }
  },
  "required": [
    "snitch"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡deadmanssnitch_unpause_snitch(snitch)

WRITE: resume alerting for a paused snitch (safe on a snitch that is not paused). POST /v1/snitches/{token}/unpause.

Input Schema

{
  "type": "object",
  "properties": {
    "snitch": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The snitch: its token, the masked token shown by deadmanssnitch_list_snitches (e.g. ab…yz), or its exact name."
    }
  },
  "required": [
    "snitch"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools