Skip to content

工具系统:给 AI 双手

没有工具的 AI = 只会说话

语言模型本身只能生成文字。它不能读你的文件、不能执行命令、不能上网搜索。工具就是连接模型和真实世界的桥梁。

Claude Code 通过定义一套标准的工具接口,让模型可以:

  • 读你的代码 → Read 工具
  • 搜索文件内容 → Grep 工具
  • 修改代码 → Edit 工具
  • 执行命令 → Bash 工具
  • ... 以及更多

42 个工具,但你只看到了冰山一角

打开源码中的 src/tools.ts,你会看到工具注册中心——共有 42 个工具。但大部分你从未直接看到过。

为什么?因为每多一个工具,System Prompt 就要多一段描述,token 就要多花一份钱。如果你只是想让 Claude Code 帮你改一行代码,它不需要加载"定时任务调度器"和"团队协作管理器"。

很多工具是延迟加载的——只有当 LLM 需要时,才通过 ToolSearchTool 按需注入到上下文中。

8 个核心工具

虽然总共 42 个,但最核心的是 8 个(它们始终加载):

工具做什么类比
Bash执行任意 shell 命令万能瑞士军刀
Read读取文件内容打开一个文件看
Write创建或覆写文件从头写一个文件
Edit精确替换文件中的某段内容在文件里找到一段话,改成另一段
Grep用正则搜索文件内容全局文本搜索
Glob按文件名模式查找文件"找到所有 .ts 文件"
Task启动一个子 Agent派一个分身去做子任务
TodoWrite结构化的任务追踪待办清单

极简模式

设置环境变量 CLAUDE_CODE_SIMPLE=true,Claude Code 就只剩三个工具:Bash、读文件、改文件。这是给极简主义者的后门——证明 Agent 的核心真的只需要几个工具。

Bash 是万能后门

理论上,仅凭 Bash 一个工具就能做任何事——读文件(cat)、写文件(echo >)、搜索(grep)等等。但专用工具更安全、更可控、输出格式更友好。

Bash 是"最后手段",当其他工具都无法满足需求时使用。正因如此,Bash 的权限检查也是最严格的——18 个文件专门负责审查 Bash 的安全性。

工具长什么样?

每个工具都遵循同一个接口——就像一个"合同",规定了工具需要提供哪些能力:

这个统一接口的好处是:

  • 新增工具很简单:按接口填入内容就行
  • MCP 外部工具和内置工具平等对待:模型不知道区别
  • 权限检查是强制的:每个工具必须声明自己的权限要求

工具是怎么被模型使用的?

整个过程分三步:

第 1 步:注册

启动时,所有内置工具被收集到一个数组。然后与 MCP 外部工具合并,按名称排序去重(内置工具优先)。

第 2 步:调用

模型在回复中说"我要用 Read 工具读 server.js"。这个请求先经过 Zod 验证输入参数,然后经过权限检查,最后执行。

第 3 步:返回

工具执行完成后,结果作为 tool_result 消息发回给模型。模型看到结果后决定下一步做什么。

只读 vs 写入:并发的秘密

这是 Claude Code 最精妙的设计之一。

模型可能在一次回复中请求多个工具调用,比如:"读文件 A、读文件 B、搜索关键字 C、然后编辑文件 D"。

Claude Code 不会傻傻地逐个执行。它用 partitionToolCalls 函数把这些调用智能分区

规则很简单

  • 连续的只读工具(Read, Grep, Glob)→ 并行执行(最多 10 个同时)
  • 写入工具(Bash, Edit, Write)→ 串行执行

为什么这么设计?

读文件不会改变文件,所以多个读操作可以安全地同时进行。但写操作可能互相冲突(比如两个工具同时修改同一个文件),所以必须一个一个来。

这个优化让 Claude Code 在需要"先看几个文件再做决定"的场景下快了好几倍。

安全默认值

注意一个设计细节:buildTool() 函数有安全的默认值

  • 默认 不可并行 (isConcurrencySafe = false)
  • 默认 不是只读 (isReadOnly = false)

这是 fail-closed(失败时关闭)设计——如果开发者忘了标记一个工具为可并行,它不会被意外地并行执行。安全第一。

"先读后改"铁律

这是 Claude Code 一个很精妙的安全设计:FileEditTool 会检查你是否已经用 FileReadTool 读过这个文件。如果没有,直接报错,不让改。

这就是为什么 Claude Code 不会像某些工具那样"凭空写一段代码覆盖你的文件"——它被强制要求先理解再修改

这种"双重确认"模式在生产级 Agent 系统中非常有参考价值:

  • 防止 AI 基于幻觉修改文件
  • 确保每次编辑都基于对文件现有内容的理解
  • 如果文件在两次操作之间被外部修改了,读取步骤会捕获最新状态

MCP:无限扩展

MCP(Model Context Protocol)让你可以给 Claude Code 添加自定义工具。比如:

  • 一个查询数据库的工具
  • 一个调用你公司内部 API 的工具
  • 一个操作浏览器的工具(Playwright)

MCP 工具通过 assembleToolPool 和内置工具混在一起。对模型来说,它们没有区别——都是"我可以用的工具"。

小结

工具系统的核心设计原则:

  1. 统一接口:所有工具遵循同一个合同
  2. 按需加载:42 个工具不全量注入,通过 ToolSearchTool 按需发现
  3. 安全默认:默认不并行、不只读,fail-closed 设计
  4. 先读后改:强制 AI 先理解文件再修改,防止幻觉覆盖
  5. 智能并发:自动把只读操作并行化,写操作串行化
  6. 平等对待:MCP 外部工具和内置工具对模型来说一样

但给 AI 工具是危险的——它可能 rm -rf / 你的项目。怎么防止这种事?来看——安全模型:五层护盾