第 9 章 · MCP 与工具扩展协议
04 · MCP 的边界
MCP 是扩展机制,不是主线逻辑。先有本地核心能力,再谈外部扩展。
MCP 解决的问题和不解决的问题
MCP 解决的问题:
- 怎么接入外部工具——标准化的协议,不改 agent 代码
- 怎么管理工具生命周期——子进程隔离,启动/发现/调用/关闭
- 怎么让不同 agent 共享工具——同一个 MCP server,多个 agent 可用
MCP 不解决的问题:
- 怎么设计好用的工具——描述是否清晰、参数是否合理、结果是否有用
- 怎么让模型正确使用工具——这还是系统提示词和工具描述的责任
- 怎么保证外部工具的可靠性——MCP server 是第三方提供的,质量不可控
理解这些边界很重要。MCP 是一个传输层——它让工具可以被调用,但不保证工具本身的质量。
先有核心能力,再谈外部扩展
这个原则贯穿整个课程的设计:
| 章节 | 核心能力 | 扩展机制 |
|---|---|---|
| 第 3 章 | 8 个内置工具 | — |
| 第 7 章 | 3 个内置 skill | SkillRegistry 可注册新 skill |
| 第 8 章 | 审计日志 hook | HookManager 可注册新 hook |
| 第 9 章 | MCP client | 接入任意 MCP server |
先有内置工具,保证 agent 在任何环境下都有基本能力。然后提供扩展机制(skill、hook、MCP),让用户按需增强。
如果一个 agent 连基本的文件搜索和代码修改都做不好,给它接入 100 个 MCP server 也不会变强。工具的质量比数量重要。
安全考虑
MCP 工具在独立子进程中运行,但这不代表它是安全的:
- MCP 工具可以执行任意操作(网络请求、文件系统访问)
- MCP server 可能返回误导性的工具描述
- 恶意的 MCP server 可能注入虚假的工具调用结果
在当前实现中,MCP 工具也受到权限系统的管控——permissionGuard 会检查所有工具调用,包括 MCP 工具。所以 MCP 工具如果需要写文件或执行命令,仍然需要用户确认。
版本更新
main.ts 的版本号从 v0.8.0 升级到 v0.9.0。
本章回顾
第 9 章实现了 MCP 工具扩展,让 agent 从封闭工具箱升级为可扩展平台:
| 新增 | 文件 | 作用 |
|---|---|---|
| MCP 类型 | src/mcp/types.ts | JSON-RPC、工具定义、配置等类型 |
| McpClient | src/mcp/client.ts | 连接 MCP server、发现和调用工具 |
| wrapMcpTool | src/mcp/client.ts | 桥接 MCP 工具到内部 Tool 接口 |
| MCP 集成 | src/main.ts | 从环境变量加载配置、合并工具列表 |
加上之前章节的测试,整个项目现在有 173 个测试用例。
课程进展回顾
到第 9 章结束时,mini-coding-agent 已经从一个"只能调模型 API 的脚本"演进为一个功能完整的 coding agent:
| 能力 | 章节 | 状态 |
|---|---|---|
| 最小 agent | 第 1 章 | 完成 |
| ReAct 循环 + 计划 | 第 2 章 | 完成 |
| 完整工具箱 | 第 3 章 | 完成 |
| 权限系统 | 第 4 章 | 完成 |
| 事件流 + 终端渲染 | 第 5 章 | 完成 |
| 记忆 + 上下文工程 | 第 6 章 | 完成 |
| Skill 能力模块 | 第 7 章 | 完成 |
| Hook 生命周期 | 第 8 章 | 完成 |
| MCP 工具扩展 | 第 9 章 | 完成 |
还剩第 10 章(Multi-Agent 协作)和第 11 章(CLI 产品化)。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。