Требования
Рабочий MCP-воркфлоу, который генерирует нужный тебе контент. Как пример, создание ежедневного отчета по топовым монетам — посмотри, как это сделать.
Учетные данные для твоего целевого канала: токен бота для Telegram или Discord, либо SMTP / данные для транзакционных писем.
Настройка — Telegram
Создай Telegram-бота
Напиши в @BotFather команду
/newbotи следуй инструкциям. Сохрани токен бота.
Получи свой chat ID
Отправь что-нибудь своему Telegram-боту, затем перейди по ссылке ниже. Тебе нужен `chat.id` из ответа.
https://api.telegram.org/bot /getUpdates
Протестируй доставку
import requests
TOKEN = "твой_токен_бота"
CHAT_ID = "твой_chat_id"
def send_telegram(text: str) -> None:
requests.post(
f"https://api.telegram.org/bot{TOKEN}/sendMessage",
json={
"chat_id": CHAT_ID,
"text": text,
"parse_mode": "Markdown",
},
).raise_for_status()
send_telegram("Привет от твоего MCP-воркфлоу Cryptohopper")
Telegram поддерживает Markdown, поэтому таблицы и жирный шрифт из MCP отображаются нативно. Сообщения длиннее 4096 символов нужно разбивать — делай это по границам параграфов.
Настройка — Discord
Создай webhook
На своем Discord-сервере выбери канал → значок шестеренки → Integrations → Webhooks → New Webhook. Скопируй URL webhook.
Протестируй доставку
import requests
WEBHOOK = "https://discord.com/api/webhooks/..."
def send_discord(text: str) -> None:
requests.post(WEBHOOK, json={"content": text}).raise_for_status()
send_discord("Привет от твоего MCP-воркфлоу Cryptohopper")
Лимит сообщений в Discord — 2000 символов. Разбивай длинные отчеты. Нативной поддержки таблиц в Discord нет, форматируй их как блоки кода с тройными обратными кавычками. Для более богатого вывода используй Discord embeds (заголовок, описание, поля) вместо обычного текста.
Настройка — Email
Есть два варианта: SMTP через Gmail или подобный (просто, бесплатно, с ограничениями по частоте) или транзакционный сервис вроде SendGrid, Mailgun или Resend (надежно, предпочтительно для запланированных задач).
Пример SendGrid
import os
import requests
API_KEY = os.environ["SENDGRID_API_KEY"]
FROM = os.environ.get("ALERT_FROM_EMAIL", "[email protected]")
TO = os.environ.get("ALERT_TO_EMAIL", "[email protected]")
def send_email(subject: str, body: str) -> None:
requests.post(
"https://api.sendgrid.com/v3/mail/send",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"personalizations": [{"to": [{"email": TO}]}],
"from": {"email": FROM},
"subject": subject,
"content": [{"type": "text/markdown", "value": body}],
},
).raise_for_status()
send_email("Ежедневные топовые монеты", "## Сегодняшние лидеры\n...")
Используй Markdown или HTML для отчетов по почте — обычный текст с таблицами быстро становится нечитаемым.
Выбор правильного канала
Канал | Лучше всего подходит для | Ограничения |
Telegram | Оповещения в реальном времени, на телефоне, для быстрого просмотра | Лимит 4096 символов, базовый Markdown |
Discord | Общий командный канал, богатое форматирование, обсуждение оповещений | Лимит 2000 символов, нет нативной поддержки таблиц |
Длинные дайджесты, архивация, то, что захочется поискать позже | Высокая задержка, легко проигнорировать |
Ad-hoc оповещения → Telegram. Результаты для команды → Discord. Утренние дайджесты → email.
Каноничный паттерн
Держи шаг MCP и шаг доставки отдельно. Сбой доставки (сетевой сбой, истекший токен) не должен приводить к потере результата MCP — ты всегда сможешь восстановить его из логов.
# 1. Запуск MCP-воркфлоу (генерирует текстовый вывод)
report_text = run_mcp_workflow(prompt)
# 2. Доставка
try:
send_telegram(report_text)
except Exception as e:
log(f"Доставка не удалась: {e}")
Устранение неполадок
Telegram getUpdates возвращает пустой список
Ты еще не отправил сообщение боту, или используешь другой токен. Сначала отправь любое сообщение боту со своего аккаунта Telegram, затем попробуй снова.
Discord webhook возвращает 429
Превышен лимит запросов. Discord webhooks позволяют отправлять около 30 сообщений в минуту — учитывай заголовок Retry-After. Для высокочастотных оповещений группируй несколько событий в одно сообщение, а не отправляй по одному.
Письма попадают в спам
Используй корректный email отправителя из своего домена с настроенными SPF/DKIM/DMARC. Избегай тем писем заглавными буквами, триггерных слов и вложений. Транзакционный сервис обычно справляется с этим; обычный SMTP от общего провайдера часто нет.
Длинные MCP-отчеты обрезаются в Telegram или Discord
Создай разделитель, который будет разбивать по границам параграфов. Не разрывай в середине строки таблицы — обрезай после последней полной строки, которая помещается, а следующее сообщение начинай с заголовка * (продолжение)*.
Доставка молчаливо сбоит при запланированных запусках, но работает вручную
Самая частая причина — отсутствие переменной окружения или истекший токен в запланированной среде. Cron запускается без твоей оболочки `env`; GitHub Actions требует настройки секретов. Логируй полную ошибку при каждом сбое, чтобы она сразу стала видна.
Хочешь получать оповещения только когда что-то реально сработало
Сделай доставку условной — не отправляй сообщения "нет данных для отчета", они превращаются в шум, и ты начнешь игнорировать канал.
Хочешь отправлять на несколько каналов одновременно
Оберни доставку в `fan-out`, чтобы каждый канал был независим, и сбой в одном не блокировал другие: for ch in [send_telegram, send_discord, send_email]: try ch(text).
