准备工作
一个能生成你想要发布内容的、可用的 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 的内容限制是每条消息 2,000 个字符——拆分长报告。Discord 没有原生的表格支持;使用三个反引号将表格格式化为对齐的代码块。为了获得更丰富的输出,请使用 Discord embeds(标题、描述、字段)而不是原始内容。
设置 — 邮件
两种选择:通过 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。晨报摘要 → 邮件。
标准模式
保持 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 每分钟大约允许 30 条消息——请遵守 Retry-After 头部。对于高频率的警报,将多个事件合并到一个消息中,而不是每个事件都发送一条。
邮件进入垃圾箱
使用你自己拥有的域名下的有效发件人地址,并配置 SPF/DKIM/DMARC。避免全大写主题行、触发词和附件。事务性服务通常能正确处理这些问题;来自共享提供商的普通 SMTP 通常不行。
长 MCP 报告在 Telegram 或 Discord 中被截断
构建一个在段落边界处分块的拆分器。不要在表格行的中间拆分——在适合的最后一个完整行之后截取,并在下一条消息开头添加一个 (续) 标题。
计划运行中的发布悄无声息地失败,但手动运行却正常
最常见的原因是计划环境中的环境变量丢失或令牌过期。Cron 运行没有你的 shell 的 env;GitHub Actions 需要配置 secrets。记录每次失败的完整错误,以便立即发现。
只在真正出现标记时才发送提醒
使发布条件化——不要发送“没有报告内容”的消息,这会造成干扰,你会开始忽略该频道。
一次性将内容发布到多个频道
将发布包装成扇出模式,这样每个频道都是独立的,一个频道的失败不会阻止其他频道:for ch in [send_telegram, send_discord, send_email]: try ch(text)。
