Dewei Zhai

2026-05-13

用 CLI,不用 MCP

把现成的 Outlook MCP 退役,换成自己写的 250 行 Rust CLI。LLM 实际看到的邮件正文从 6,200 字节降到约 500,常驻 context 里的 700 token tool schema 也省了。

起手

我有一个小 agent 帮我筛 Outlook 收件箱。一开始用的是最显而易见 的方案:现成的 Outlook MCP server(Python,4 个 tool)。能跑。 但每一轮都贵得离谱,延迟也比”帮我总结这封邮件”该有的代价大。

token 都去哪了

把每一轮实际送出去的内容拉出来看:

  1. Tool schema 常驻 context。 4 个 MCP tool 的 schema,每一轮 都在,不管 agent 这一轮有没有动邮件。用户还没说话,先垫了 ~700 token。
  2. 邮件正文是裸 HTML。 MCP 把 Outlook 返回的原样吐出来—— 一封普通邮件 6,200 字节,绝大部分是 tracking pixel、内联 CSS、 签名图。LLM 一点都用不上。

替换

我把 MCP 退役,换成自己写的 Rust CLI:四个动作不变(list、read、 draft、send),agent 像调任何 shell 命令一样调它。

  • HTML 转纯文本,附件和内联图全丢掉:每封正文 6,200 → 2,386 字节
  • 字段也裁了,只留发件人、主题、纯文本正文——LLM 实际读到的是 约 500 字节
  • 因为是 CLI,tool schema 不再”住”在 input context 里。Agent 看到的是它早就会用的 shell。

数字

指标MCPCLI
平均正文给 LLM 看的体积6,200 B~500 B
常驻 context 的 schema~700 token0
安装Python 环境3.7 MB 二进制
代码量~250 行

代码开源:zhaidewei/molk

经验总结

现成的 agent 工具默认都是”全都摆给你看”的风格。这在你不知道谁 会来调它时是合理的默认;但当你自己在调它、又完全清楚你的模型 真正需要看什么时,这个默认就反过来变成累赘。便宜的做法是把工具 也当成你该自己 own 的东西,而不仅仅是装上的现成品。


想聊聊?和我的助理辩一辩,或者给我留个言