详解 Claude Code 源码
赛博浮世绘 · 晓风乾 · 24 站拆解
回首页
详解 Claude Code 工具系统 3.4 · 动态注册与条件编译
篇章三 · 3.4

动态注册与条件编译

篇章三最后一站。工具列表不是写死的——每次启动按 20 多个条件现装。拨下面的开关,看工具池怎么变。

工具池是现装的,不是写死的

getAllBaseTools() 返回一个高度动态的数组:内置工具、MCP 工具、实验工具按开关组合——工具按名字排序,为的是 cache key 稳定。

开关实验室 · 拨开关看工具池
条件开关
工具池 — 个
拨左边开关试试
装配流水线 · 从源码到可用工具 四道工序
getAllBaseTools()条件分支拼出内置数组
filterToolsByDenyRulesdeny 规则过滤
assembleToolPool合并 MCP 工具 · 按名排序保 cache 稳定
ToolSearch超阈值 → 部分工具按需加载

为什么按名字排序这么重要?——Prompt Cache。工具定义全量进 system prompt,顺序一变 cache key 就变,缓存全失效。排序 = 排序自由度归零 = 缓存命中率最大化。MCP 工具再怎么上下线,内置工具的 cache 前缀纹丝不动。

🎮 新装一台 MCP 服务器,为什么不会打碎内置工具的 prompt cache?
MCP 工具也进 prompt,但排在内置工具之后(按名合并排序)。内置部分的字节序列完全不变——缓存前缀继续命中,只有新增的尾巴是新写入。这就是排序的经济学。
篇章三收束:47 字段接口(3.1)→ BashTool 权限(3.2)→ FileEditTool 并发(3.3)→ 动态装配(3.4)。篇章四进安全纵深:10 个检查点的权限管线、AI 分类器、还有那道连 bypass 都跨不过的硬边界。