Передумови
Працюючий пайплайн MCP, що генерує контент, який ви хочете доставити — дивіться, як створити звіт про найпопулярніші мовери зразком.
Облікові дані для вашого каналу призначення: токен бота для Telegram або Discord, або облікові дані SMTP / транзакційної пошти для електронної пошти.
Налаштування — Telegram
Створити бота Telegram
Напиши повідомлення @BotFather, надішли
/newbotта дотримуйся інструкцій. Збережи токен бота.
Отримати свій ID чату
Надішли будь-яке повідомлення своєму боту Telegram, потім перейди за URL нижче.
chat.idу відповіді — це те, що тобі потрібно.
https://api.telegram.org/bot /getUpdates
Тестування доставки
import requests
TOKEN = "your_bot_token"
CHAT_ID = "your_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("Привіт від твого пайплайну Cryptohopper MCP")
Telegram підтримує Markdown, тому таблиці та жирне форматування з MCP відображаються рідною мовою. Повідомлення довжиною понад 4096 символів слід розділяти — розбивай довгі звіти за межами абзаців.
Налаштування — Discord
Створити вебхук
На своєму сервері Discord відкрий канал → іконка шестірні → Integrations → Webhooks → New Webhook. Скопіюй URL вебхуку.
Тестування доставки
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("Привіт від твого пайплайну Cryptohopper MCP")
Обмеження контенту Discord — 2000 символів на повідомлення, розбивай довгі звіти. Discord не має рідної підтримки таблиць, форматуй таблиці як вирівняні блоки коду, використовуючи потрійні зворотні апострофи. Для насиченішого виводу використовуй вбудовування Discord (заголовок, опис, поля) замість сирого контенту.
Налаштування — 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-lite |
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 вебхук повертає 429
Досягнуто обмеження частоти. Вебхуки Discord дозволяють приблизно 30 повідомлень на хвилину — дотримуйся заголовка Retry-After. Для високочастотних сповіщень групуй кілька подій в одне повідомлення, а не надсилай по одній події.
Повідомлення потрапляють у спам
Використовуй правильну адресу відправника з власного домену, з налаштованими SPF/DKIM/DMARC. Уникай тем у всіх великих літерах, тригерних слів та вкладень. Транзакційний сервіс більшість цього правильно обробляє; простий SMTP від загального провайдера часто цього не робить.
Довгі звіти MCP обрізаються в Telegram або Discord
Створи роздільник, який розбиває за межами абзаців. Не розбивай посередині рядка таблиці — розрізай після останнього повного рядка, який вміщається, і починай наступне повідомлення з заголовком (продовження).
Доставка мовчки не вдається при запланованих запусках, але працює вручну
Найпоширеніша причина — відсутність змінної середовища або недійсний токен у запланованому середовищі. Cron запускається без твого оболонкового середовища; GitHub Actions потребує налаштування секретів. Записуй повну помилку при кожному збої, щоб вона одразу виявлялася.
Ти хочеш отримувати сповіщення тільки тоді, коли щось дійсно позначено
Зроби доставку умовною — не надсилай повідомлення "немає нічого для звіту", вони стають шумом, і ти почнеш ігнорувати канал.
Ти хочеш доставляти на кілька каналів одночасно
Загорни доставку у fan-out, щоб кожен канал був незалежним, і збій в одному не блокував інші: for ch in [send_telegram, send_discord, send_email]: try ch(text).
