{
  "markdown": "# paging-mcp\n\n\n<!-- mycelium-badges:start -->\n\n<p>\n  <a href=\"https://github.com/adelaidasofia/paging-mcp/blob/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/github/license/adelaidasofia/paging-mcp?color=blue\"></a>\n  <a href=\"https://github.com/adelaidasofia/paging-mcp/stargazers\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/adelaidasofia/paging-mcp?color=eab308\"></a>\n  <a href=\"https://github.com/adelaidasofia/paging-mcp/commits/main\"><img alt=\"Last commit\" src=\"https://img.shields.io/github/last-commit/adelaidasofia/paging-mcp\"></a>\n  <a href=\"https://github.com/adelaidasofia/paging-mcp/issues\"><img alt=\"Open issues\" src=\"https://img.shields.io/github/issues/adelaidasofia/paging-mcp\"></a>\n  <a href=\"https://pypi.org/project/adelaidasofia-paging-mcp/\"><img alt=\"PyPI version\" src=\"https://img.shields.io/pypi/v/adelaidasofia-paging-mcp?color=blue&label=pypi\"></a>\n  <a href=\"https://pypi.org/project/adelaidasofia-paging-mcp/\"><img alt=\"PyPI downloads\" src=\"https://img.shields.io/pypi/dm/adelaidasofia-paging-mcp?color=blue&label=downloads\"></a>\n  <a href=\"https://myceliumai.co\"><img alt=\"Built by Mycelium AI\" src=\"https://img.shields.io/badge/built_by-Mycelium_AI-15B89A\"></a>\n</p>\n\n<!-- mycelium-badges:end -->\n\nFastMCP server that pages on-call via 100+ notification channels. Built on top of [Apprise](https://github.com/caronc/apprise), which speaks WhatsApp, ntfy, Pushover, Telegram, Discord, Slack, Signal, Matrix, Gotify, mailto, Twilio SMS, AWS SNS, and dozens more.\n\nThe point is **provider independence**. Wire one MCP, configure as many channels as you want, get redundant paging without rewriting integration code every time you swap a vendor.\n\n## Why this exists\n\nIf you're building anything that needs to wake a human up — a synthetic monitor on a B2B pipeline, a long-running batch job, a security alert — you want:\n\n1. Multiple channels in parallel so a single provider outage doesn't lose the page.\n2. Channels that actually fit your operator (WhatsApp for LatAm on-calls, ntfy for self-hosters, Pushover for personal phones, Twilio SMS for the cases where it still fits).\n3. Credentials redacted in tool responses so an agent reading the output doesn't leak them back into a transcript.\n4. One MCP your agent can call from anywhere (Claude Code, Codex, Cursor, etc.) without having to ship a new MCP per channel.\n\nApprise solves channels 1-2 in Python. This server makes it MCP-callable with redaction and channel filtering on top.\n\n## Install\n\nOpen Claude Code, paste:\n\n    /plugin marketplace add adelaidasofia/paging-mcp\n    /plugin install paging-mcp@paging-mcp\n\n<details><summary>Legacy install</summary>\n\n```bash\ngit clone https://github.com/adelaidasofia/paging-mcp ~/.claude/paging-mcp\ncd ~/.claude/paging-mcp\npython3 -m venv .venv\n.venv/bin/pip install -r requirements.txt\n```\n\n</details>\n\n## Configure\n\nSet `APPRISE_URLS` to one or more [Apprise URLs](https://github.com/caronc/apprise/wiki). Newline, semicolon, or comma separated:\n\n```bash\nexport APPRISE_URLS=\"\nntfys://ntfy.sh/<your-secret-topic>\nwhapi+https://gate.whapi.cloud/messages/text?token=<TOKEN>&to=+57...\npover://<USER_KEY>@<APP_TOKEN>\nmailto://user:pass@smtp.example.com/?to=alerts@example.com\n\"\n```\n\nApprise URL examples by provider:\n\n| Provider | URL pattern |\n|---|---|\n| WhatsApp Business (Whapi) | `whapi+https://gate.whapi.cloud/messages/text?token=<TOKEN>&to=<+E164>` |\n| ntfy | `ntfys://ntfy.sh/<topic>` |\n| Pushover | `pover://<USER_KEY>@<APP_TOKEN>` |\n| Telegram bot | `tgram://<BOT_TOKEN>/<CHAT_ID>` |\n| Twilio SMS | `twilio://<SID>:<TOKEN>@<FROM>/<TO>` |\n| Signal CLI | `signal://<from>@<api-host>/<to>` |\n| Slack incoming webhook | `slack://<token-a>/<token-b>/<token-c>` |\n| Discord webhook | `discord://<webhook-id>/<webhook-token>` |\n| SMTP email | `mailto://<user>:<pass>@<host>:<port>/?to=<dest>` |\n| AWS SNS | `sns://<KEY>/<SECRET>/<REGION>/<TOPIC>` |\n\nFull list: https://github.com/caronc/apprise/wiki\n\n## Register with Claude Code\n\nProject-scoped (`<vault>/.mcp.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"paging\": {\n      \"command\": \"/Users/<you>/.claude/paging-mcp/.venv/bin/python\",\n      \"args\": [\"/Users/<you>/.claude/paging-mcp/server.py\"],\n      \"env\": {\n        \"APPRISE_URLS\": \"ntfys://ntfy.sh/<your-secret-topic>\"\n      }\n    }\n  }\n}\n```\n\nUser-scoped:\n\n```bash\nclaude mcp add -s user paging \\\n  /Users/<you>/.claude/paging-mcp/.venv/bin/python \\\n  /Users/<you>/.claude/paging-mcp/server.py \\\n  --env APPRISE_URLS=\"ntfys://ntfy.sh/<your-secret-topic>\"\n```\n\nRestart Claude Code. Verify with `claude mcp list`.\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `health_check` | Server self-check + Apprise version + configured channel count. |\n| `list_configured_channels` | Lists the channels paging-mcp will dispatch to, credentials redacted. |\n| `notify(title, body, severity, channels?)` | Sends a notification to all configured channels (or a subset filter on redacted URL). Returns per-channel results. |\n| `notify_one(url, title, body, severity)` | Sends to a single ad-hoc Apprise URL (not persisted). |\n| `dry_run(title, body, severity)` | Shows what `notify()` would send, without dispatching. |\n\n`severity` is one of `info`, `success`, `warning`, `failure`. Channels that color or icon-tag use it.\n\n## Tests\n\n```bash\n.venv/bin/pip install -e \".[dev]\"\n.venv/bin/python -m pytest tests/ -v\n```\n\n16 unit + integration tests covering URL redaction, multi-channel dispatch, partial failure, channel filtering, and end-to-end paging flow with credentials in URLs.\n\n## Security notes\n\n- Credentials are never echoed in tool responses. Path-as-secret schemes (ntfy, pushbullet, pover) get their last path segment masked too.\n- `notify_one` accepts an ad-hoc URL; agents passing literal credentials are still responsible for not echoing them in conversation. Prefer `APPRISE_URLS` configured at server start.\n- The server does not persist channels or messages; everything is in-process.\n\n\n## Telemetry\n\nThis plugin sends a single anonymous install signal to `myceliumai.co` the first time it loads in a Claude Code session on a given machine.\n\n**What is sent:**\n- Plugin name (e.g. `slack-mcp`)\n- Plugin version (e.g. `0.1.0`)\n\n**What is NOT sent:**\n- No user identifiers, names, emails, tokens, or API keys\n- No file paths, message content, or anything from your work\n- No IP address is stored after dedup processing\n\n**Why:** Helps the maintainer know which plugins people actually install, so attention goes to the ones that get used.\n\n**Opt out:** Set the environment variable `MYCELIUM_NO_PING=1` before launching Claude Code. The hook will skip the network call entirely. Already-pinged installs leave a sentinel at `~/.mycelium/onboarded-<plugin>` — delete it if you want to reset state.\n\n## License\n\nMIT — see `LICENSE`.\n\n---\n\nBuilt by [Mycelium AI](https://myceliumai.co). Full install or team version at [diazroa.com](https://diazroa.com).\n",
  "bytes": 6918,
  "sha": "18cc55744c01dfa21134bdd85a9b805f8cf45578c39e3a48a37ed26b30f18f80",
  "repo_slug": "adelaidasofia/paging-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_adelaidasofia_paging_mcp_paging_mcp_7025853d/readme"
}