notification-mcp
This server lets MCP clients send notifications to a configured channel (Telegram bot or local file) and track their delivery status.
Queue a notification via
notifywith a message, event type (info, action_required, review_requested, error), optional title, source, URL, and idempotency key.Check delivery status via
notification_status— returns queued, sending, sent, or failed with retry details and timestamps.Run in stdio mode (managed by an MCP client like Codex) or as a background HTTP server for multiple clients.
Configure recipients and channels (Telegram or local file) through server settings or MCP client env.
Survives restarts with SQLite queue and automatic retries for transient errors.
Send test notifications and manage the background HTTP server with CLI commands (start, stop, restart, status, logs, test).
Allows sending notifications via the Telegram Bot API to a configured chat, with support for binding a chat through /start and receiving notification delivery confirmations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@notification-mcpSend a Telegram notification that the nightly backup completed successfully."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Notification MCP
Уведомления из MCP-клиента — в выбранный вами канал. Агент сообщает, что работа готова, нужно решение или возникла ошибка. Сервер выбирает получателя и доставляет сообщение.
Сейчас доступны Telegram-бот и локальный файл для проверки без интернета. Инструменты
notify и notification_status общие для всех каналов. Поддерживаются Streamable HTTP и stdio.
Быстрый старт с Codex
Рекомендуемый режим — stdio. Codex сам запускает локальный сервер при подключении и завершает
его вместе с MCP-соединением. Отдельные start и stop не нужны.
1. Установить
Нужен uv — он установит подходящий Python и зависимости автоматически. Если uv ещё нет, выполните один раз:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"После публикации релиза установите зафиксированную версию из GitHub:
uv tool install --python 3.11 "git+https://github.com/IndyukovAnton/notification-mcp.git@v0.4.0"
uv tool update-shellОткройте новый терминал. Для установки по Git URL требуется Git. Без него скачайте wheel со страницы GitHub Release и выполните:
uv tool install --python 3.11 .\notification_mcp_relay-0.4.0-py3-none-any.whlВ GitHub нажмите Code → Download ZIP, распакуйте архив и откройте терминал в этой папке. На Windows:
powershell -ExecutionPolicy Bypass -File .\install.ps1На Linux и macOS:
uv tool install --python 3.11 .
uv tool update-shell2. Настроить Telegram и подключить Codex
Создайте бота через @BotFather, затем выполните одну команду:
notification-mcp connect codex --token-envКоманда скрыто запросит токен и сохранит его как пару TELEGRAM_BOT_TOKEN = значение
непосредственно в локальной записи MCP-сервера. Системная переменная ОС и отдельный
config.toml не создаются.
Перезапустите Codex и проверьте /mcp: сервер notifications должен быть активен. Затем откройте
личный чат со своим ботом, отправьте /start и дождитесь ответа
«Чат подключён. Новые уведомления будут приходить сюда».
Первый пользователь с /start становится владельцем привязки — выполните этот шаг сами.
После перезапуска токен и чат вводить заново не нужно.
Уже пользовались предыдущей версией? Сначала прочитайте как перенести существующие настройки и очередь.
Универсальная ручная настройка
Любой локальный MCP-клиент должен запускать один и тот же executable без аргументов и передавать
токен в собственном объекте env. Для JSON-конфигураций:
{
"mcpServers": {
"notifications": {
"command": "notification-mcp",
"env": {
"TELEGRAM_BOT_TOKEN": "ТОКЕН_ОТ_BOTFATHER"
}
}
}
}Эквивалент для Codex:
[mcp_servers.notifications]
command = "notification-mcp"
[mcp_servers.notifications.env]
TELEGRAM_BOT_TOKEN = "ТОКЕН_ОТ_BOTFATHER"Если приложение не видит notification-mcp через PATH, укажите полный путь к установленному
launcher. Сервер принимает те же поля command, args и env, что и обычные stdio MCP-серверы.
Готовый JSON с безопасным placeholder выдаёт notification-mcp client-config json --token-env.
Для нескольких каналов и собственной маршрутизации остаётся расширенный режим с config.toml.
3. Проверить и использовать
Напишите агенту в Codex:
Вызови notify сервера notifications: сообщение «Проверка подключения», событие info. Затем проверь доставку через notification_status.
Ожидаются уведомление в Telegram и состояние sent. В дальнейших задачах достаточно поручения:
По завершении работы отправь через notifications уведомление с событием review_requested. Кратко напиши, что сделано и что мне проверить.
MCP-клиент должен сам вызвать инструмент: сервер не следит за ходом работы агента. Постоянное правило для Codex приведено в инструкции подключения.
Related MCP server: notify-hub
Фоновый HTTP-режим
Используйте его, если один сервер должен одновременно обслуживать несколько MCP-клиентов:
notification-mcp setup
notification-mcp start
notification-mcp connect codex --transport http
notification-mcp testВ HTTP-режиме терминал можно закрыть, но после перезагрузки компьютера нужно снова выполнить
notification-mcp start. Для другого клиента используйте http://127.0.0.1:8765/mcp или
готовый JSON из notification-mcp client-config.
Команда | Действие |
| Запустить фоновый HTTP-сервер |
| Завершить текущую попытку отправки и остановить сервер |
| Перезапустить и применить изменённые настройки |
| Показать состояние фонового сервера, адрес и пути файлов |
| Показать последние сообщения сервера |
| Отправить проверочное уведомление и дождаться результата |
start/stop/status не управляют stdio-процессом: его жизненным циклом управляет MCP-клиент.
Где хранятся настройки
ОС | Конфигурация по умолчанию |
Windows |
|
Linux |
|
macOS |
|
Рядом сохраняются очередь и привязка Telegram; фоновый HTTP-режим также сохраняет журнал.
В рекомендуемом stdio-режиме токен хранится в локальной настройке самого MCP-клиента в поле
env; отдельная системная переменная и сервисный TOML не нужны. Как и у других локальных
MCP-серверов, этот секрет хранится открытым текстом в конфигурации выбранного клиента.
Для обновления закройте Codex, остановите HTTP-сервер, если он используется, и установите новый
тег с --force. Например:
notification-mcp stop
uv tool install --python 3.11 --force "git+https://github.com/IndyukovAnton/notification-mcp.git@v0.4.0"setup повторять не нужно. Для удаления закройте Codex и выполните:
codex mcp remove notifications
notification-mcp stop
uv tool uninstall notification-mcp-relayЛичные настройки и история при удалении программы сохраняются.
Как работает доставка
notifyсохраняет сообщение в SQLite и возвращает ID.queuedозначает принятие в очередь.Временные ошибки соединения повторяются с увеличением задержки; очередь переживает перезапуск.
notification_statusпоказываетqueued,sending,sentилиfailed.sentозначает подтверждение канала доставки, а не прочтение человеком.Получатель фиксируется при постановке в очередь. Смена чата влияет на новые уведомления.
После исчерпания попыток сообщение получает
failed. При неоднозначном сетевом сбое возможен дубль.
MCP-клиент должен сам вызвать инструмент: сервер не следит за ходом работы агента. Локальный адрес доступен приложениям на этом компьютере. Для удалённого облачного клиента потребуется отдельное развёртывание с защищённым доступом; текущий HTTP-сервер слушает только localhost.
Подробнее
Используются официальный Python MCP SDK и Telegram Bot API. Подход к MCP взят из того же SDK, что и у chigwell/telegram-mcp; его исходники не копировались, Telethon и пользовательские Telegram-сессии не используются.
Лицензия
MIT License. Бесплатное использование, изменение и распространение разрешены при сохранении copyright-уведомления и текста лицензии. Автор: Anton Indyukov.
Available Tools
2 toolsnotification_statusNotification statusARead-onlyIdempotent
Read queued/sending/sent/failed status. 'sent' does not confirm the user read it.
| Name | Required | Description | Default |
|---|---|---|---|
| notification_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| event | Yes | |
| status | Yes | |
| channel | Yes | |
| sent_at | Yes | |
| attempts | Yes | |
| created_at | Yes | |
| last_error | Yes | |
| updated_at | Yes | |
| last_error_code | Yes | |
| next_attempt_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds a valuable behavioral nuance: 'sent' does not confirm the user read it, which clarifies the semantic limits of the status field. This goes beyond what annotations express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences. The core action is front-loaded with a concise list of statuses, followed by a single caveat that adds real value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter, an output schema already present, and a clear sibling contrast, the description covers the essential behavior. The caveat about 'sent' prevents a common misinterpretation. Nothing critical for invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears the burden of explaining the parameter, but it does not mention notification_id at all. The schema only provides the name and type, leaving the agent to infer what the ID refers to. This is a clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Read') on a well-defined resource (notification status) and enumerates the possible states ('queued/sending/sent/failed'). This clearly distinguishes it from the sibling tool 'notify', which presumably creates/sends notifications. An agent can immediately tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for checking delivery status, likely after using 'notify', but it does not explicitly say when to use this tool versus alternatives or mention any exclusions. The usage context is inferable from the read-vs-write contrast with 'notify', but the guidance is not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifySend notificationB
Queue a notification. Delivery channel and recipient are chosen by server settings.
event: info, action_required (needs a decision), review_requested (ready to inspect), or error. source identifies the project/task. url optionally links to the result. idempotency_key prevents duplicate queue entries for an identical logical event.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| event | No | info | |
| title | No | ||
| source | No | ||
| message | Yes | ||
| idempotency_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| deduplicated | Yes | True when an existing idempotency key was reused |
| notification | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds meaningful behavioral context: notifications are queued rather than sent directly, delivery is server-controlled, and idempotency_key prevents duplicate queue entries. This goes beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and dense; each line contributes semantic value and the main action is front-loaded. The event list is slightly compressed but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with 0% schema coverage, the description covers most parameters well but misses the required message parameter and the title parameter. Output schema exists, so return values need not be described, but the missing parameter semantics leave a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains event, source, url, and idempotency_key with concrete meaning, but it does not explain message — the only required parameter — or title. This is a partial compensation for an otherwise undocumented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Queue a notification') and adds the key scope that channel and recipient are server-chosen. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling notification_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance or mention of alternatives. The description explains queueing behavior but never states when to use notify versus notification_status, leaving the agent to infer the boundary from the tool names and context.
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.
2 tool updates
v0.1.0- First observed
notification_status - First observed
notify
TDQS
Scored across 2 tools
The two tools are clearly distinct: notify creates/queues a notification, while notification_status reads its delivery state. There is no overlap in purpose or ambiguity about which to call.
The names are readable and individually clear, but they follow different conventions: 'notify' is a bare verb while 'notification_status' is a noun phrase without an action prefix. This is a minor inconsistency rather than chaotic naming.
Two tools is on the thin side for a notification server, but the pair covers the essential send-and-check workflow without unnecessary bloat. It feels slightly under-scoped but not unusably so.
The basic lifecycle of queueing and checking delivery status is covered, and the details around idempotency and state are thoughtfully described. Missing capabilities like canceling a queued notification or confirming read receipt are notable but not fatal gaps.
Maintenance
Related MCP Connectors
Build and send email, SMS, and push straight from your AI agent.
Let your AI agent notify you by email, Slack, Discord, or webhook. One tool: send_notification.
Email, WhatsApp and Telegram for AI agents: send, campaigns, automations, contacts, agent inboxes.
Send, search, and manage notifications, accounts, and push preferences
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables sending messages and scheduling reminders through multiple platforms including Telegram and Feishu. Supports real-time messaging and cron-based scheduled notifications with comprehensive logging and error handling.MIT
- AlicenseNot gradedqualityCmaintenanceUnified notification MCP server with 36 tools to send messages across 23 channels — Email, SMS, Slack, Telegram, Discord, Teams, WhatsApp, Firebase Push, and more.5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI coding agents to send structured Telegram notifications for events like questions, plan_ready, final, attention_needed, and error.MIT
- FlicenseNot gradedqualityBmaintenanceEnables agents to send structured notifications to recipients via configurable channels (initial SMTP provider) without exposing delivery addresses or credentials, with tools for listing recipients, listing channels, and sending notifications.-