Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

内置工具全景

Claude Code 的工具不是一张永远不变的菜单。源码中的工具定义只是能力候选;真正发送给 API 的 tools[],还要经过构建版本、平台、会话形态、功能开关、权限规则、Agent 身份、MCP 连接状态和延迟加载共同裁剪。

因此,理解工具系统要同时回答三个问题:源码里是否存在、当前 Agent 是否看得见、这一次具体输入是否被允许执行。

flowchart LR
    A["内置工具候选"] --> D["构建与平台门控"]
    B["运行时 MCP 工具"] --> P["工具池装配"]
    D --> P
    P --> V["会话 / Agent / deny 可见性裁剪"]
    V --> L["ToolSearch 常驻或延迟展开"]
    L --> API["本轮 API 的 tools[]"]
    API --> C["模型提出 tool_use"]
    C --> R["参数校验、权限、Hook<br/>本地进程在适用时再受 Sandbox"]
    R --> E["执行与 tool_result"]

一张表读懂四种“存在”

状态含义
已定义源码中有工具协议与本地执行能力
已注册当前构建和平台把它放入候选池
已暴露当前 Agent 与请求可以看到完整 schema,或可通过 ToolSearch 发现
可执行本次具体参数通过权限、Hook、Sandbox 与外部系统边界

“源码里有”只证明第一层;不能据此推断当前模型一定能调用。

会话、计划与用户沟通

工具架构职责可见条件与边界
Agent(兼容旧名 Task把一个目标交给独立 Agent 上下文,可同步运行、后台运行、恢复,或在团队模式下创建可通信队友;也可请求 worktree 隔离主线程通常可见;普通 Subagent 默认禁止继续递归委派,内部构建和特定进程内队友有窄例外;Agent 类型、后台形态与权限会再次裁剪其能力
AskUserQuestion用结构化选项向用户收集决策,而不是让模型在文本里假装已经得到确认依赖可交互界面;远程 channel 场景会关闭,普通 Subagent 也默认拿不到;属于可延迟工具
SendUserMessage(兼容旧名 Brief在 Brief/助手形态中充当用户主要可见回复通道,并可携带附件不是普通 Claude Code 会话的固定输出方式;只有对应构建能力、用户资格和显式启用条件同时成立才出现。启用后不延迟,因为它是主沟通通道
Config让 Agent 读取或修改受支持的 Claude Code 设置当前注册表只在内部用户构建中加入;它不是任意配置文件编辑器,也不是外部发行版的通用能力
EnterPlanMode请求把主会话权限状态切入 Plan Mode需要相应交互路径;在无法完成退出审批的 channel 场景中与退出工具一起关闭,避免进入后无法离开
ExitPlanMode提交计划、请求批准并恢复执行态;队友需要计划审批时可转交团队负责人对主会话通常需要用户交互;队友可走负责人审批路径。它改变权限状态,但“Plan Mode”本身不等同于内置 Plan Agent 的工具白名单
StructuredOutput在要求 JSON Schema 的非交互请求中,把最终答案收束为唯一的结构化结果不属于普通用户可选工具;只有非交互结构化输出条件成立时才在常规筛选之后追加,并携带该请求专属 schema
Sleep在主动式运行中明确等待下一次唤醒,避免用空文本回合轮询只在主动式/助手相关构建与运行状态中出现;普通交互会话不需要它
Skill以名字调用已发现的 Skill,把声明式工作流引入当前上下文或独立 Fork只接受实际已加载且允许模型调用的 Skill;它不会凭名字执行任意 slash command。Skill 的完整边界见“扩展系统”一章

这里最精妙的设计是:用户沟通、计划切换和结构化输出都被建模为工具协议。模型必须显式表达“提问”“交计划”“提交结构化答案”,运行时才有机会在统一的权限和状态机中处理它们。

文件、代码与本地检索

工具架构职责可见条件与边界
Read读取文本、图片、PDF、Notebook 等工作区内容,并为后续精确编辑建立文件状态读取范围仍受路径权限、工作目录和文件大小预算约束;读取不是写入授权
Edit对既有文件做精确替换依赖已经掌握的文件状态,并检查目标是否被外部修改;受写权限、路径与敏感文件规则约束
Write创建或整体覆盖文件适合新文件或明确的全文替换;同样经过写权限、路径与敏感内容边界
NotebookEdit以单元格为边界修改 Jupyter Notebook与普通文本编辑分离,避免把 Notebook 的结构误当成纯文本;属于可延迟工具
Glob按路径和文件名模式寻找候选文件只回答“哪些路径匹配”,不搜索文件内容;在带嵌入式搜索能力的内部构建中可被 Shell 内的快速搜索替代,因此不一定注册
Grep按正则搜索文件内容,可限定类型、目录和输出形态只回答“哪些内容匹配”,不负责互联网或工具发现;与 Glob 一样可能被内部嵌入式搜索替代
LSP通过语言服务器获取定义、引用、符号、悬停与调用层次等语义信息只有环境开关允许且语言服务器已连接时才可见;它是语义索引,不是纯文本搜索的替代品

文件工具共享的是工作区边界,却故意拆成不同意图:发现路径、搜索内容、读取上下文、局部修改、整体写入、结构化 Notebook 修改。拆分让权限提示、审计记录和模型选择都更准确。

Shell、网页与运行环境

工具架构职责可见条件与边界
Bash执行必须通过 Shell 完成的系统命令,可在条件允许时转为后台任务默认本地 Shell 能力;具体命令还要经过命令语义、规则权限和 Sandbox。后台任务关闭时,后台参数不会暴露给模型
PowerShell在 Windows 上提供与 PowerShell 语义和权限规则一致的命令通道仅 Windows;内部构建默认启用但可关闭,外部构建需显式启用。它不是 macOS/Linux 上 Bash 的别名
WebFetch已知 URL 后抓取并提炼页面内容是“取回指定页面”,不是搜索引擎;私有或需登录页面应优先使用对应 MCP。主机权限仍可要求确认;属于可延迟工具
WebSearch在外部互联网中寻找当前信息依赖 API 提供方与模型是否支持服务端网页搜索;第一方、受支持的 Vertex/Foundry 路径可用,其他提供方不应假定存在;属于可延迟工具
REPL在内部 REPL 形态中用一个受控入口包裹 Bash、文件和检索等原语只在内部用户构建且 REPL 模式启用时注册;启用后原始 BashReadEditWriteGlobGrepNotebookEditAgent 会从模型直连工具中隐藏,避免两套入口并存

专用工具优先于 Shell,不只是使用体验问题。专用工具有更窄的输入协议、更清晰的权限语义和更稳定的结果结构;Shell 是无法被专用能力表达时的通用逃生口。

任务、后台进程与 Agent Teams

任务体系有两层,不能混为一谈:一层是 Agent 自己的工作清单,另一层是已经启动的后台执行单元。

工具架构职责可见条件与边界
TodoWrite维护旧版的会话内待办清单仅在新版 Task 列表未启用时出现
TaskCreate在新版任务列表中创建带主题、描述、状态和依赖关系的任务新版 Task 模式启用时出现;交互模式默认使用,新版能力也可在非交互模式显式开启
TaskGet按任务 ID 读取完整任务同上;只读
TaskList查看任务列表与阻塞关系同上;只读
TaskUpdate更新状态、负责人、依赖与元数据,也可删除任务同上;在 Agent Teams 中还承担认领任务和通知新负责人的协作语义
TaskOutput读取后台 Agent 或 Shell 任务的状态和输出外部构建仍保留兼容入口,但描述已标为弃用,首选直接读取任务输出文件;兼容旧名 AgentOutputToolBashOutputTool
TaskStop终止正在运行的后台任务兼容旧名 KillShell;只管理已经注册的后台任务,不是任意进程终止器
SendMessage在 Agent Teams 中点对点或广播消息,并承载关机、计划审批等结构化协议只有 Agent Teams 总开关成立时启用;普通消息与结构化控制消息的路由边界不同,跨会话桥接还要额外授权
TeamCreate建立团队上下文、负责人身份和共享任务命名空间仅 Agent Teams;创建的是协作平面,不等于立即生成所有队友
TeamDelete在所有成员结束后清理团队、任务目录和关联 worktree仅 Agent Teams;存在活动成员时拒绝清理,防止把仍在运行的协作状态拔掉

TodoWriteTaskCreate 等不是同一批工具的两个名字。它们是两套任务模型之间的运行时切换;而 TaskOutputTaskStop 管的是后台执行生命周期。

Worktree 与调度工具

工具架构职责可见条件与边界
EnterWorktree创建隔离的 Git worktree,并把当前会话的有效工作目录切过去当前快照中 worktree 能力全局开启;真正进入仍要求可创建 worktree 的仓库或配置 Hook
ExitWorktree返回原工作目录,并选择保留或清理 worktree清理前检查未提交与未合并状态;需要显式确认危险清理,不是简单的目录切换
CronCreate为当前 Agent 安排一次性或周期性 Prompt;可选择仅会话内或持久化只有 Agent Trigger 构建能力和运行时 Cron 开关都成立才出现;队友创建的任务会回到对应队友
CronList列出当前可见的定时任务同上;只读
CronDelete删除指定定时任务同上;只删除当前调度命名空间里的任务
RemoteTrigger管理并运行远端 Agent Trigger需要远端 Trigger 构建能力、运行时开关和远程会话策略同时允许;它管理远端调度,不等于本地 Cron*

Worktree 是文件系统隔离层,Cron/RemoteTrigger 是时间与唤醒层。它们都改变 Agent 的运行环境,但不会替代权限系统。

MCP 工具与资源工具

工具架构职责可见条件与边界
动态 mcp__服务__工具把 MCP Server 的工具声明适配成 Claude 工具协议Server 连接并返回工具后动态产生;通常加完全限定前缀,SDK 的显式 no-prefix 模式是例外。alwaysLoad 元数据可阻止延迟加载
mcp__服务__authenticate在需要认证而真实工具尚不可用时,向模型暴露 OAuth 启动能力只对处于需认证状态且传输类型支持相应流程的 Server 生成;认证完成后真实工具会替换它
ListMcpResourcesTool枚举已连接 MCP Server 提供的资源 URI 和元信息只有至少一个已连接 Server 声明 resources 能力时追加;全局只需一组帮助工具
ReadMcpResourceTool按 Server 和 URI 读取一个 MCP 资源与资源列表工具成对出现;资源是数据对象,不是可执行工具
内部 MCPTool 适配模板为动态 MCP 工具提供统一权限、进度、结果和 UI 契约它本身的占位名不会作为普通业务工具发送;每个 Server 工具会覆盖名称、schema 与描述后进入工具池

MCP 的关键边界是:Server 决定“提供什么能力”,Claude Code 决定“如何命名、何时暴露、怎样授权、如何接回 tool result”。MCP 不能绕过本地 deny 与 Hook;本地 Sandbox 只约束适用的本地执行路径,远端 Server 的副作用还要依赖 MCP 权限和外部系统自身授权。Server 提供的只读/破坏性注解也只是决策信号,不是最终授权。

ToolSearch:工具目录的搜索入口

ToolSearch 不搜索文件、代码或互联网。它搜索的是当前已知但尚未展开 schema 的工具

默认策略会把多数 MCP 工具以及标记为可延迟的内置工具保留为名称,把 ToolSearch 本身常驻。模型选中匹配项后,结果中的工具引用使完整 schema 进入后续请求。具体启用还受模型能力、提供方、禁用开关、ToolSearch 自身可见性与模式影响;只有自动模式才主要按工具定义占上下文的比例决定是否延迟。

下一章会单独展开它与 GlobGrepWebSearch、MCP resources 的区别。

仅在条件构建中出现的注册项

当前 src/tools.ts 还引用一组按内部用户、环境变量或构建 Feature 裁剪的工具:TungstenSuggestBackgroundPRWebBrowserOverflowTestCtxInspectTerminalCaptureVerifyPlanExecutionWorkflowMonitorSendUserFilePushNotificationSubscribePRSnipListPeers

这些模块没有全部包含在当前源码快照中。能从现有源码确认的是它们的注册条件和在工具池中的位置,不能可靠还原的执行语义不在本教程中推测。TestingPermission 则明确只服务测试环境,用来验证“总是要求权限”的端到端流程,不属于生产能力。

这组条件注册项说明:Claude Code 会在构建期就裁掉不属于某发行形态的能力,而不只是运行时把它们隐藏起来。

三种会让工具池整体变形的模式

简化模式

简化模式把能力缩到 BashReadEdit;若 REPL 模式同时启用,则只保留 REPL 包装入口。协调者模式可额外保留必要的委派和停止能力。

协调者模式

协调者只保留 AgentTaskStopSendMessageStructuredOutput 等编排能力,把实际读写和命令执行交给 Worker。这不是“协调者自觉不写文件”,而是请求中的能力图已经移除了执行工具。

Agent 与后台模式

Subagent 会按自己的权限模式从会话候选重新装配基础池,再按定义、同步/后台身份和团队身份裁剪;只有 Fork 精确复制父工具快照。基础池 MCP 与 Agent 专属 MCP 还有不同装配路径,详见“工具能力图”和“Subagent 构造”。

设计结论

Claude Code 没有把所有动作塞进一个万能终端工具,而是把工具系统分成四层:

  1. 小而稳定的内置协议;
  2. 按构建、平台与会话形态裁剪的候选池;
  3. 由 MCP、Plugin、Agent 与结构化输出动态追加的能力;
  4. 在每次调用时生效的权限、Hook 与 Sandbox。

这样既能让模型获得开放扩展能力,又不会把“模型看得见工具”错误地等同于“模型拥有执行权”。

源码定位

  • 工具注册表与条件门控:src/tools.ts
  • 工具公共协议:src/Tool.ts
  • 工具池合并、排序与协调者裁剪:src/hooks/useMergedTools.tssrc/utils/toolPool.ts
  • Agent 工具裁剪:src/tools/AgentTool/agentToolUtils.tssrc/constants/tools.ts
  • 各内置工具:src/tools/
  • Shell 与平台门控:src/utils/shell/shellToolUtils.ts
  • MCP 动态工具、认证与资源:src/services/mcp/client.tssrc/tools/MCPTool/src/tools/McpAuthTool/src/tools/ListMcpResourcesTool/src/tools/ReadMcpResourceTool/
  • 结构化输出工具:src/tools/SyntheticOutputTool/SyntheticOutputTool.tssrc/main.tsx
  • ToolSearch:src/tools/ToolSearchTool/src/utils/toolSearch.ts