第三十章:把所有工具重新挂回一张地图
把所有工具按作用、设计思路和运行时处理方式重新挂回一张总索引。
1. 先说边界
这篇文档的目标不是“逐行解释每个工具文件”,而是把这份快照里能看到的工具系统先拆成一个总地图。
我重点回答四个问题:
- Claude Code 到底把哪些东西当成 tool
- 工具池是怎么动态装配出来的
- 每个工具大概干什么,设计思路是什么
- Claude Code 在工具之上又做了哪些额外处理
先说明一个边界:
这份仓库快照不是完整源码。
所以这里会出现三种情况:
- 能看到完整实现的工具
- 只能看到注册入口或 prompt 的工具
- 能看到“工具原型”,但真正实例是在别的运行时模块里动态生成的工具
这不是分析问题,是快照边界本身如此。
相关横切专题:
2. 工具池不是固定数组,而是动态装配
源码锚点:
src/tools.ts:179src/tools.ts:199src/tools.ts:273src/tools.ts:332src/tools.ts:366
Claude Code 的工具池装配逻辑,核心在 src/tools.ts。
2.1 它先有一个“基础工具全集”
getAllBaseTools() 是基础全集。
这里面已经包含:
- 常驻核心工具
- feature flag 工具
- 用户类型相关工具
- 模式相关工具
2.2 然后再按运行模式做裁剪
getTools() 里又会继续按这些条件过滤:
simple moderepl modecoordinator modeworktree 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. 我建议先把工具分成五大类
这份快照里的工具,我建议这样看:
- 代码与文件操作工具
- Web / 搜索 / 外部资源工具
- agent / 技能 / 协作工具
- 计划 / 任务 / 工作流工具
- 环境 / 扩展 / 运行时辅助工具
这个分类不是作者显式写在代码里的,但非常贴合 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
- 作用:编辑
.ipynbnotebook 单元。 - 设计思路: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.ts和primitiveTools.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.ts、src/tools/ExitWorktreeTool/ExitWorktreeTool.ts。 - Claude Code 额外处理:不是单纯目录切换,而是和 agent 隔离、任务上下文、cwd 绑定。
9.3 ListMcpResourcesTool / ReadMcpResourceTool
- 作用:为 MCP 资源提供结构化发现与读取。
- 设计思路:资源和工具调用分层,避免 MCP 只剩一坨开放式调用。
- 实现方式:见上。
- Claude Code 额外处理:它们是扩展系统和核心工具池的接缝。
9.4 SyntheticOutputTool
- 作用:强制结构化输出。
- 设计思路:不是让模型“尽量遵守 JSON”,而是运行时直接注入一个结构化输出工具。
- 实现方式:
src/tools/SyntheticOutputTool/SyntheticOutputTool.ts。 - Claude Code 额外处理:不是基础工具池常驻成员,而是在
main.tsx/print.ts等场景下按需注入。 - 深拆文档:核心拆解 14:
ToolSearchTool+SyntheticOutputTool+TestingPermissionTool元工具层
9.5 ToolSearchTool
- 作用:在 deferred tools 里先搜索再选择。
- 设计思路:工具太多时,不扩大 system prompt,而是把“找工具”也做成工具。
- 实现方式:见上。
- Claude Code 额外处理:它本身就是一种 prompt-cache / token-budget 优化策略。
- 深拆文档:核心拆解 14:
ToolSearchTool+SyntheticOutputTool+TestingPermissionTool元工具层
9.6 TestingPermissionTool
- 作用:测试权限系统。
- 设计思路:把权限测试做成一个显式工具,方便自动化验证。
- 实现方式:
src/tools/testing/TestingPermissionTool.tsx。 - Claude Code 额外处理:只在
NODE_ENV === test时进工具池。 - 深拆文档:核心拆解 14:
ToolSearchTool+SyntheticOutputTool+TestingPermissionTool元工具层
10. 这份快照里能看到名字,但实现缺失或不完整的工具
这些工具在 tools.ts 或其它调用点里能看到,但快照里没有完整实现。
10.1 可见但实现缺失
TungstenToolSuggestBackgroundPRToolWebBrowserToolOverflowTestToolCtxInspectToolTerminalCaptureToolListPeersToolWorkflowToolMonitorToolSendUserFileToolPushNotificationToolSubscribePRToolVerifyPlanExecutionToolSnipTool
10.2 只看到 prompt 或常量,没看到主体
SleepToolREPLTool
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 工具输出分成“给用户看”和“给模型看”
renderToolResultMessagemapToolResultToToolResultBlockParam
这两条是分开的。
11.5 权限系统不是布尔值
allowaskdenypassthrough
而且 ask 后面还可能接:
- classifier
- hook
- interactive dialog
- headless auto-deny
11.6 并发不是全局开的
- 只有声明
isConcurrencySafe的工具才会进并发批次 - 并发工具的 context modifier 还会延后提交
11.7 工具不只是“功能块”,很多还是“运行时网关”
典型例子:
AgentToolEnterPlanModeToolExitPlanModeV2ToolEnterWorktreeToolTaskStopTool
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 先迁工具池装配器
先做:
ToolRegistryToolPoolAssemblerToolVisibilityPolicy
不要一上来先写单个工具实现。
12.2 再迁核心 coding tools
优先级我建议是:
FileReadToolFileEditToolFileWriteToolGlobToolGrepToolBashTool
12.3 再迁 agent runtime 相关工具
也就是:
AgentToolAskUserQuestionToolEnterPlanModeToolExitPlanModeV2ToolTodoWriteToolTask*
12.4 再迁扩展层
MCPToolListMcpResourcesToolReadMcpResourceToolToolSearchTool
12.5 最后再迁 feature-gated 工具
因为它们对主干设计的影响最小,而且这份快照本身也不完整。
13. 我对“所有工具”的总判断
如果只用一句话概括这份工具体系,我会这么说:
Claude Code 的 tool,不是“模型可以调用的一堆函数”,而是“把代码操作、外部资源、会话状态、agent 协作和运行时模式统一成了一套协议”。
这套协议最有价值的地方,不是工具数量多,而是它把下面这些东西全部纳进去了:
- 权限
- 并发
- 中断
- 任务生命周期
- 模式切换
- transcript 展示
- prompt cache 稳定性
- MCP 扩展
这些,才是你后面转成 C# 时最值得保留的设计骨架。
14. 下一步怎么拆最划算
我建议接下来按下面顺序继续:
-
FileReadTool
它最能说明 Claude Code 怎么处理“文件不是纯文本”的问题。 -
FileEditTool+FileWriteTool
它们最能说明 Claude Code 怎么把“改文件”从 shell 里抽离。 -
AgentTool
它最能说明 Claude Code 怎么把“多 agent”正式工具化。 -
MCPTool+services/mcp/client.ts
它最能说明 Claude Code 的扩展系统到底是不是插件系统,还是 runtime 一级能力。