前提条件
配信したいコンテンツを生成する、正常に動作するMCPワークフロー。テンプレートについては、「デイリートップムーバーレポートの作成方法」を参照してください。
配信先チャンネルの認証情報:TelegramまたはDiscordの場合はボットトークン、メールの場合はSMTP / トランザクションメールの認証情報。
設定 — Telegram
Telegramボットの作成
@BotFatherにメッセージを送信し、
/newbotと入力して、指示に従います。ボットトークンを保存してください。
チャットIDの取得
Telegramボットに任意のメッセージを送信し、以下のURLを取得します。レスポンス内の
chat.idが必要な値です。
https://api.telegram.org/bot /getUpdates
配信テスト
import requests
TOKEN = "your_bot_token"
CHAT_ID = "your_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("Hello from your Cryptohopper MCP workflow")
TelegramはMarkdownをサポートしているため、MCPからのテーブルや太字の書式設定はネイティブでレンダリングされます。4,096文字を超えるメッセージは分割する必要があります。長いレポートは段落の区切りでチャンク化してください。
設定 — Discord
Webhookの作成
Discordサーバーで、チャンネル → 歯車アイコン → Integrations → Webhooks → New Webhookを開きます。Webhook URLをコピーしてください。
配信テスト
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("Hello from your Cryptohopper MCP workflow")
Discordのコンテンツ制限は1メッセージあたり2,000文字です。長いレポートは分割してください。Discordにはネイティブのテーブルサポートはありません。トリプルバッククォートを使用した揃えられたコードブロックとしてテーブルをフォーマットしてください。よりリッチな出力のために、生のコンテンツではなくDiscord embeds(タイトル、説明、フィールド)を使用してください。
設定 — Email
2つのオプションがあります。Gmailなどを介したSMTP(シンプル、無料、レート制限あり)または、SendGrid、Mailgun、Resendのようなトランザクションサービス(信頼性が高く、スケジュールされたジョブに推奨)。
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("Daily top movers", "## Today's movers\n...")
メールレポートにはMarkdownまたはHTMLを使用してください。プレーンテキストでは、表形式のデータはすぐに読みにくくなります。
適切なチャンネルの選択
チャンネル | 最適な用途 | 制約 |
Telegram | リアルタイムアラート、スマホで一目で確認可能 | 4,096文字制限、Markdownライト |
Discord | チーム共有チャンネル、リッチなフォーマット、アラートに関する議論 | 2,000文字制限、ネイティブテーブルなし |
長文ダイジェスト、アーカイブ、後で検索したいもの | 高レイテンシ、無視されやすい |
アドホックアラート → Telegram。チームで表示する出力 → Discord。朝のダイジェスト → Email。
正規化されたパターン
MCPステップと配信ステップは分離してください。配信の失敗(ネットワークの不具合、トークンの期限切れ)でMCPの出力が失われることはありません。ログから回復できます。
# 1. MCPワークフローの実行(テキスト出力を生成)
report_text = run_mcp_workflow(prompt)
# 2. 配信
try:
send_telegram(report_text)
except Exception as e:
log(f"配信失敗: {e}")
トラブルシューティング
TelegramのgetUpdatesが空のリストを返します
まだボットにメッセージを送信していないか、異なるトークンでクエリしています。まずTelegramアカウントからボットに任意のメッセージを送信してから、再試行してください。
DiscordのWebhookが429を返します
レート制限に達しました。Discord Webhookは1分あたり約30メッセージを許可します。Retry-Afterヘッダーを尊重してください。高頻度のアラートの場合は、イベントごとに1つずつ送信するのではなく、複数のイベントを1つのメッセージにバッチ処理してください。
メールがスパムに届きます
所有しているドメインの適切な送信元アドレスを使用し、SPF / DKIM / DMARCを設定してください。すべて大文字の件名、トリガーワード、添付ファイルは避けてください。トランザクションサービスはほとんどの場合これを正しく処理します。共有プロバイダーからのプレーンSMTPはしばしばそうではありません。
長いMCPレポートがTelegramまたはDiscordで切り捨てられます
段落の区切りでチャンク化するスプリッターを作成してください。テーブルの行の途中で分割しないでください。最後に完全な行が収まるまでカットし、次のメッセージを(続き)ヘッダーで開きます。
スケジュールされた実行ではサイレントに失敗しますが、手動では機能します
最も一般的な原因は、スケジュールされた環境での環境変数の欠落またはトークンの期限切れです。Cronはシェルのenvなしで実行されます。GitHub Actionsはシークレットの設定が必要です。すべての障害の完全なエラーをログに記録して、すぐに表面化するようにしてください。
何もフラグが立たない場合にのみアラートを受け取りたい
配信を条件付きにしてください。「レポートはありません」というメッセージは送信しないようにしてください。ノイズになり、チャンネルを無視し始めるようになります。
複数のチャンネルに同時に配信したい
配信をファンアウトでラップして、各チャンネルが独立し、1つのチャンネルでの失敗が他のチャンネルをブロックしないようにしてください: for ch in [send_telegram, send_discord, send_email]: try ch(text)。
