Prérequis
Un workflow MCP fonctionnel qui génère le contenu que tu souhaites diffuser. Jette un œil à comment construire un rapport quotidien des "top movers" pour un modèle.
Les identifiants pour ton canal de destination : un jeton de bot pour Telegram ou Discord, ou des identifiants SMTP / d'e-mail transactionnel pour l'e-mail.
Configuration — Telegram
Créer un bot Telegram
Message à @BotFather, envoie
/newbot, et suis les instructions. Sauvegarde le jeton du bot.
Obtenir ton chat ID
Envoie n'importe quel message à ton bot Telegram, puis récupère l'URL ci-dessous. Le
chat.iddans la réponse est ce dont tu as besoin.
https://api.telegram.org/bot /getUpdates
Tester la diffusion
import requests
TOKEN = "ton_jeton_de_bot"
CHAT_ID = "ton_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("Salut depuis ton workflow Cryptohopper MCP")
Telegram supporte Markdown, ainsi les tableaux et le formatage en gras du MCP sont rendus nativement. Les messages de plus de 4 096 caractères doivent être divisés – découpe les rapports longs aux frontières des paragraphes.
Configuration — Discord
Créer un webhook
Dans ton serveur Discord, ouvre un canal → icône d'engrenage → Intégrations → Webhooks → Nouveau Webhook. Copie l'URL du webhook.
Tester la diffusion
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("Salut depuis ton workflow Cryptohopper MCP")
La limite de contenu de Discord est de 2 000 caractères par message – divise les rapports longs. Discord n'a pas de support natif pour les tableaux ; formate les tableaux comme des blocs de code alignés en utilisant des triples backticks. Pour un rendu plus riche, utilise les embeds Discord (titre, description, champs) plutôt que du contenu brut.
Configuration — Email
Deux options : SMTP via Gmail ou similaire (simple, gratuit, limité en débit) ou un service transactionnel comme SendGrid, Mailgun, ou Resend (fiable, préféré pour les tâches planifiées).
Exemple 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("Top movers du jour", "## Movers du jour\n...")
Utilise Markdown ou HTML pour les rapports par e-mail – le texte brut devient rapidement illisible pour les données tabulaires.
Choisir le bon canal
Canal | Idéal pour | Contraintes |
Telegram | Alertes en temps réel, sur ton téléphone, lecture rapide | Limite de 4 096 caractères, Markdown-lite |
Discord | Canal d'équipe partagé, formatage riche, discussion autour des alertes | Limite de 2 000 caractères, pas de vrais tableaux |
Digests plus longs, archivage, tout ce que tu voudras rechercher plus tard | Latence plus élevée, facile à ignorer |
Alertes ad-hoc → Telegram. Sortie visible par l'équipe → Discord. Digests matinaux → e-mail.
Le schéma canonique
Garde l'étape MCP et l'étape de diffusion séparées. Une défaillance dans la diffusion (coupure réseau, jeton expiré) ne doit pas faire perdre la sortie du MCP – tu peux toujours la récupérer à partir des logs.
# 1. Exécuter le workflow MCP (produit une sortie texte)
report_text = run_mcp_workflow(prompt)
# 2. Diffuser
try:
send_telegram(report_text)
except Exception as e:
log(f"La diffusion a échoué : {e}")
Dépannage
Telegram getUpdates retourne une liste vide
Tu n'as pas encore envoyé de message au bot, ou tu interroges avec un jeton différent. Envoie d'abord n'importe quel message depuis ton compte Telegram au bot, puis réessaie.
Webhook Discord retourne 429
Limite de débit atteinte. Les webhooks Discord permettent environ 30 messages par minute – respecte l'en-tête Retry-After. Pour les alertes à haute fréquence, regroupe plusieurs événements dans un seul message plutôt que d'en envoyer un par événement.
Les e-mails atterrissent dans le spam
Utilise une adresse d'expéditeur appropriée sur un domaine qui t'appartient, avec SPF/DKIM/DMARC configuré. Évite les lignes d'objet en majuscules, les mots déclencheurs et les pièces jointes. Un service transactionnel gère la plupart de ces points correctement ; un simple SMTP depuis un fournisseur partagé ne le fait souvent pas.
Les longs rapports MCP sont tronqués dans Telegram ou Discord
Construis un découpeur qui segmente aux frontières des paragraphes. Ne coupe pas au milieu d'une ligne de tableau – coupe après la dernière ligne complète qui rentre, et ouvre le message suivant avec un en-tête (suite).
La diffusion échoue silencieusement lors des exécutions programmées mais fonctionne manuellement
La cause la plus fréquente est une variable d'environnement manquante ou un jeton expiré dans l'environnement programmé. Cron s'exécute sans l'environnement de ton shell ; GitHub Actions a besoin de secrets configurés. Journalise l'erreur complète à chaque échec pour qu'elle apparaisse immédiatement.
Tu veux des alertes uniquement quand quelque chose est effectivement signalé
Rends la diffusion conditionnelle – n'envoie pas de messages "rien à signaler", ils deviennent du bruit et tu finiras par ignorer le canal.
Tu veux diffuser vers plusieurs canaux en même temps
Encapsule la diffusion dans un fan-out afin que chaque canal soit indépendant et qu'une défaillance dans l'un n'empêche pas les autres : for ch in [send_telegram, send_discord, send_email]: try ch(text).
