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 都去哪了
把每一轮实际送出去的内容拉出来看:
- Tool schema 常驻 context。 4 个 MCP tool 的 schema,每一轮 都在,不管 agent 这一轮有没有动邮件。用户还没说话,先垫了 ~700 token。
- 邮件正文是裸 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。
数字
| 指标 | MCP | CLI |
|---|---|---|
| 平均正文给 LLM 看的体积 | 6,200 B | ~500 B |
| 常驻 context 的 schema | ~700 token | 0 |
| 安装 | Python 环境 | 3.7 MB 二进制 |
| 代码量 | — | ~250 行 |
代码开源:zhaidewei/molk。
经验总结
现成的 agent 工具默认都是”全都摆给你看”的风格。这在你不知道谁 会来调它时是合理的默认;但当你自己在调它、又完全清楚你的模型 真正需要看什么时,这个默认就反过来变成累赘。便宜的做法是把工具 也当成你该自己 own 的东西,而不仅仅是装上的现成品。