Wymagania wstępne
Działający przepływ pracy MCP, który generuje treści, które chcesz dostarczyć — zobacz, jak zbudować raport codziennych największych moverów jako szablon.
Poświadczenia dla Twojego kanału docelowego: token bota dla Telegrama lub Discorda, albo poświadczenia SMTP / transactional email dla poczty e-mail.
Konfiguracja — Telegram
Utwórz bota na Telegramie
Napisz wiadomość do @BotFather, wyślij
/newboti postępuj zgodnie z instrukcjami. Zachowaj token bota.
Uzyskaj swój ID czatu
Wyślij dowolną wiadomość do swojego bota na Telegramie, a następnie pobierz poniższy URL.
chat.idw odpowiedzi to to, czego potrzebujesz.
https://api.telegram.org/bot /getUpdates
Przetestuj dostarczanie
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("Hello from your Cryptohopper MCP workflow")
Telegram obsługuje Markdown, więc tabele i pogrubienia z MCP są renderowane natywnie. Wiadomości dłuższe niż 4096 znaków muszą zostać podzielone — dziel długie raporty na granicach akapitów.
Konfiguracja — Discord
Utwórz webhooka
Na swoim serwerze Discord, otwórz kanał → ikona zębatki → Integracje → Webhooks → Nowy Webhook. Skopiuj URL webhooka.
Przetestuj dostarczanie
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("Hello from your Cryptohopper MCP workflow")
Limit treści Discorda wynosi 2000 znaków na wiadomość — dziel długie raporty. Discord nie ma natywnego wsparcia dla tabel; formatuj tabele jako wyrównane bloki kodu przy użyciu potrójnych cudzysłowów. Aby uzyskać bogatsze wyjście, użyj wbudowanych elementów widżetów Discorda (tytuł, opis, pola) zamiast surowej treści.
Konfiguracja — Poczta e-mail
Dwie opcje: SMTP przez Gmaila lub podobne (proste, darmowe, ograniczone tempo) lub usługa transakcyjna, jak SendGrid, Mailgun lub Resend (niezawodne, preferowane dla zaplanowanych zadań).
Przykład 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("Daily top movers", "## Today's movers\n...")
Używaj Markdown lub HTML do raportów wysyłanych e-mailem — zwykły tekst szybko staje się nieczytelny dla danych tabelarycznych.
Wybór odpowiedniego kanału
Kanał | Najlepszy do | Ograniczenia |
Telegram | Alerty w czasie rzeczywistym, na telefonie, szybkie czytanie | Limit 4096 znaków, Markdown-lite |
Discord | Wspólny kanał zespołu, bogate formatowanie, dyskusja wokół alertów | Limit 2000 znaków, brak natywnych tabel |
Poczta e-mail | Dłuższe podsumowania, archiwizacja, wszystko, co będziesz chciał później wyszukać | Wyższa latencja, łatwo zignorować |
Alerty ad-hoc → Telegram. Wyjście widoczne dla zespołu → Discord. Poranne podsumowania → e-mail.
Kanoniczny wzorzec
Oddziel krok MCP i krok dostarczania. Awaria dostarczenia (zakłócenie sieci, wygasły token) nie powinna spowodować utraty wynikowi MCP — możesz go nadal odzyskać z logów.
# 1. Uruchom przepływ pracy MCP (generuje dane wyjściowe tekstowe)
report_text = run_mcp_workflow(prompt)
# 2. Dostarcz
try:
send_telegram(report_text)
except Exception as e:
log(f"Delivery failed: {e}")
Rozwiązywanie problemów
getUpdates na Telegramie zwraca pustą listę
Nie wysłałeś jeszcze żadnej wiadomości do bota lub wykonujesz zapytanie z innym tokenem. Najpierw wyślij dowolną wiadomość ze swojego konta Telegram do bota, a następnie spróbuj ponownie.
Webhook Discorda zwraca 429
Osiągnięto limit przydziału. Webhooki Discorda pozwalają na około 30 wiadomości na minutę — przestrzegaj nagłówka Retry-After. W przypadku alertów o wysokiej częstotliwości grupuj wiele zdarzeń w jedną wiadomość, zamiast wysyłać jedną na zdarzenie.
E-maile trafiają do spamu
Użyj poprawnego adresu nadawcy z własnej domeny, z skonfigurowanym SPF/DKIM/DMARC. Unikaj tematów pisanych wielkimi literami, słów wywołujących spam i załączników. Usługa transakcyjna obsługuje większość z tego poprawnie; zwykły SMTP od współdzielonego dostawcy często tego nie robi.
Długie raporty MCP są przycinane na Telegramie lub Discordzie
Zbuduj dzielnik, który łamie tekst na granicach akapitów. Nie dziel w środku wiersza tabeli — tnij po ostatnim pełnym wierszu, który się mieści, a następną wiadomość otwórz nagłówkiem (ciąg dalszy).
Dostarczanie cicho zawodzi podczas zaplanowanych uruchomień, ale działa ręcznie
Najczęstszą przyczyną jest brak zmiennej środowiskowej lub wygasły token w zaplanowanym środowisku. Zadania Cron uruchamiają się bez środowiska Twojej powłoki; GitHub Actions wymaga skonfigurowania sekretów. Zaloguj pełny błąd przy każdej awarii, aby natychmiast się pojawił.
Chcesz otrzymywać alerty tylko wtedy, gdy coś faktycznie zostanie oznaczone
Uczyń dostarczanie warunkowym — nie wysyłaj wiadomości "nic do zgłoszenia", stają się one szumem i zaczniesz ignorować kanał.
Chcesz dostarczać do wielu kanałów jednocześnie
Zapakuj dostarczanie w wyjście rozproszone (fan-out), aby każdy kanał był niezależny, a awaria w jednym nie blokowała pozostałych: for ch in [send_telegram, send_discord, send_email]: try ch(text).
