Skip to main content
Glama
slchenchn

notify-mcp

by slchenchn

page-user — proactive push-notification MCP

English | 简体中文

An MCP server that gives any MCP client (Claude Code, Codex CLI, …) a page_user tool. The AI calls it to proactively push a short message to your phone via Telegram — when a long task finishes, a run fails, it needs a decision, or you asked for periodic progress. Each message carries the machine name, which CLI sent it, a session label, and optional tables (rendered aligned).

Claude Code / Codex ── page_user(message, title?, host?, session?, agent?, table?, tag?) ──►
        (just a URL + token in config)                                                       │
                                                                                             ▼
                                              Cloudflare Worker (remote MCP) ──► Telegram

There are two flavors. The Cloudflare remote MCP is recommended; the original self-hosted Apprise gateway is kept as a legacy alternative (see the end).

The whole server is one Cloudflare Worker in cloudflare/ — stateless MCP over Streamable HTTP, bearer auth, pushes straight to Telegram. Nothing runs on your machines; you update every client at once by redeploying.

  1. Deploy the Worker and set its secrets — full step-by-step in cloudflare/README.md. You end up with an endpoint like https://<name>.<subdomain>.workers.dev/mcp and a bearer AUTH_TOKEN.

  2. Register with your CLIs on each machine:

    PAGE_USER_TOKEN=<AUTH_TOKEN> ./scripts/install_page_user.sh

    This removes any old notify server and adds page-user to Claude Code (user scope) and Codex (~/.codex/config.toml), baking in the machine's hostname (X-Host) and the CLI name (X-Agent). Override the endpoint with PAGE_USER_URL if you deployed under a different name.

  3. Verify: claude mcp list (should show page-user … ✔ Connected) and codex mcp list.

Egress: clients must be able to reach *.workers.dev (the default Worker domain is commonly blocked on direct connections — a working HTTP(S) proxy in the environment is enough; the CLIs inherit HTTPS_PROXY). If a machine can't reach *.workers.dev at all, bind a custom domain to the Worker instead.

The tool

page_user(message, title?, host?, session?, agent?, table?, tag?) — pushes a formatted notification. Only message is required; host/agent default to the X-Host/X-Agent headers set at registration, tag selects a recipient group (TARGETS secret), and table is rows of strings rendered as an aligned monospace table. The model learns all of this from the tool's MCP schema — it does not read this README. To change the tool or its guidance, edit cloudflare/worker.js and npx wrangler deploy; all clients pick it up.

Manual registration

# Claude Code (user scope):
claude mcp add --transport http page-user https://<name>.<subdomain>.workers.dev/mcp \
  -H "Authorization: Bearer <AUTH_TOKEN>" -H "X-Host: $(hostname)" -H "X-Agent: claude-code" -s user

# Codex — add to ~/.codex/config.toml:
# [mcp_servers.page-user]
# url = "https://<name>.<subdomain>.workers.dev/mcp"
# http_headers = { "Authorization" = "Bearer <AUTH_TOKEN>", "X-Host" = "<host>", "X-Agent" = "codex" }

Related MCP server: ntfy-mcp

Legacy: self-hosted Apprise gateway

The original design is a thin Python MCP wrapper (notify_mcp.py, tool send_notification) that POSTs to a self-hosted Apprise gateway (server.py), which forwards to Telegram/Feishu/etc. Use this if you can't or don't want to use Cloudflare. It is managed with uv:

uv sync --extra gateway       # wrapper + apprise
./scripts/start_gateway.sh    # run the gateway (needs ./token and ./targets.json)
./scripts/install_mcp.sh      # register the `notify` MCP with Claude Code + Codex

Details:

Unit tests (legacy Python code)

uv run pytest -q                 # no network needed
uv run pre-commit run --all-files  # ruff format/lint

Available Tools

1 tool
send_notificationA

Push a short notification to the user's phone (Telegram) via the local gateway.

Use this to proactively reach the user when they may be away from the terminal:
a long-running task finished, a build/training run succeeded or failed, or you
have hit something that needs their decision before you can continue. Do NOT use
it for routine progress chatter or to echo an answer they are clearly watching.

Args:
    message: The notification body. Keep it one line and lead with what they'd
        act on (e.g. "train run failed: OOM at step 1200").
    title: Optional short bold title (e.g. the node or job name).
    tag: Which configured recipient group to send to (default "default").

Returns "ok" on success, or an error string describing why it failed.
ParametersJSON Schema
NameRequiredDescriptionDefault
tagNodefault
titleNo
messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/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 the full burden. It discloses the core behavior (push notification), the return value ('ok' or error string), and implies the action is non-destructive. It could mention potential failure modes (e.g., network issues, gateway unavailability) or idempotency, but for a simple notification tool this is adequate.

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 well-structured: a brief purpose statement followed by usage guidelines, then parameter descriptions. It is concise with no wasted words, and each sentence adds value.

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 the tool's simplicity (3 parameters, 1 required), the description fully covers what the agent needs: purpose, when to use, parameter semantics, and return value. No output schema is provided, but the return is described in text. The context signals (no siblings, simple schema) confirm this is complete.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate. It adds rich context: for 'message' it advises 'Keep it one line and lead with what they'd act on', for 'title' it says 'Optional short bold title (e.g. the node or job name)', and for 'tag' it explains 'Which configured recipient group to send to (default "default")'. This far exceeds what the schema provides.

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 'Push a short notification to the user's phone (Telegram) via the local gateway,' which is a specific verb+resource pair. Though no siblings are listed, it distinguishes itself well from any potential notification tools by specifying the channel and gateway.

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

Usage Guidelines5/5

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

Explicit guidance is provided: 'Use this to proactively reach the user when they may be away from the terminal...' with concrete examples (long-running task finished, build succeeded/failed, needing user decision) and a clear 'Do NOT use it for routine progress chatter or to echo an answer they are clearly watching.' This fully addresses when and when not to use.

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. 1 tool updatev0.1.0
    • First observedsend_notification

TDQS

A4.5/5.0
Disambiguation5/5

Only one tool exists, so there is no possibility of confusion between tools. The purpose is clearly distinct by default.

Naming Consistency5/5

With a single tool, naming is trivially consistent. The name 'send_notification' follows a clear verb_noun pattern.

Tool Count3/5

One tool is borderline appropriate. The server's scope is limited to sending notifications, which could justify a single tool, but it feels thin compared to typical MCP servers that offer multiple operations.

Completeness2/5

The tool only sends notifications; there are no operations for managing recipients, viewing history, or configuring channels. While the core action is covered, significant gaps exist for a complete notification system.

Maintenance

ActivityStale
ResponsivenessSyncing

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
    B
    quality
    D
    maintenance
    Enables AI assistants to send push notifications to mobile devices via Pushover, allowing users to receive instant alerts for task completions, errors, reminders, and custom messages through their AI conversations.
    1
    20
    2
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to send push notifications to your phone through ntfy, with built-in security controls to prevent data exfiltration. It exposes a single tool notify_user for notifying when tasks complete or need attention.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables sending push notifications via ntfy with a single tool, allowing Claude agents to send notifications directly without shell access.
    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/slchenchn/page-user'

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