大家好 👋
先说结论:如果你也被 Claude 的 Gmail MCP "只能写草稿不能发" 这件事卡住,用 Cloudflare Worker 大概 100 行就能补上这个洞。
上周我在搞一个 "让 Claude 每天自动发份小报告" 的流程。Google MCP 很乖地把邮件写好、排好版、然后…… 存成草稿。每一次都是。原来 MCP 的设计就是停在这一步 —— 发信这一步它故意不做。
理论上说得过去。实际上就是:我那个 "把无聊的邮件自动化" 的循环,永远卡在草稿夹里。
🤔 为什么写 Worker,不直接改 MCP
两个原因:
- MCP 是别人维护的东西:我不想 fork 一个 MCP,只为了改那一个开关。
- Worker 太便宜:Cloudflare 的免费额度跑一个 cron 完全够,整个东西部署只要几秒。
所以我换个方向:MCP 不动,把 Gmail 草稿夹当成一个 message queue,让另一个东西来 drain 它。
🛠️ 怎么跑起来
整个 Worker 单文件,配一个 cron trigger,每 5 分钟跑一次。每一次:
- 用 Gmail API(OAuth2,refresh token 自动轮转)跟 Gmail 通讯。
- 列出当前的草稿。
- 过滤出
To是我设定的目标邮箱的那些。 - 用
drafts.send把它们送出去。
就这样。Claude(透过 MCP)写好草稿 → Worker 在 5 分钟内捡走 → 邮件真的发出去了。
另外还有一个 GET /drafts/pending endpoint,方便我不开 Gmail 就能看看队列里有什么。
🔐 Secrets
六个值,全部用 wrangler secret put 存:
GMAIL_CLIENT_ID、GMAIL_CLIENT_SECRET:Google Cloud Console 拿。GMAIL_REFRESH_TOKEN:去 OAuth Playground 走一次gmail.modifyscope 拿。GMAIL_USER_EMAIL:寄件人。TARGET_EMAIL:Worker 会监控To是这个地址的草稿。API_KEY:可选,给 REST endpoint 加锁。
只有 refresh token 需要在 OAuth Playground 转一圈,弄完之后 Worker 就一直自己刷 access token,不用再管。
🚀 Setup
npm install、wrangler secret put 六次、npm run deploy。完事。
要先在本地跑一遍确认没问题:npm run build && npm run dev。
⚠️ 注意事项
几个值得知道的点:
- 5 分钟的频率是写死的:想更快可以改
wrangler.toml一行,但 Cloudflare cron 最快 1 分钟,Gmail API 的 quota 才是真正的天花板。 TARGET_EMAIL只支持单一地址:过滤逻辑故意做得很死,就是To字段精确匹配。想要 label、subject 前缀、多目标这些,就改一下过滤函数那 5 行。- REST endpoint 的 bearer token 是可选的:我自己是开着的。就算 endpoint 只读 pending 草稿,"读你信箱队列" 也算信息泄漏。
- MCP 这个洞可能会被补:如果 Claude 的 Gmail MCP 之后支持发信,这整个 Worker 就没用了。无所谓,它够小,删起来不心痛。
收尾
代码在这里:lky1020/gmail-mcp-worker-public。
整件事花了大概两小时(包括 OAuth Playground 那段折腾),换来的是 MCP 写的每一封 "好邮件" 都不再死在草稿夹。如果你也踩过同样的坑,可以试试。
下一步想把自动化再推一层 —— 用 cron 喂 Claude 几个 prompt,让它写好邮件,Worker 安静地把它们送出去。继续观察 👀。
