Prerequisiti
Un workflow MCP funzionante che produce il contenuto che vuoi inviare — vedi come creare un report giornaliero sui top mover per un template.
Credenziali per il tuo canale di destinazione: un bot token per Telegram o Discord, o credenziali SMTP / email transazionali per l'email.
Configurazione — Telegram
Crea un bot Telegram
Manda un messaggio a @BotFather, invia
/newbote segui le istruzioni. Salva il bot token.
Ottieni il tuo chat ID
Invia un qualsiasi messaggio al tuo bot Telegram, poi recupera l'URL qui sotto. Il
chat.idnella risposta è quello che ti serve.
https://api.telegram.org/bot /getUpdates
Testa l'invio
import requests
TOKEN = "il_tuo_bot_token"
CHAT_ID = "il_tuo_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("Ciao dal tuo workflow MCP Cryptohopper")
Telegram supporta Markdown, quindi tabelle e formattazione in grassetto dall'MCP vengono renderizzate nativamente. I messaggi oltre i 4.096 caratteri devono essere divisi — spezza i resoconti lunghi ai confini dei paragrafi.
Configurazione — Discord
Crea un webhook
Nel tuo server Discord, apri un canale → icona ingranaggio → Integrazioni → Webhooks → Nuovo Webhook. Copia l'URL del webhook.
Testa l'invio
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("Ciao dal tuo workflow MCP Cryptohopper")
Il limite di contenuti di Discord è di 2.000 caratteri per messaggio — dividi i resoconti lunghi. Discord non ha supporto nativo per le tabelle; formatta le tabelle come blocchi di codice allineati usando triple backtick. Per un output più ricco, usa gli embed di Discord (titolo, descrizione, campi) invece del contenuto grezzo.
Configurazione — Email
Due opzioni: SMTP tramite Gmail o simile (semplice, gratuito, rate-limited) o un servizio transazionale come SendGrid, Mailgun o Resend (affidabile, preferito per lavori pianificati).
Esempio 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 mover giornalieri", "## Mover di oggi\n...")
Usa Markdown o HTML per i report via email — il testo semplice diventa rapidamente illeggibile per i dati tabellari.
Scegliere il canale giusto
Canale | Ideale per | Vincoli |
Telegram | Avvisi in tempo reale, sul telefono, lettura a colpo d'occhio | Limite 4.096 caratteri, Markdown-lite |
Discord | Canale di team condiviso, formattazione ricca, discussione sugli avvisi | Limite 2.000 caratteri, niente tabelle vere |
Digest più lunghi, archiviazione, tutto ciò che vorrai cercare in seguito | Latenza più alta, facile da ignorare |
Avvisi ad hoc → Telegram. Output visibile al team → Discord. Digest mattutini → email.
Il pattern canonico
Mantieni separato il passaggio MCP e il passaggio di invio. Un fallimento nell'invio (interruzione di rete, token scaduto) non dovrebbe far perdere l'output dell'MCP — puoi ancora recuperarlo dai log.
# 1. Esegui workflow MCP (produce output di testo)
report_text = run_mcp_workflow(prompt)
# 2. Invia
try:
send_telegram(report_text)
except Exception as e:
log(f"Invio fallito: {e}")
Risoluzione dei problemi
getUpdates di Telegram restituisce una lista vuota
Non hai ancora inviato un messaggio al bot, o stai interrogando con un token diverso. Invia prima un qualsiasi messaggio dal tuo account Telegram al bot, poi riprova.
Il webhook di Discord restituisce 429
Limite di frequenza raggiunto. I webhook di Discord consentono circa 30 messaggi al minuto — rispetta l'header Retry-After. Per avvisi ad alta frequenza, raggruppa più eventi in un unico messaggio invece di inviarne uno per evento.
Le email finiscono nello spam
Usa un indirizzo Mittente corretto su un dominio che possiedi, con SPF/DKIM/DMARC configurati. Evita righe oggetto tutto maiuscolo, parole trigger e allegati. Un servizio transazionale gestisce correttamente la maggior parte di questi aspetti; lo SMTP semplice da un provider condiviso spesso no.
I lunghi resoconti MCP vengono troncati su Telegram o Discord
Crea uno splitter che spezza ai confini dei paragrafi. Non spezzare a metà di una riga di tabella — taglia dopo l'ultima riga completa che rientra, e apri il messaggio successivo con un'intestazione (cont'd).
L'invio fallisce silenziosamente su esecuzioni pianificate ma funziona manualmente
La causa più comune è una variabile d'ambiente mancante o un token scaduto nell'ambiente pianificato. Cron esegue senza l'env della tua shell; GitHub Actions necessita di segreti configurati. Registra l'errore completo su ogni fallimento in modo che emerga immediatamente.
Vuoi solo avvisi quando qualcosa effettivamente flagga
Rendi condizionale l'invio — non inviare messaggi "niente da segnalare", diventano rumore e inizierai a ignorare il canale.
Vuoi inviare a più canali contemporaneamente
Incapsula l'invio in un fan-out in modo che ogni canale sia indipendente e un fallimento in uno non blocchi gli altri: for ch in [send_telegram, send_discord, send_email]: try ch(text).
