Zum Hauptinhalt springen

Cryptohopper MCP-Berichte an Telegram, Discord oder E-Mail senden

MCP-Reports per Telegram, Discord oder Mail senden lernen – mit Setup-Skripten & Fehlerbehebung.

Verfasst von Isaac

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.

  • Eine Skripting-Umgebung für den Auslieferungsschritt. Python oder Node.js sind die gängigsten Optionen. Die Auslieferung ist ein separater Schritt, nachdem der MCP seine Ausgabe erzeugt hat – sie ist kein Teil des MCP selbst.

  • 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

  1. Telegram-Bot erstellen

    Schreibe @BotFather, sende /newbot und folge den Anweisungen. Speichere den Bot-Token.

  2. Deine Chat-ID erhalten

    Sende eine beliebige Nachricht an deinen Telegram-Bot und rufe dann die folgende URL auf. Die chat.id in der Antwort ist das, was du brauchst.

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

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

  1. Webhook erstellen

    Öffne in deinem Discord-Server einen Kanal → Zahnrad-Symbol → Integrationen → Webhooks → Neuer Webhook. Kopiere die Webhook-URL.

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

E-Mail

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

Hat dies deine Frage beantwortet?