01 · MCP 是什么
Model Context Protocol 让 agent 的工具能力不再写死在代码里——通过标准协议接入外部工具服务器。
工具能力的瓶颈
到第 8 章结束时,agent 有 8 个内置工具:search、glob、read_file、write_file、patch_file、run_command、git_status、git_diff。加上计划工具(create_todos、update_todo),一共 10 个。
这些工具覆盖了"在本地代码仓库中读写跑验"的核心能力。但现实中,agent 可能还需要:
- 查询 GitHub Issues
- 搜索在线文档(React 官方文档、MDN 等)
- 操作数据库
- 调用内部 API
每加一个工具,都要在 src/tools/ 下新建文件、修改 tools/index.ts 导出、更新系统提示词中的工具列表。工具越多,维护成本越高。
而且,不同的团队、不同的项目需要不同的工具组合。如果把所有工具都内置,agent 会变得臃肿;如果不内置,用户又没法扩展。
MCP:标准化的工具扩展协议
MCP(Model Context Protocol)是 Anthropic 提出的一个开放协议,解决的就是这个问题:让 agent 能通过标准协议接入外部工具服务器,而不是把每个工具都写死在主进程中。
类比一下:MCP 之于 agent,就像 USB 之于电脑。电脑不需要把所有外设都做进机身——只要有一个标准的 USB 接口,任何符合标准的设备都能插上用。MCP 就是 agent 的"USB 接口"。
没有 MCP 时:
agent 内置工具 → 写死在代码里
新增工具 → 改代码、发版
有了 MCP 后:
agent 内置工具 → 核心能力(搜索、读写、执行)
agent MCP client → 标准接口
MCP server → 外部工具(Issue 查询、文档搜索等)
新增工具 → 启动一个 MCP server,不改 agent 代码MCP 的通信方式
MCP 使用 JSON-RPC 2.0 协议,通过 stdio(标准输入/输出)通信:
agent (client) MCP server (子进程)
│ │
│── initialize ──────────────→│ 握手
│←─ result ──────────────────│
│ │
│── tools/list ──────────────→│ 发现工具
│←─ [tool1, tool2, ...] ─────│
│ │
│── tools/call {name, args} →│ 调用工具
│←─ {content, isError} ──────│流程很简单:
- 启动。 agent 启动 MCP server 子进程(比如
npx my-mcp-server)。 - 握手。 agent 发送
initialize请求,交换能力信息。 - 发现。 agent 发送
tools/list,获取 server 暴露的所有工具定义。 - 调用。 agent 发送
tools/call,传入工具名和参数,获取执行结果。
为什么适合 coding agent
Claude Code、Cursor、Windsurf 等产品都已经支持 MCP。原因有三:
1. 标准化。 同一个 MCP server 可以被不同的 agent 使用。团队做了一个"查询内部 Issue 系统"的 MCP server,Claude Code 能用,Cursor 也能用,我们的 mini-coding-agent 也能用。
2. 隔离。 MCP server 在独立进程中运行。它崩溃了不影响 agent;它用到的依赖(npm 包、API 密钥)不会污染 agent 的运行环境。
3. 按需加载。 不需要 MCP 工具的团队不用配置任何东西。需要了就加一个环境变量,agent 自动发现和加载。
MCP 不是万能的
MCP 解决的是"怎么接入外部工具",不是"怎么设计好用的工具"。一个设计糟糕的 MCP tool——描述不清、参数复杂、结果格式混乱——模型调用它也不会有好结果。
所以在实现 MCP 支持之前,agent 的内置工具已经设计好了清晰的接口和描述。MCP 是锦上添花,不是雪中送炭。
下一节实现 MCP client。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。