Skip to main content
Glama
adelaidasofia

paging-mcp

paging-mcp

FastMCP server that pages on-call via 100+ notification channels. Built on top of Apprise, which speaks WhatsApp, ntfy, Pushover, Telegram, Discord, Slack, Signal, Matrix, Gotify, mailto, Twilio SMS, AWS SNS, and dozens more.

The 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.

Why this exists

If 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:

  1. Multiple channels in parallel so a single provider outage doesn't lose the page.

  2. 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).

  3. Credentials redacted in tool responses so an agent reading the output doesn't leak them back into a transcript.

  4. One MCP your agent can call from anywhere (Claude Code, Codex, Cursor, etc.) without having to ship a new MCP per channel.

Apprise solves channels 1-2 in Python. This server makes it MCP-callable with redaction and channel filtering on top.

Related MCP server: mcp-gotify

Install

Open Claude Code, paste:

/plugin marketplace add adelaidasofia/paging-mcp
/plugin install paging-mcp@paging-mcp
git clone https://github.com/adelaidasofia/paging-mcp ~/.claude/paging-mcp
cd ~/.claude/paging-mcp
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt

Configure

Set APPRISE_URLS to one or more Apprise URLs. Newline, semicolon, or comma separated:

export APPRISE_URLS="
ntfys://ntfy.sh/<your-secret-topic>
whapi+https://gate.whapi.cloud/messages/text?token=<TOKEN>&to=+57...
pover://<USER_KEY>@<APP_TOKEN>
mailto://user:pass@smtp.example.com/?to=alerts@example.com
"

Apprise URL examples by provider:

Provider

URL pattern

WhatsApp Business (Whapi)

whapi+https://gate.whapi.cloud/messages/text?token=<TOKEN>&to=<+E164>

ntfy

ntfys://ntfy.sh/<topic>

Pushover

pover://<USER_KEY>@<APP_TOKEN>

Telegram bot

tgram://<BOT_TOKEN>/<CHAT_ID>

Twilio SMS

twilio://<SID>:<TOKEN>@<FROM>/<TO>

Signal CLI

signal://<from>@<api-host>/<to>

Slack incoming webhook

slack://<token-a>/<token-b>/<token-c>

Discord webhook

discord://<webhook-id>/<webhook-token>

SMTP email

mailto://<user>:<pass>@<host>:<port>/?to=<dest>

AWS SNS

sns://<KEY>/<SECRET>/<REGION>/<TOPIC>

Full list: https://github.com/caronc/apprise/wiki

Register with Claude Code

Project-scoped (<vault>/.mcp.json):

{
  "mcpServers": {
    "paging": {
      "command": "/Users/<you>/.claude/paging-mcp/.venv/bin/python",
      "args": ["/Users/<you>/.claude/paging-mcp/server.py"],
      "env": {
        "APPRISE_URLS": "ntfys://ntfy.sh/<your-secret-topic>"
      }
    }
  }
}

User-scoped:

claude mcp add -s user paging \
  /Users/<you>/.claude/paging-mcp/.venv/bin/python \
  /Users/<you>/.claude/paging-mcp/server.py \
  --env APPRISE_URLS="ntfys://ntfy.sh/<your-secret-topic>"

Restart Claude Code. Verify with claude mcp list.

Tools

Tool

What it does

health_check

Server self-check + Apprise version + configured channel count.

list_configured_channels

Lists the channels paging-mcp will dispatch to, credentials redacted.

notify(title, body, severity, channels?)

Sends a notification to all configured channels (or a subset filter on redacted URL). Returns per-channel results.

notify_one(url, title, body, severity)

Sends to a single ad-hoc Apprise URL (not persisted).

dry_run(title, body, severity)

Shows what notify() would send, without dispatching.

severity is one of info, success, warning, failure. Channels that color or icon-tag use it.

Tests

.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest tests/ -v

16 unit + integration tests covering URL redaction, multi-channel dispatch, partial failure, channel filtering, and end-to-end paging flow with credentials in URLs.

Security notes

  • Credentials are never echoed in tool responses. Path-as-secret schemes (ntfy, pushbullet, pover) get their last path segment masked too.

  • 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.

  • The server does not persist channels or messages; everything is in-process.

Telemetry

This plugin sends a single anonymous install signal to myceliumai.co the first time it loads in a Claude Code session on a given machine.

What is sent:

  • Plugin name (e.g. slack-mcp)

  • Plugin version (e.g. 0.1.0)

What is NOT sent:

  • No user identifiers, names, emails, tokens, or API keys

  • No file paths, message content, or anything from your work

  • No IP address is stored after dedup processing

Why: Helps the maintainer know which plugins people actually install, so attention goes to the ones that get used.

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.

License

MIT — see LICENSE.


Built by Mycelium AI. Full install or team version at diazroa.com.

Available Tools

5 tools
dry_runB

Show what notify() would send, without dispatching.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
titleYes
severityNowarning

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It accurately notes that no dispatch occurs, but does not disclose any other behavioral aspects like simulation behavior or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded, with no wasted words. However, it borders on under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters, a missing output schema explanation, and five sibling tools, the description is insufficient to fully guide the agent without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no information about the parameters (body, title, severity) despite 0% schema description coverage, leaving the agent to guess their meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it shows the output of `notify()` without actually dispatching, distinguishing it from the actual notify tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage as a preview mechanism, but it does not explicitly state when to use or when not to use it, nor does it mention alternatives beyond the sibling tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

health_checkA

Server self-check + channel inventory.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions self-check and inventory, implying read-only behavior, but does not explicitly state side effects or what exactly is checked. With no annotations, more detail would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise, two aspects covered in one short sentence with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While output schema exists and no input params, the description does not explain how health_check differs from list_configured_channels or what 'inventory' entails. Slightly incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description does not need to add param info beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Server self-check + channel inventory' clearly states the tool performs a health check and lists channels. It is distinct from sibling tools that focus on listing, notifying, or dry runs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use or avoid. The purpose is implied but lacks details about prerequisites or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_configured_channelsA

List the channels paging-mcp will dispatch to, with credentials redacted.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that credentials are redacted, which is an important behavioral detail. However, it does not mention ordering, pagination, or whether the list is complete, but given the simplicity, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that conveys the essential information without any waste. It is appropriately sized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, an existing output schema, and distinct sibling tools, the description is fully sufficient. It explains the output content (channels with redacted credentials) and the tool's purpose, leaving no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and schema coverage is 100%, so the description does not need to add parameter information. The baseline for 0 parameters is 4, and the description adds no extra semantics, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists channels and includes a key detail about credentials being redacted. The verb 'list' and resource 'channels' are precise, and it naturally distinguishes from sibling tools like notify and health_check which perform different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating the action, but does not explicitly guide when to use this tool over alternatives or mention any preconditions. Since siblings have distinct purposes (e.g., notifying, health checking), the context is clear but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notifyA

Send a notification to all configured channels.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body. Most channels accept plain text or markdown.
titleYesShort subject line shown by channels that support titles.
channelsNoOptional subset of redacted URL prefixes to filter to. If omitted, dispatches to every configured channel.
severityNo"info" | "success" | "warning" | "failure". Some channels color or icon-tag based on this; default "warning".warning

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, placing the full burden on description. The description states it sends a notification, but omits potential side effects (e.g., external calls, rate limits, persistence). It is adequate but lacks depth for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is very concise, but underspecified. Could include more context (e.g., that it dispatches to all channels or uses defaults). Still, it is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and presence of output schema, the description covers the essential purpose. It is complete enough for an agent to understand the action, though slightly more context about behavior would improve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not add parameter information beyond the schema, which is sufficient. No additional semantic value is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Send' and resource 'notification to all configured channels'. It distinguishes from sibling tool 'notify_one' by specifying 'all configured channels'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for broadcasting to all channels, but does not explicitly state when to use this tool versus alternatives like 'notify_one' or 'dry_run'. However, sibling names and context make the use case reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notify_oneA

Send a notification to a single ad-hoc Apprise URL (not persisted).

Useful for one-off pages where the channel isn't in APPRISE_URLS.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
bodyYes
titleYes
severityNowarning

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior. It states that notifications are not persisted, which is a key behavioral trait. However, it does not mention error handling, rate limits, or whether the tool is synchronous. The existence of an output schema suggests a return value, but the description omits any discussion of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the core purpose in the first sentence and usage guidance in the second. Every word adds value, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the description covers purpose and usage context. However, it omits parameter semantics (despite low schema coverage) and does not explain the output format, even though an output schema exists. For a tool with 4 parameters and no schema descriptions, the description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description does not explain individual parameters. It only loosely associates 'ad-hoc Apprise URL' with the 'url' parameter, but provides no details on formats, allowed values for 'severity', or the role of 'body' and 'title'. The description fails to compensate for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool sends a notification to a single ad-hoc Apprise URL and notes that it is not persisted. This distinguishes it from siblings like 'notify' (persisted channels) and 'dry_run' (testing), providing a specific verb-resource-scope combination.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Useful for one-off pages where the channel isn't in `APPRISE_URLS`', giving clear context for when to use this tool. It implies the alternative 'notify' for persisted channels, though it does not name the sibling directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observeddry_run
    • First observedhealth_check
    • First observedlist_configured_channels
    • First observednotify
    • First observednotify_one

TDQS

A3.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: health_check for server status, list_configured_channels for viewing channels, notify for broadcasting, notify_one for sending to a single URL, and dry_run for previewing. No overlap in functionality.

Naming Consistency4/5

Names are consistent in using lowercase with underscores, and most follow a verb_noun pattern (list_configured_channels, notify, notify_one, dry_run). health_check is a compound noun but still clear. Minor deviation in verb usage (health_check vs. notify) keeps it from a perfect score.

Tool Count5/5

With 5 tools, the server is well-scoped for a paging/notification service. Each tool addresses a necessary operation (health, listing, sending, sending to one, dry run) without redundancy or excessive count.

Completeness4/5

Covers core functionality: health check, channel listing, broadcasting, single notification, and preview. Lacks a tool to manage persistent channels or retrieve notification history, but these are minor gaps given the server's focus on dispatching notifications.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the Splunk On-Call (VictorOps) API providing comprehensive incident management, on-call schedules, team administration, and alert reporting through natural language.
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    MCP server for sending Gotify push notifications to your devices.
    1
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    MCP server for sending notifications to ntfy.sh or self-hosted ntfy instances.
    2
    19
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    A lightweight MCP server for sending push notifications via ntfy.sh, supporting customizable titles, priorities, tags, and action buttons.
    1
    10
    6
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/adelaidasofia/paging-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server