Skip to main content
Glama
IndyukovAnton

notification-mcp

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-shell

2. Настроить 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.

Команда

Действие

notification-mcp start

Запустить фоновый HTTP-сервер

notification-mcp stop

Завершить текущую попытку отправки и остановить сервер

notification-mcp restart

Перезапустить и применить изменённые настройки

notification-mcp status

Показать состояние фонового сервера, адрес и пути файлов

notification-mcp logs

Показать последние сообщения сервера

notification-mcp test

Отправить проверочное уведомление и дождаться результата

start/stop/status не управляют stdio-процессом: его жизненным циклом управляет MCP-клиент.

Где хранятся настройки

ОС

Конфигурация по умолчанию

Windows

%LOCALAPPDATA%\notification-mcp\config.toml

Linux

$XDG_CONFIG_HOME/notification-mcp/config.toml или ~/.config/notification-mcp/config.toml

macOS

~/Library/Application Support/notification-mcp/config.toml

Рядом сохраняются очередь и привязка 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 tools
notification_statusNotification statusA
Read-onlyIdempotent

Read queued/sending/sent/failed status. 'sent' does not confirm the user read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
notification_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
eventYes
statusYes
channelYes
sent_atYes
attemptsYes
created_atYes
last_errorYes
updated_atYes
last_error_codeYes
next_attempt_atYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
eventNoinfo
titleNo
sourceNo
messageYes
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
deduplicatedYesTrue when an existing idempotency key was reused
notificationYes

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 2 tool updatesv0.1.0
    • First observednotification_status
    • First observednotify

TDQS

A3.7/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    C
    maintenance
    Unified notification MCP server with 36 tools to send messages across 23 channels — Email, SMS, Slack, Telegram, Discord, Teams, WhatsApp, Firebase Push, and more.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI coding agents to send structured Telegram notifications for events like questions, plan_ready, final, attention_needed, and error.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    -