Book 第三十章:把所有工具重新挂回一张地图
第六部分:迁移与附录

第三十章:把所有工具重新挂回一张地图

把所有工具按作用、设计思路和运行时处理方式重新挂回一张总索引。

1. 先说边界

这篇文档的目标不是“逐行解释每个工具文件”,而是把这份快照里能看到的工具系统先拆成一个总地图。

我重点回答四个问题:

  1. Claude Code 到底把哪些东西当成 tool
  2. 工具池是怎么动态装配出来的
  3. 每个工具大概干什么,设计思路是什么
  4. Claude Code 在工具之上又做了哪些额外处理

先说明一个边界:

这份仓库快照不是完整源码。

所以这里会出现三种情况:

  • 能看到完整实现的工具
  • 只能看到注册入口或 prompt 的工具
  • 能看到“工具原型”,但真正实例是在别的运行时模块里动态生成的工具

这不是分析问题,是快照边界本身如此。

相关横切专题:

2. 工具池不是固定数组,而是动态装配

源码锚点:

  • src/tools.ts:179
  • src/tools.ts:199
  • src/tools.ts:273
  • src/tools.ts:332
  • src/tools.ts:366

Claude Code 的工具池装配逻辑,核心在 src/tools.ts

2.1 它先有一个“基础工具全集”

getAllBaseTools() 是基础全集。

这里面已经包含:

  • 常驻核心工具
  • feature flag 工具
  • 用户类型相关工具
  • 模式相关工具

2.2 然后再按运行模式做裁剪

getTools() 里又会继续按这些条件过滤:

  • simple mode
  • repl mode
  • coordinator mode
  • worktree mode
  • deny rules
  • tool.isEnabled()

也就是说,Claude Code 真正给模型看的不是“仓库里有多少工具”,而是:

当前上下文下允许出现的那一小撮工具。

2.3 最后再跟 MCP 工具合并

assembleToolPool() 会把:

  • 内建工具
  • MCP 动态工具

合并起来,然后:

  • 先按 deny rules 过滤
  • 再按名字排序,保证 prompt cache 稳定
  • 再按名字去重,内建工具优先

这很能说明 Claude Code 的设计思路:

工具池是 runtime 产物,不是源码目录产物。

3. 工具池装配图

flowchart TD
    A["src/tools.ts:getAllBaseTools()"] --> B["基础内建工具全集"]
    B --> C["getTools(permissionContext)"]
    C --> D["simple / repl / coordinator / worktree / feature flag 过滤"]
    D --> E["deny rule 过滤"]
    E --> F["isEnabled() 过滤"]
    F --> G["当前内建工具池"]

    H["appState.mcp.tools"] --> I["MCP 工具"]
    I --> J["deny rule 过滤"]

    G --> K["assembleToolPool()"]
    J --> K
    K --> L["按名字排序 + 去重"]
    L --> M["最终可见工具池"]

4. 我建议先把工具分成五大类

这份快照里的工具,我建议这样看:

  1. 代码与文件操作工具
  2. Web / 搜索 / 外部资源工具
  3. agent / 技能 / 协作工具
  4. 计划 / 任务 / 工作流工具
  5. 环境 / 扩展 / 运行时辅助工具

这个分类不是作者显式写在代码里的,但非常贴合 Claude Code 的运行时边界。

5. 第一类:代码与文件操作工具

这类工具的共同特点是:

  • 离代码和本地文件最近
  • 权限约束最重
  • transcript 优化最多
  • 最容易和 Bash 形成边界

5.1 BashTool

  • 作用:执行 shell 命令。
  • 设计思路:不是“跑命令”,而是“命令执行子系统”。
  • 实现方式:src/tools/BashTool/BashTool.tsx + bashPermissions.ts + readOnlyValidation.ts + pathValidation.ts + shouldUseSandbox.ts
  • Claude Code 额外处理:只读判定、compound command 分解、sandbox、后台任务、自动后台化、大输出落盘、图片输出识别、模型结果和 UI 结果分离。
  • 深拆文档:核心拆解 03:BashTool 子系统

5.2 PowerShellTool

  • 作用:执行 Windows PowerShell 命令。
  • 设计思路:不是单纯“Bash 的 Windows 版”,而是平行移植了一套权限与安全模型。
  • 实现方式:src/tools/PowerShellTool/PowerShellTool.tsx + powershellPermissions.ts + readOnlyValidation.ts + pathValidation.ts + modeValidation.ts
  • Claude Code 额外处理:尽量和 Bash 保持权限语义一致,但保留 PowerShell 自己的解析与安全检查。

5.3 FileReadTool

  • 作用:读文本、图片、PDF、notebook。
  • 设计思路:不是“读文件字符串”,而是“统一文件读取协议”。
  • 实现方式:src/tools/FileReadTool/FileReadTool.ts
  • Claude Code 额外处理:路径标准化、读权限校验、二进制文件阻断、图片/PDF/notebook 分支、重复读取去重、自动发现 skill、给模型注入按行内容而不是原始文件块。
  • 深拆文档:核心拆解 04:FileReadTool 子系统

5.4 FileEditTool

  • 作用:对已有文件做局部修改。
  • 设计思路:优先把“局部编辑”从 Bash/sed 里抽出来,形成稳定协议。
  • 实现方式:src/tools/FileEditTool/FileEditTool.ts
  • Claude Code 额外处理:文件历史、diff 风格展示、路径与读取时序校验、编辑前后内容约束、拒绝消息特殊渲染。
  • 深拆文档:核心拆解 05:FileEditTool 子系统

5.5 FileWriteTool

  • 作用:创建或覆盖文件。
  • 设计思路:把“整文件写入”与“局部编辑”分开,降低模型误用。
  • 实现方式:src/tools/FileWriteTool/FileWriteTool.ts
  • Claude Code 额外处理:文件权限、路径限制、整文件写入的 transcript 展示、与 Edit 工具分工明确。
  • 深拆文档:核心拆解 06:FileWriteTool 子系统

5.6 NotebookEditTool

  • 作用:编辑 .ipynb notebook 单元。
  • 设计思路:notebook 不是普通文本文件,必须单独建模。
  • 实现方式:src/tools/NotebookEditTool/NotebookEditTool.ts
  • Claude Code 额外处理:把 cell 级编辑变成结构化操作,而不是让模型直接改 JSON。
  • 深拆文档:核心拆解 07:NotebookEditTool 子系统

5.7 GlobTool

  • 作用:按模式找文件。
  • 设计思路:把“找文件”从 Bash find 里剥出来,做成只读、可并发、安全的原生工具。
  • 实现方式:src/tools/GlobTool/GlobTool.ts
  • Claude Code 额外处理:结果折叠、摘要展示、只读并发安全。
  • 深拆文档:核心拆解 08:GlobTool + GrepTool 搜索子系统

5.8 GrepTool

  • 作用:按正则搜内容。
  • 设计思路:把“搜内容”从 grep / rg 里剥出来,减少 shell 噪音。
  • 实现方式:src/tools/GrepTool/GrepTool.ts
  • Claude Code 额外处理:只读并发安全、摘要化输出、对 transcript 搜索展示更友好。
  • 深拆文档:核心拆解 08:GlobTool + GrepTool 搜索子系统

5.9 LSPTool

  • 作用:走语言服务器拿定义、引用、符号、hover 等代码智能。
  • 设计思路:把“代码理解”能力从纯文本搜索提升到语义层。
  • 实现方式:src/tools/LSPTool/LSPTool.ts + schemas.ts + formatters.ts + symbolContext.ts
  • Claude Code 额外处理:把 LSP 返回结果整理成更适合模型消费的结构,而不是直接暴露原始 LSP 协议。
  • 深拆文档:核心拆解 16:LSPTool 语义代码理解层

6. 第二类:Web / 搜索 / 外部资源工具

这类工具的共同点是:

  • 主要处理“外部信息”
  • 多数是只读
  • 经常带有域名/主机级权限规则
  • 很容易触发 defer / open-world 策略

6.1 WebFetchTool

  • 作用:抓取单个 URL 内容并提取正文。
  • 设计思路:把“网页读取”做成结构化抓取,而不是让模型自己拼 curl.
  • 实现方式:src/tools/WebFetchTool/WebFetchTool.ts
  • Claude Code 额外处理:域名级规则、预批准主机、shouldDefer、主机名摘要展示。
  • 深拆文档:核心拆解 09:WebFetchTool + WebSearchTool 外部信息子系统

6.2 WebSearchTool

  • 作用:搜索互联网获取当前信息。
  • 设计思路:把“搜索”做成一等能力,而不是 curl + search engine.
  • 实现方式:src/tools/WebSearchTool/WebSearchTool.ts
  • Claude Code 额外处理:对搜索结果做工具内摘要;还能根据模型/环境决定内部具体搜索方式。
  • 深拆文档:核心拆解 09:WebFetchTool + WebSearchTool 外部信息子系统

6.3 ListMcpResourcesTool

  • 作用:列出已连接 MCP server 上的资源。
  • 设计思路:把 MCP 资源先发现再读取,而不是直接猜 URI。
  • 实现方式:src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts
  • Claude Code 额外处理:只读并发安全、统一资源发现入口。

6.4 ReadMcpResourceTool

  • 作用:读取具体 MCP resource。
  • 设计思路:把“资源读取”与“工具调用”分开。
  • 实现方式:src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts
  • Claude Code 额外处理:资源型内容单独走协议,不混进普通文件读取。

6.5 MCPTool

  • 作用:MCP 动态工具的原型模板。
  • 设计思路:不是写死一个个 MCP 工具,而是先有一个通用壳,再由 services/mcp/client.ts 动态覆写名字、描述、调用逻辑。
  • 实现方式:src/tools/MCPTool/MCPTool.ts
  • Claude Code 额外处理:MCP 工具不是静态源码工具,而是运行时生成;UI、权限、结果映射都可以被 MCP 层再覆写。
  • 深拆文档:核心拆解 15:MCPTool + McpAuthTool + services/mcp/client.ts 动态扩展层

6.6 McpAuthTool

  • 作用:处理 MCP server 认证。
  • 设计思路:认证不是普通业务工具,而是 runtime 为 MCP 注入的特殊辅助工具。
  • 实现方式:src/tools/McpAuthTool/McpAuthTool.ts,由 services/mcp/client.ts 动态创建。
  • Claude Code 额外处理:只在需要认证的 MCP 场景下出现,不进基础工具全集。
  • 深拆文档:核心拆解 15:MCPTool + McpAuthTool + services/mcp/client.ts 动态扩展层

6.7 ToolSearchTool

  • 作用:在 deferred tools 里做关键词搜索或显式选择。
  • 设计思路:当工具池过大时,不把全部工具直接塞给模型,而是先给一个“工具检索工具”。
  • 实现方式:src/tools/ToolSearchTool/ToolSearchTool.ts
  • Claude Code 额外处理:检查 deferred tool、缓存失效、支持 select: 直选、无结果时还能提示仍在连接的 MCP server。

7. 第三类:agent / 技能 / 协作工具

这类工具最能体现 Claude Code 的 agent runtime 特征。

深拆见:核心拆解 10:AgentTool + SkillTool 委派与技能子系统 协作控制补充见:核心拆解 11:AskUserQuestion + ExitPlanMode + SendMessage + TodoWrite 协作控制子系统

7.1 AgentTool

  • 作用:启动子 agent。
  • 设计思路:把“多 agent”做成正式工具协议,而不是内部私有 API。
  • 实现方式:src/tools/AgentTool/AgentTool.tsx + runAgent.ts + loadAgentsDir.ts + forkSubagent.ts
  • Claude Code 额外处理:agent 类型过滤、MCP 依赖过滤、权限模式继承、worktree/隔离模式、背景 agent、team teammate 分支、fork child 递归保护。

7.2 SkillTool

  • 作用:执行 slash-command skill。
  • 设计思路:skill 不是直接 shell script,而是 prompt 型能力单元。
  • 实现方式:src/tools/SkillTool/SkillTool.ts
  • Claude Code 额外处理:本地 skill 发现、远程 canonical skill、命令存在性校验、disable-model-invocation 保护、技能名进入 classifier 输入。

7.3 AskUserQuestionTool

  • 作用:向用户发起结构化提问。
  • 设计思路:把“向用户确认”做成正式 tool,而不是让模型随便输出一句问题。
  • 实现方式:src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx
  • Claude Code 额外处理:requiresUserInteraction(),所以权限流和执行流都会特殊对待它。

7.4 SendMessageTool

  • 作用:给 swarm teammate 或 bridge 目标发消息。
  • 设计思路:agent 间通信也走 tool 协议。
  • 实现方式:src/tools/SendMessageTool/SendMessageTool.ts
  • Claude Code 额外处理:会把输入补成 broadcast/message/shutdown/approval 等不同消息形态;跨 session bridge 发送被当成 bypass-immune safety check。

7.5 TeamCreateTool

  • 作用:创建 swarm team。
  • 设计思路:把多 agent 团队创建单独建模,而不是把 team 参数塞进 AgentTool。
  • 实现方式:src/tools/TeamCreateTool/TeamCreateTool.ts
  • Claude Code 额外处理:teammate、lead、team roster 等运行时状态管理。

7.6 TeamDeleteTool

  • 作用:解散 swarm team。
  • 设计思路:团队生命周期显式管理。
  • 实现方式:src/tools/TeamDeleteTool/TeamDeleteTool.ts
  • Claude Code 额外处理:清理团队状态和相关会话资源。

7.7 BriefTool

  • 作用:整理并输出对外可分享的 brief/摘要。
  • 设计思路:把“生成可转交内容”从普通回答里抽成工具。
  • 实现方式:src/tools/BriefTool/BriefTool.ts
  • Claude Code 额外处理:附件上传、摘要模板、只在特定协作场景里有意义。

7.8 REPLTool

  • 作用:在 REPL 模式下包装原始基础工具。
  • 设计思路:REPL 不是多一个工具,而是一个工具虚拟机外壳。
  • 实现方式:这份快照里只能看到 src/tools/REPLTool/constants.tsprimitiveTools.ts
  • Claude Code 额外处理:REPL 打开时会隐藏原始 primitive tools,让模型经由 REPL wrapper 间接调用。
  • 深拆文档:核心拆解 17:REPLTool 包装层
  • 补充阅读:核心拆解 18:上下文压缩与会话续航

8. 第四类:计划 / 任务 / 工作流工具

这类工具是 Claude Code “长生命周期会话”味道最浓的一层。

深拆见:核心拆解 11:AskUserQuestion + ExitPlanMode + SendMessage + TodoWrite 协作控制子系统 任务运行时补充见:核心拆解 12:TaskCreate / TaskGet / TaskUpdate / TaskList / TaskStop / TaskOutput 任务运行时

8.1 EnterPlanModeTool

  • 作用:切进 plan mode。
  • 设计思路:把“先出方案再执行”做成显式运行时模式,而不是纯 prompt 约定。
  • 实现方式:src/tools/EnterPlanModeTool/EnterPlanModeTool.ts
  • Claude Code 额外处理:模式切换会影响之后整个工具池和权限流。

8.2 ExitPlanModeV2Tool

  • 作用:提交计划、请求批准并退出 plan mode。
  • 设计思路:计划模式不是单向切换,而是要有一个正式的“从 plan 进入 execution”的网关。
  • 实现方式:src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts
  • Claude Code 额外处理:requiresUserInteraction(),会被权限系统当成真正的交互点。

8.3 TodoWriteTool

  • 作用:维护当前会话的待办清单。
  • 设计思路:让模型显式维护任务分解,而不是把 todo 混在自然语言里。
  • 实现方式:src/tools/TodoWriteTool/TodoWriteTool.ts
  • Claude Code 额外处理:和 REPL/UI 中的 todo 面板联动,结果不只是普通 transcript 文本。

8.4 TaskCreateTool / TaskGetTool / TaskUpdateTool / TaskListTool

  • 作用:操作任务列表。
  • 设计思路:Todo 之外再抽一层更正式的 task 对象。
  • 实现方式:src/tools/TaskCreateTool/TaskCreateTool.ts 等。
  • Claude Code 额外处理:这些工具更偏 structured state,而不是自然语言输出。

8.5 TaskOutputTool

  • 作用:读取后台任务输出。
  • 设计思路:后台任务输出本来应该读文件,但保留一个兼容工具。
  • 实现方式:src/tools/TaskOutputTool/TaskOutputTool.tsx
  • Claude Code 额外处理:它已经被标注成 deprecated,还会主动引导模型去用 Read 读取输出文件;支持 blocking/non-blocking 和等待进度消息。

8.6 TaskStopTool

  • 作用:停止后台任务。
  • 设计思路:后台任务是正式 runtime 对象,所以停止它也必须走正式工具。
  • 实现方式:src/tools/TaskStopTool/TaskStopTool.ts
  • Claude Code 额外处理:要和任务注册表、任务状态更新联动。

8.7 CronCreateTool / CronDeleteTool / CronListTool

  • 作用:管理 agent triggers / cron。
  • 设计思路:把“定时触发 agent”做成 Claude Code 自己的 runtime 能力。
  • 实现方式:src/tools/ScheduleCronTool/*.ts
  • Claude Code 额外处理:和 agent 任务体系、触发器路由绑定。

8.8 RemoteTriggerTool

  • 作用:管理远端触发器。
  • 设计思路:把本地定时与远端触发分开建模。
  • 实现方式:src/tools/RemoteTriggerTool/RemoteTriggerTool.ts
  • Claude Code 额外处理:更多是运行时和远程会话系统的连接点。

8.9 WorkflowTool

  • 作用:执行工作流脚本。
  • 设计思路:把多步编排沉淀为 workflow,而不是每轮都让模型重新想。
  • 实现方式:这份快照里只在注册表和常量里能看到,具体实现缺失。
  • Claude Code 额外处理:在 agent 子线程里被显式禁止,说明它会影响更高层运行时。

8.10 VerifyPlanExecutionTool

  • 作用:校验 plan 执行情况。
  • 设计思路:把“执行是否符合计划”单独抽成工具。
  • 实现方式:这份快照里实现缺失,只在 tools.ts 里看到注册入口。
  • Claude Code 额外处理:受 CLAUDE_CODE_VERIFY_PLAN 控制,是实验/验证型工具。

9. 第五类:环境 / 扩展 / 运行时辅助工具

这类工具有个共同点:

  • 不直接解决业务问题
  • 但对 runtime 本身很重要

深拆见:核心拆解 13:ConfigTool + EnterWorktree / ExitWorktree + ListMcpResources / ReadMcpResource 运行时辅助层 补充深拆见:核心拆解 14:ToolSearchTool + SyntheticOutputTool + TestingPermissionTool 元工具层

9.1 ConfigTool

  • 作用:读写 Claude Code 配置。
  • 设计思路:把“配置变更”工具化,而不是只能靠命令或手改配置。
  • 实现方式:src/tools/ConfigTool/ConfigTool.ts
  • Claude Code 额外处理:用户类型限制明显,说明它更偏内部/实验能力。

9.2 EnterWorktreeTool / ExitWorktreeTool

  • 作用:进入 / 退出 git worktree 隔离环境。
  • 设计思路:把隔离执行环境做成显式工具。
  • 实现方式:src/tools/EnterWorktreeTool/EnterWorktreeTool.tssrc/tools/ExitWorktreeTool/ExitWorktreeTool.ts
  • Claude Code 额外处理:不是单纯目录切换,而是和 agent 隔离、任务上下文、cwd 绑定。

9.3 ListMcpResourcesTool / ReadMcpResourceTool

  • 作用:为 MCP 资源提供结构化发现与读取。
  • 设计思路:资源和工具调用分层,避免 MCP 只剩一坨开放式调用。
  • 实现方式:见上。
  • Claude Code 额外处理:它们是扩展系统和核心工具池的接缝。

9.4 SyntheticOutputTool

9.5 ToolSearchTool

9.6 TestingPermissionTool

10. 这份快照里能看到名字,但实现缺失或不完整的工具

这些工具在 tools.ts 或其它调用点里能看到,但快照里没有完整实现。

10.1 可见但实现缺失

  • TungstenTool
  • SuggestBackgroundPRTool
  • WebBrowserTool
  • OverflowTestTool
  • CtxInspectTool
  • TerminalCaptureTool
  • ListPeersTool
  • WorkflowTool
  • MonitorTool
  • SendUserFileTool
  • PushNotificationTool
  • SubscribePRTool
  • VerifyPlanExecutionTool
  • SnipTool

10.2 只看到 prompt 或常量,没看到主体

  • SleepTool
  • REPLTool

10.3 这意味着什么

这说明这份快照更偏:

  • 核心运行时代码
  • 主工具协议
  • 主要 coding tools

但不是“完整产品树”。

所以对于这些缺失工具,我现在只能做结构级归类,不能像 BashTool 那样给出实现级深拆。

11. Claude Code 在“工具之上”做的额外处理,可以总结成九件事

11.1 工具池不是静态的

  • 模式切换会改工具池
  • deny rules 会改工具池
  • feature flag 会改工具池
  • MCP 连接状态会改工具池

11.2 工具不是只分“能不能调用”

  • isEnabled
  • isConcurrencySafe
  • isReadOnly
  • requiresUserInteraction
  • interruptBehavior

11.3 工具输入会被“观察侧补全”

  • backfillObservableInput
  • 不改原始 API 输入
  • 但让 hook / classifier / transcript 看到更完整的输入

11.4 工具输出分成“给用户看”和“给模型看”

  • renderToolResultMessage
  • mapToolResultToToolResultBlockParam

这两条是分开的。

11.5 权限系统不是布尔值

  • allow
  • ask
  • deny
  • passthrough

而且 ask 后面还可能接:

  • classifier
  • hook
  • interactive dialog
  • headless auto-deny

11.6 并发不是全局开的

  • 只有声明 isConcurrencySafe 的工具才会进并发批次
  • 并发工具的 context modifier 还会延后提交

11.7 工具不只是“功能块”,很多还是“运行时网关”

典型例子:

  • AgentTool
  • EnterPlanModeTool
  • ExitPlanModeV2Tool
  • EnterWorktreeTool
  • TaskStopTool

11.8 Claude Code 会把某些能力从 Bash 里抽出来

比如:

  • 读文件
  • 改文件
  • 写文件
  • 找文件
  • 搜内容
  • 搜 Web

这说明作者非常明确地在做一件事:

尽量缩小 Bash 的职责,减少 shell 成为万能逃逸口。

11.9 MCP 不是“插件额外加一点功能”,而是一级扩展面

  • 有动态 MCPTool
  • 有 MCP resource 工具
  • 有 MCP auth 工具
  • 有和主工具池合并的专门装配逻辑

这已经不是“外挂”,而是 Claude Code 的正式扩展层了。

11.10 工具大输出不是 UI 问题,而是上下文治理问题

  • Claude Code 先做单工具结果落盘,再做单轮聚合预算治理
  • replacement decision 会写进 transcript,resume 后继续复用
  • 这一层的目标不是截断文本,而是稳住 prompt cache 和上下文预算
  • 深拆文档:核心拆解 19:Tool Result Budget 与大输出持久化

11.11 溢出恢复不是报错分支,而是 query 的正式子状态机

  • prompt-too-long、媒体过大、max_output_tokens 都可能先被 withheld
  • query loop 会先尝试 collapse drain、reactive compact 或 continuation recovery
  • 真恢复失败了才把错误放出来,并且会跳过普通 stop hook 链路
  • 深拆文档:核心拆解 20:溢出恢复回路与 reactive compact 边界

11.12 context collapse 是独立上下文子系统,不是 compact 的附属功能

  • 它有自己的 init、projectView、overflow recovery、stats、subscribe、persist、restore 接口
  • transcript 里存的是 commit/snapshot 指令,不是再存一份归档正文
  • rewind 和 full compact 都会让 collapse runtime state 失效并重置
  • 深拆文档:核心拆解 21:context collapse 的接口边界与持久化协议

11.13 现在已经可以开始收口成 C# 运行时蓝图了

  • Claude Code 的主骨架更适合翻成 ConversationRuntime + ToolRuntime + ContextPressurePipeline + ExtensionRuntime
  • 宿主、运行时、持久化、扩展层最好从一开始就分开
  • 第一版最小可用 C# 目标应该先盯住单会话、基础 coding tools、resume、compact
  • 深拆文档:核心拆解 22:C# 运行时映射与接口蓝图

12. 如果你要转 C#,我建议按这五层迁

12.1 先迁工具池装配器

先做:

  • ToolRegistry
  • ToolPoolAssembler
  • ToolVisibilityPolicy

不要一上来先写单个工具实现。

12.2 再迁核心 coding tools

优先级我建议是:

  1. FileReadTool
  2. FileEditTool
  3. FileWriteTool
  4. GlobTool
  5. GrepTool
  6. BashTool

12.3 再迁 agent runtime 相关工具

也就是:

  • AgentTool
  • AskUserQuestionTool
  • EnterPlanModeTool
  • ExitPlanModeV2Tool
  • TodoWriteTool
  • Task*

12.4 再迁扩展层

  • MCPTool
  • ListMcpResourcesTool
  • ReadMcpResourceTool
  • ToolSearchTool

12.5 最后再迁 feature-gated 工具

因为它们对主干设计的影响最小,而且这份快照本身也不完整。

13. 我对“所有工具”的总判断

如果只用一句话概括这份工具体系,我会这么说:

Claude Code 的 tool,不是“模型可以调用的一堆函数”,而是“把代码操作、外部资源、会话状态、agent 协作和运行时模式统一成了一套协议”。

这套协议最有价值的地方,不是工具数量多,而是它把下面这些东西全部纳进去了:

  • 权限
  • 并发
  • 中断
  • 任务生命周期
  • 模式切换
  • transcript 展示
  • prompt cache 稳定性
  • MCP 扩展

这些,才是你后面转成 C# 时最值得保留的设计骨架。

14. 下一步怎么拆最划算

我建议接下来按下面顺序继续:

  1. FileReadTool
    它最能说明 Claude Code 怎么处理“文件不是纯文本”的问题。

  2. FileEditTool + FileWriteTool
    它们最能说明 Claude Code 怎么把“改文件”从 shell 里抽离。

  3. AgentTool
    它最能说明 Claude Code 怎么把“多 agent”正式工具化。

  4. MCPTool + services/mcp/client.ts
    它最能说明 Claude Code 的扩展系统到底是不是插件系统,还是 runtime 一级能力。