详解 Claude Code 源码
赛博浮世绘 · 晓风乾 · 24 站拆解
回首页
详解 Claude Code 工具系统 3.1 · 47 字段工具接口
篇章三 · 3.1

47 字段工具接口

30 多种工具,全部长在同一个接口上——没有 class 继承,没有抽象基类,就是 47 个字段拼装。点开下面的格子墙,每个格子是一个字段。

没有继承,只有 47 个字段的拼装

TypeScript 结构化类型 + buildTool() 工厂函数:传一个满足 Tool 接口的对象,就得到一个工具。工具的生命周期只有三步:验证输入 → 查权限 → 执行

工具生命周期 · 三步走 每次调用的固定路径
🛂validateInputZod 校验入参,不合格直接挡在门外
🔐checkPermissions问权限系统:allow / ask / deny
call真正执行,AsyncGenerator 流式吐结果
47 字段格子墙 · 点格子看职责
生命周期Schema权限并发UI 渲染分类器
点上面任意格子——看这个字段管什么、为什么存在
fail-closed · 默认值全朝保守一边倒
默认值含义
isConcurrencySafefalse默认不能并发——想并行要显式声明
isReadOnlyfalse默认视为有写入——宁可多问一次
maxResultSizeChars100,000输出上限 100K 字符,防结果撑爆上下文
分类器出错拒绝AI 分类器挂了 → 默认 deny,不是放行

设计味道:所有「不确定」的分支都倒向安全一侧。新工具作者忘了写某个字段?没关系——默认值替你保守。

🎮 新写一个工具,忘了声明 isConcurrencySafe,会发生什么?
默认 false → 串行区。宁可牺牲速度也不冒并发踩踏的风险——这就是 fail-closed:不确定时,选安全的一边。这也是为什么 2.5 站里 Read/Grep 那些只读工具要显式声明并发安全才能上快轨。
本站要点:47 字段不是官僚主义——它把生命周期、权限、并发、UI、安全分类拆成正交维度,每个维度独立演进。下一站进最重的那块积木:BashTool,1143 行、tree-sitter 解析、还有一条沙箱决策链。