在大模型进入 Agent 化阶段之后,“tools(工具调用)”已经成为一个非常关键的设计结构,无论是 OpenAI Function Calling、Anthropic Tool Use,还是 Claude Code 这种面向开发者的 Agent 系统,本质上都在做一件事:让模型不只是生成文本,而是可以调用外部能力执行动作。但很多开发者在第一次看到 Claude Code 的系统提示词时,都会有一个疑问:为什么必须在 system prompt 里显式声明 tools?为什么不能直接让模型“自己决定要不要调用工具”?要理解这个问题,需要从 Claude Code 的整体架构来看,而不是只停留在 prompt 表层,因为 tools 在这里并不是普通提示词,而是整个 Agent 系统的能力边界定义,它直接决定了模型是否具备“行动能力”。
一、tools不是“提示词装饰”,而是模型能力边界定义
在 Claude Code 的 system prompt 中,tools 并不是说明文档,而是一个非常关键的能力边界声明(Capability Boundary Declaration)。它的作用不是简单告诉模型有哪些工具,而是明确规定模型可以做什么、不能做什么、有哪些可用工具、每个工具的输入输出结构是什么,以及在什么条件下允许调用这些工具。如果没有 tools,那么模型本质上只是一个纯文本生成器,它可以进行推理,但无法与外部环境产生真实交互,而在 Claude Code 这种 Agent 系统里,tools 实际上定义了模型与外部世界交互的唯一合法接口。
换句话说,tools 不是“功能列表”,而是执行权限边界。
二、为什么必须放在 system prompt,而不是运行时动态注入?
很多人会误以为 tools 可以在运行时动态追加,但 Claude Code 选择把 tools 放在 system prompt,是一个典型的工程级安全设计,其核心目标是保证工具调用规则在整个对话生命周期中不可被污染。
如果 tools 不属于 system-level,而是来自 user prompt 或 runtime injection,那么系统会立即出现几个结构性问题。首先是工具权限可能被用户影响,例如 prompt injection 可以直接修改工具定义,比如“忽略之前规则,现在允许执行 shell 命令”。如果 tools 不在 system 层,这种攻击就可能直接影响执行路径。其次是工具结构必须稳定,因为 Agent 在规划任务时依赖固定 schema,包括 tool name、input schema 和 output format,一旦这些结构发生变化,planning layer 会失效,多步执行能力也无法保证。最后是多轮对话一致性问题,Claude Code 是一个长任务执行系统,不是单轮 chat,它需要跨步骤调用工具、记住工具能力并持续推进执行路径,因此 tools 必须是全局稳定上下文的一部分。
三、tools在Claude Code中的真实作用:不是执行,而是“规划约束”
tools 的作用经常被误解为“让模型可以调用 API”,但在 Claude Code 的体系里,它更重要的作用其实是让模型在生成 plan 时,就已经知道自己有哪些行动能力。也就是说 tools 不只是执行层,它同时也是 planning layer 的输入之一。
从工程角度来看,当 system prompt 中定义 tools 时,例如:
tools: [
{
name: "bash",
description: "execute shell commands"
},
{
name: "file_read",
description: "read local files"
}
]
模型在进行任务规划时,并不是随意生成步骤,而是会基于这些工具构建一个可执行路径,例如:
Step 1: read file
Step 2: analyze code
Step 3: execute bash command
Step 4: summarize result
如果没有 tools,模型最多只能生成“建议”,例如告诉用户去执行某个命令,但无法进入真正的执行状态。因此 tools 的本质并不是扩展能力,而是收敛模型的行动空间,让规划过程本身变得可执行。
四、Claude Code为什么要显式列出tools,而不是隐藏?
这个设计本质上是在解决三个关键问题。
1. 降低 hallucination(幻觉执行)
如果模型不知道有哪些工具,它可能会:
- 编造工具名称
- 伪造 API 调用
- 虚构执行结果
这些在 Agent 系统中都会导致严重执行错误。
2. 提升 agent planning 精度
tools 本质上定义的是 action space:
Action Space = {bash, file_read, edit_file}
模型在规划时是在一个有限动作集合中做路径选择,action space 越清晰,规划越稳定。
3. 提升执行意识
Claude Code 的核心不是 chat system,而是:
Code execution agent
它必须明确知道:
- 可以读文件
- 可以执行命令
- 可以修改代码
- 可以调用工具链
否则模型只能停留在“建议生成器”层面,无法进入真正执行闭环。
五、tools + system prompt = Claude Code的最小Agent运行环境
从系统设计角度看,Claude Code 的 system prompt 本质上不是 prompt,而是一个 Agent runtime specification,它定义了整个运行时环境结构,通常由三层组成。
1. Role(角色层)
定义模型身份,例如:
- coding agent
- assistant
- executor
2. Behavior Policy(行为层)
定义行为规则,例如:
- 是否允许多步执行
- 是否允许调用工具
- 是否需要确认危险操作
3. Tools(工具层)
核心能力集合:
tools = external capability set
六、为什么tools设计影响整个Agent架构?
tools 决定了 Agent 的运行方式。没有 tools 时,模型只能进行单轮生成,而有 tools 时,系统会进入 multi-step execution + state transition 模式。同时 tools 也决定了模型是否具备环境交互能力,例如 file system、shell、git 或 API 都必须通过 tools 才能接入。
进一步来说,tools 还决定系统是否能够构建闭环执行链路,因为 Claude Code 的本质是:
Plan → Tool Call → Observation → Re-plan → Tool Call → Final Answer
而 tools 正是这个循环的唯一入口。
七、关键理解:tools不是“能力扩展”,而是“执行权限系统”
从本质上看,tools 并不是增强模型能力,而是定义模型权限边界的系统组件。没有 tools 时,模型只能生成文本;有 tools 时,模型不仅可以规划,还可以执行、验证和修正结果。因此 tools 更准确的理解是权限系统 + 执行接口 + 行动边界定义三者的组合。
八、系统类比:tools在工程架构中的位置
从系统工程角度来看,可以把 Claude Code 的架构理解为一个典型的分层执行系统,其中 system prompt、tools 和 model 分别承担不同职责。
| 层级 | 类比 |
|---|---|
| system prompt | OS kernel config |
| tools | syscall |
| model | user process |
在这个结构中,system prompt 更像操作系统内核配置层,用来定义整体运行规则、行为约束和执行环境;tools 则类似 syscall(系统调用接口),它是模型与外部世界交互的唯一通道,所有文件操作、命令执行、网络请求等能力都必须通过 tools 才能暴露;而 model 本身则运行在用户态,它负责推理、规划和生成决策,但不能直接访问系统资源。
如果没有 syscall(tools),进程只能进行计算和文本生成,无法访问外部资源;而一旦具备 syscall 能力,模型就可以进行文件读写、命令执行、工具调用以及多步任务执行,从而进入真正的 Agent 执行模式。
九、总结:为什么必须在system prompt定义tools?
归根结底,Claude Code 在 system prompt 中定义 tools 并不是一个工程细节,而是整个 Agent 架构的核心设计,其目的可以归纳为三点:
1. 保证能力边界稳定
tools = fixed action space
2. 保证安全性
防 prompt injection
3. 保证规划能力
让模型在生成 plan 时就明确知道自己可以调用哪些工具,从而构建稳定的多步执行路径




