メインコンテンツにスキップ

Cryptohopper MCPレポートをTelegram、Discord、またはメールに送信

Cryptohopper MCPレポートをTelegram、Discord、メールに送信する方法を学ぼう!セットアップスクリプト、チャンネル比較、よくある配信問題の修正について。

対応者:Isaac

前提条件

  • 配信したいコンテンツを生成する、正常に動作するMCPワークフロー。テンプレートについては、「デイリートップムーバーレポートの作成方法」を参照してください。

  • 配信ステップ用のスクリプト環境。一般的には、PythonNode.jsが選択されます。配信は、MCPが出力を生成した後の独立したステップであり、MCP自体の一部ではありません。

  • 配信先チャンネルの認証情報:TelegramまたはDiscordの場合はボットトークン、メールの場合はSMTP / トランザクションメールの認証情報。


設定 — Telegram

  1. Telegramボットの作成

    @BotFatherにメッセージを送信し、/newbotと入力して、指示に従います。ボットトークンを保存してください。

  2. チャットIDの取得

    Telegramボットに任意のメッセージを送信し、以下のURLを取得します。レスポンス内のchat.idが必要な値です。

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

  3. 配信テスト

    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

  1. Webhookの作成

    Discordサーバーで、チャンネル → 歯車アイコン → Integrations → Webhooks → New Webhookを開きます。Webhook URLをコピーしてください。

  2. 配信テスト

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文字制限、ネイティブテーブルなし

Email

長文ダイジェスト、アーカイブ、後で検索したいもの

高レイテンシ、無視されやすい

アドホックアラート → 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)

こちらの回答で解決しましたか?