Voraussetzungen
Ein funktionierender MCP-Workflow, der die Inhalte produziert, die du ausliefern möchtest – schau dir an, wie man einen täglichen Top-Movers-Report erstellt, als Vorlage.
Zugangsdaten für deinen Zielkanal: ein Bot-Token für Telegram oder Discord, oder SMTP / Transaktions-E-Mail-Zugangsdaten für E-Mails.
Einrichtung – Telegram
Telegram-Bot erstellen
Schreibe @BotFather, sende
/newbotund folge den Anweisungen. Speichere den Bot-Token.
Deine Chat-ID erhalten
Sende eine beliebige Nachricht an deinen Telegram-Bot und rufe dann die folgende URL auf. Die
chat.idin der Antwort ist das, was du brauchst.
https://api.telegram.org/bot /getUpdates
Auslieferung testen
import requests
TOKEN = "dein_bot_token"
CHAT_ID = "deine_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 von deinem Cryptohopper MCP-Workflow")
Telegram unterstützt Markdown, sodass Tabellen und fette Formatierungen aus dem MCP nativ gerendert werden. Nachrichten über 4.096 Zeichen müssen aufgeteilt werden – teile lange Reports an Absatzgrenzen auf.
Einrichtung – Discord
Webhook erstellen
Öffne in deinem Discord-Server einen Kanal → Zahnrad-Symbol → Integrationen → Webhooks → Neuer Webhook. Kopiere die Webhook-URL.
Auslieferung testen
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 von deinem Cryptohopper MCP-Workflow")
Discores Inhaltsgrenze liegt bei 2.000 Zeichen pro Nachricht – teile lange Reports auf. Discord hat keine native Tabellenunterstützung; formatiere Tabellen als ausgerichtete Codeblöcke mit dreifachen Backticks. Für eine reichhaltigere Ausgabe verwende Discord-Embeds (Titel, Beschreibung, Felder) anstelle von rohem Inhalt.
Einrichtung – E-Mail
Zwei Optionen: SMTP über Gmail oder ähnliches (einfach, kostenlos, Ratenbegrenzung) oder ein Transaktionsdienst wie SendGrid, Mailgun oder Resend (zuverlässig, bevorzugt für geplante Jobs).
SendGrid-Beispiel
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("Tägliche Top-Mover", "## Movers von heute\n...")
Verwende Markdown oder HTML für E-Mail-Reports – reiner Text wird bei tabellarischen Daten schnell unleserlich.
Auswahl des richtigen Kanals
Kanal | Am besten geeignet für | Einschränkungen |
Telegram | Echtzeit-Alerts, auf dem Handy, auf einen Blick lesbar | 4.096 Zeichen Limit, Markdown-Lite |
Discord | Gemeinsamer Teamkanal, Rich Formatting, Diskussion über Alerts | 2.000 Zeichen Limit, keine echten Tabellen |
Längere Zusammenfassungen, Archivierung, alles, was du später durchsuchen möchtest | Höhere Latenz, leicht zu ignorieren |
Ad-hoc-Alerts → Telegram. Für das Team sichtbare Ausgabe → Discord. Morgendliche Zusammenfassungen → E-Mail.
Das kanonische Muster
Halte den MCP-Schritt und den Auslieferungsschritt getrennt. Ein Fehler bei der Auslieferung (Netzwerk-Blitz, abgelaufener Token) sollte die MCP-Ausgabe nicht verlieren – du kannst sie immer noch aus den Logs wiederherstellen.
# 1. MCP-Workflow ausführen (erzeugt Textausgabe)
report_text = run_mcp_workflow(prompt)
# 2. Ausliefern
try:
send_telegram(report_text)
except Exception as e:
log(f"Auslieferung fehlgeschlagen: {e}")
Fehlerbehebung
Telegram getUpdates gibt eine leere Liste zurück
Du hast dem Bot noch keine Nachricht gesendet, oder du fragst mit einem anderen Token ab. Sende zuerst eine beliebige Nachricht von deinem Telegram-Konto an den Bot und versuche es dann erneut.
Discord Webhook gibt 429 zurück
Ratenbegrenzung erreicht. Discord-Webhooks erlauben ungefähr 30 Nachrichten pro Minute – beachte den Retry-After-Header. Bei hochfrequenten Alerts, fasse mehrere Ereignisse in einer Nachricht zusammen, anstatt einen pro Ereignis zu senden.
E-Mails landen im Spam
Verwende eine korrekte Absenderadresse einer Domäne, die dir gehört, mit konfigurierter SPF/DKIM/DMARC. Vermeide Betreffzeilen in Großbuchstaben, Trigger-Wörter und Anhänge. Ein Transaktionsdienst behandelt die meisten dieser Probleme korrekt; reines SMTP von einem Shared Provider tut das oft nicht.
Lange MCP-Reports werden in Telegram oder Discord abgeschnitten
Erstelle einen Splitter, der an Absatzgrenzen teilt. Teile nicht mitten in einer Tabellenzeile – schneide nach der letzten vollständigen Zeile ab, die passt, und beginne die nächste Nachricht mit einem (Forts.)-Header.
Auslieferung schlägt bei geplanten Läufen still und heimlich fehl, funktioniert aber manuell
Die häufigste Ursache ist eine fehlende Umgebungsvariable oder ein abgelaufener Token in der geplanten Umgebung. Cron-Läufe erfolgen ohne die Umgebung deiner Shell; GitHub Actions benötigt konfigurierte Geheimnisse. Protokolliere bei jedem Fehler die vollständige Fehlermeldung, damit sie sofort ersichtlich wird.
Du möchtest nur Alerts erhalten, wenn tatsächlich etwas markiert wird
Mache die Auslieferung bedingt – sende keine "Nichts zu berichten"-Nachrichten, sie werden zu Lärm und du fängst an, den Kanal zu ignorieren.
Du möchtest an mehrere Kanäle gleichzeitig liefern
Verpacke die Auslieferung in ein Fan-Out, sodass jeder Kanal unabhängig ist und ein Fehler in einem die anderen nicht blockiert: for ch in [send_telegram, send_discord, send_email]: try ch(text).
