Перейти до основного контенту

Надсилай звіти Cryptohopper MCP в Telegram, Discord або на електронну пошту

Навчися відправляти звіти MCP Cryptohopper в Telegram, Discord чи на email — зі скриптами налаштування, порівнянням каналів та виправленнями помилок.

Автор: Isaac

Передумови

  • Працюючий пайплайн MCP, що генерує контент, який ви хочете доставити — дивіться, як створити звіт про найпопулярніші мовери зразком.

  • Середовище для скриптів на етапі доставки. Python або Node.js — найпоширеніші варіанти. Доставка — це окремий етап після того, як MCP видає результат; вона не є частиною самого MCP.

  • Облікові дані для вашого каналу призначення: токен бота для Telegram або Discord, або облікові дані SMTP / транзакційної пошти для електронної пошти.


Налаштування — Telegram

  1. Створити бота Telegram

    Напиши повідомлення @BotFather, надішли /newbot та дотримуйся інструкцій. Збережи токен бота.

  2. Отримати свій ID чату

    Надішли будь-яке повідомлення своєму боту Telegram, потім перейди за URL нижче. chat.id у відповіді — це те, що тобі потрібно.

    https://api.telegram.org/bot /getUpdates

  3. Тестування доставки

    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

  1. Створити вебхук

    На своєму сервері Discord відкрий канал → іконка шестірні → Integrations → Webhooks → New Webhook. Скопіюй URL вебхуку.

  2. Тестування доставки

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 символів, без справжніх таблиць

Email

Довші дайджести, архівування, все, що ти захочеш шукати пізніше

Вища затримка, легко пропустити

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).

Ви отримали відповідь на своє запитання?