What if you don't need MCP at all?

Got Bash and some code interpreter? Skip MCP.

mariozechner.at

本文探讨了在 AI Agent 开发中,开发者是否真的需要模型上下文协议(MCP)。作者 Mario Zechner 指出,虽然 MCP 备受关注,但许多流行的 MCP 服务器(如 Playwright 或 Chrome DevTools MCP)过于臃肿,动辄占用数万个 Token(约占 Claude 上下文的 7%-9%),且难以扩展和组合。

作者提出了一种更简单、高效的替代方案:拥抱 Bash 脚本和原生代码。通过编写极简的 Node.js 脚本(利用 Puppeteer Core)并配合一份仅约 200 Token 的 README 说明,Agent 就能实现浏览器自动化、网页截图、执行 JS 和交互式元素选择等功能。这种方法的优势在于:1. 极高的 Token 效率,利用了模型已有的编程知识;2. 强大的组合性,脚本输出可直接存入文件或通过管道传输;3. 极易扩展,开发者可以随时让 AI 为自己编写新的工具脚本。

作者通过构建一套“浏览器工具集”展示了这一理念,包括启动浏览器、导航、执行 JS、截图、交互式选取元素(Pick Tool)以及获取 Cookie。最后,作者分享了如何通过设置环境变量和别名,在不同的 Agent(如 Claude Code)中复用这些工具,并呼吁开发者跳出 MCP 的框架,回归简单、灵活的开发模式。


主题:MCP 的局限性与 Bash 方案的兴起

当前 AI 圈对 MCP(Model Context Protocol)服务器推崇备至,但作者认为这种方式存在明显的效率问题。首先是 Token 消耗巨大:为了涵盖所有应用场景,流行的 MCP 服务器(如 Playwright MCP)通常包含数十个工具和冗长的描述,这会占用 Agent 大量的上下文空间,甚至导致模型混淆。其次是 扩展性差:修改现有的 MCP 服务器需要深入理解其代码库,这对开发者和 Agent 来说都是负担。最后是 缺乏组合性:MCP 的输出必须经过 Agent 上下文才能进行后续处理,无法像 Unix 命令那样通过管道或文件轻松协作。

相比之下,Agent 天生擅长编写代码和运行 Bash 命令。作者主张回归“简单即美”的原则,让 Agent 直接调用轻量级的 CLI 工具。这种方式不仅节省了 90% 以上的 Token 成本,还赋予了 Agent 更大的自由度,使其能够根据任务需求动态生成或调整工具。

主题:构建极简浏览器工具集

作者展示了一套基于 Node.js 和 Puppeteer Core 的极简工具集,仅通过一份 225 Token 的 README 就能让 Agent 掌握以下能力:

  • 启动工具 (start.js):支持启动全新的浏览器实例,或通过 rsync 快速同步用户的 Chrome 配置文件(包含登录状态和 Cookie),以便在受限页面进行抓取。
  • 导航工具 (nav.js):允许 Agent 在当前标签页或新标签页中跳转至指定 URL。
  • JS 执行工具 (eval.js):Agent 可以直接在页面上下文中执行任意 JavaScript 代码,利用 DOM API 读取或修改网页内容。
  • 截图工具 (screenshot.js):将当前视口保存为临时图片文件,Agent 随后可利用视觉能力进行分析。

这些工具的实现代码非常精简,通常只有几十行。由于模型已经具备深厚的 Web 开发知识,它们只需要知道如何调用这些脚本,而不需要冗长的 API 文档。

主题:动态扩展与交互式工具

这种“代码即工具”模式的最大魅力在于其灵活性。作者演示了如何快速添加一个“Pick Tool”(元素选择器):当 Agent 难以分析复杂的 DOM 结构时,开发者可以运行该脚本,在浏览器中直接点击目标元素,脚本会将选中的元素信息(Tag、ID、Class、HTML 片段等)返回给 Agent。

此外,针对 MCP 难以处理的 HTTP-only Cookie 获取问题,作者仅用一分钟让 Claude 编写了一个专门的脚本并加入 README,问题便迎刃而解。这种“按需定制”的速度是传统 MCP 模式无法比拟的。

主题:跨 Agent 的复用与部署

为了在不同的 Agent 环境(如 Claude Code 或其他 CLI Agent)中复用这些工具,作者推荐了一套工程化方案:

  1. 集中管理:将所有工具脚本存放在家目录下的 agent-tools 文件夹中。
  2. 环境变量优化:通过设置 PATH 别名,让 Agent 可以在任何工作目录下直接调用这些脚本,无需频繁切换目录。
  3. 命名规范:为脚本添加前缀(如 browser-tools-)以避免命令冲突。
  4. 上下文注入:在 Agent 启动时,通过 /add-dir 或直接引用 README 文件,让 Agent 快速加载工具说明。这种方式比 Anthropic 的自动技能发现更可靠且更省 Token。

问答

问:为什么作者认为 MCP 服务器在 Token 使用上是不划算的? 答:因为 MCP 服务器为了通用性,提供了大量工具和详尽描述。例如 Playwright MCP 占用约 1.37 万 Token,而作者的 Bash 方案 README 仅需 225 Token。模型本身懂编程,不需要重复学习基础 API。

问:Bash 脚本方案在“组合性”上有什么优势? 答:Bash 脚本的输出可以重定向到文件或通过管道传递给其他命令,Agent 可以链式调用多个工具。而 MCP 的结果必须先返回给 Agent 上下文,增加了处理环节和 Token 消耗。

问:如何解决 Agent 需要登录状态进行网页抓取的问题? 答:作者的 start.js 脚本提供了一个 --profile 参数,它会将用户本地的 Chrome 配置文件同步到临时目录并启动调试模式,使 Agent 能直接继承用户的登录 Session。

问:如果 Agent 无法理解复杂的网页结构,作者提供了什么解决方案? 答:作者开发了一个交互式的 pick.js 工具。开发者可以在浏览器中手动点击选择元素,脚本会将该元素的详细元数据返回给 Agent,从而辅助其编写准确的抓取逻辑。

问:这种方案对非技术用户友好吗? 答:相对不友好。这种方案更适合开发者,因为它需要一定的脚本编写和环境配置能力。但对于开发者而言,它提供了比 MCP 更高的自由度和执行效率。