Vereisten
Een werkende MCP-workflow die de content produceert die je wilt leveren — zie hoe je een dagelijks top-movers rapport bouwt voor een sjabloon.
Credentials voor je bestemmingskanaal: een bot-token voor Telegram of Discord, of SMTP / transactionele e-mailcredentials voor e-mail.
Setup — Telegram
Maak een Telegram-bot aan
Bericht @BotFather, stuur
/newbot, en volg de aanwijzingen. Bewaar de bot-token.
Haal je chat-ID op
Stuur een bericht naar je Telegram-bot, haal dan de onderstaande URL op. De
chat.idin de reactie is wat je nodig hebt.
https://api.telegram.org/bot /getUpdates
Test de levering
import requests
TOKEN = "jouw_bot_token"
CHAT_ID = "jouw_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("Hallo vanuit je Cryptohopper MCP-workflow")
Telegram ondersteunt Markdown, dus tabellen en vetgedrukte opmaak vanuit de MCP worden native weergegeven. Berichten van meer dan 4.096 tekens moeten worden opgesplitst — deel lange rapporten op bij paragraafgrenzen.
Setup — Discord
Maak een webhook aan
In je Discord-server, open een kanaal → tandwielicoon → Integraties → Webhooks → Nieuwe Webhook. Kopieer de webhook-URL.
Test de levering
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("Hallo vanuit je Cryptohopper MCP-workflow")
Discord's limiet voor content is 2.000 tekens per bericht — splits lange rapporten op. Discord heeft geen native tabelondersteuning; formatteer tabellen als uitgelijnde codeblokken met drie backticks. Gebruik voor rijkere output Discord-embeds (titel, beschrijving, velden) in plaats van ruwe content.
Setup — E-mail
Twee opties: SMTP via Gmail of vergelijkbaar (simpel, gratis, limieten) of een transactionele service zoals SendGrid, Mailgun, of Resend (betrouwbaar, de voorkeur voor geplande taken).
SendGrid voorbeeld
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("Dagelijkse top movers", "## Movers van vandaag\n...")
Gebruik Markdown of HTML voor e-mailrapporten — platte tekst wordt snel onleesbaar voor tabelgegevens.
Het juiste kanaal kiezen
Kanaal | Het beste voor | Beperkingen |
Telegram | Realtime alerts, op je telefoon, in één oogopslag lezen | 4.096 tekens limiet, Markdown-lite |
Discord | Gedeeld teamkanaal, rijke opmaak, discussie rond alerts | 2.000 tekens limiet, geen echte tabellen |
Langere samenvattingen, archivering, alles wat je later wilt doorzoeken | Hogere latentie, makkelijk te negeren |
Ad-hoc alerts → Telegram. Team-zichtbare output → Discord. Ochtendsamenvattingen → e-mail.
Het canonieke patroon
Houd de MCP-stap en de leveringsstap gescheiden. Een storing in de levering (netwerkdip, verlopen token) mag de MCP-output niet verliezen — je kunt deze nog steeds uit logs herstellen.
# 1. MCP-workflow uitvoeren (produceert tekst-output)
report_text = run_mcp_workflow(prompt)
# 2. Leveren
try:
send_telegram(report_text)
except Exception as e:
log(f"Levering mislukt: {e}")
Probleemoplossing
Telegram getUpdates retourneert een lege lijst
Je hebt nog geen bericht naar de bot gestuurd, of je bevraagt met een andere token. Stuur eerst een willekeurig bericht vanaf je Telegram-account naar de bot, en probeer het dan opnieuw.
Discord webhook retourneert 429
Rate limit bereikt. Discord webhooks staan ongeveer 30 berichten per minuut toe — respecteer de Retry-After header. Voor alerts met hoge frequentie, bundel meerdere gebeurtenissen in één bericht in plaats van één per gebeurtenis te versturen.
E-mails belanden in spam
Gebruik een correct afzenderadres op een domein dat je bezit, met SPF/DKIM/DMARC geconfigureerd. Vermijd onderwerpregels in hoofdletters, triggerwoorden en bijlagen. Een transactionele service regelt dit meestal correct; platte SMTP van een gedeelde provider doet dat vaak niet.
Lange MCP-rapporten worden afgekapt in Telegram of Discord
Bouw een splitter die op paragraafgrenzen opdeelt. Splits niet middenin een tabelrij — snijd na de laatste volledige rij die past, en open het volgende bericht met een (vervolg)-kop.
Levering faalt stilzwijgend bij geplande runs, maar werkt handmatig
De meest voorkomende oorzaak is een ontbrekende omgevingsvariabele of een verlopen token in de geplande omgeving. Cron-runs draaien zonder de env van je shell; GitHub Actions heeft geheimen nodig die zijn geconfigureerd. Log de volledige foutmelding bij elke storing zodat deze onmiddellijk zichtbaar wordt.
Je wilt alleen alerts als er daadwerkelijk iets wordt gemeld
Maak levering voorwaardelijk — stuur geen "niets te melden"-berichten, deze worden ruis en je begint het kanaal te negeren.
Je wilt leveren aan meerdere kanalen tegelijk
Wikkel de levering in een fan-out zodat elk kanaal onafhankelijk is en een storing in één de anderen niet blokkeert: for ch in [send_telegram, send_discord, send_email]: try ch(text).
