第五篇:工具系统深度解析,199个工具的架构与安全
📚 系列文章 05/10 · ⏱️ 阅读时间约 18 分钟
🏗️ 一、工具架构:buildTool 模式
Claude Code 所有工具都遵循统一模式------通过 buildTool() 工厂函数构建:
typescript
// src/Tool.ts
export const MCPTool = buildTool({
isMcp: true,
name: 'mcp',
maxResultSizeChars: 100_000,
async description() {
return DESCRIPTION // 动态描述,支持条件返回
},
async inputSchema() { /* JSON Schema */ },
async outputSchema() { /* 输出格式 */ },
async validate(input, context) {
// 权限检查
if (!context.permissions.canRun(input)) {
return { result: false, errorCode: 403 }
}
return { result: true }
},
async execute(input, progress, context) {
// 实际执行逻辑
return { content: [...] }
}
})
这个模式有几个精妙设计:
- 动态描述:description() 是异步函数,可以根据输入返回不同描述
- Schema 验证:input/output 通过 Zod Schema 定义,自动校验
- 进度回调:progress() 用于流式输出(长命令可以实时显示进度)
- 上下文注入:context 包含权限、会话、文件系统等运行时信息
🔒 二、安全体系:三层权限模型
这是 Claude Code 工具系统最值得学习的部分------一套完整的安全架构。
2.1 权限模式
typescript
// src/types/permissions.ts
export type PermissionMode =
| 'read' // 只读(不修改文件、不执行危险命令)
| 'bypass' // 完全信任(跳过所有确认)
| 'auto' // 自动(危险操作会弹窗确认)
| 'deny' // 完全禁用
2.2 Bash 安全检查链
BashTool 的安全检查极其严格,经过 6 层验证:
text
1. 白名单检查(COMMAND_ALLOWLIST)
只允许明确列出的命令,未知命令直接拒绝
2. 标志位验证
例如:git checkout -b 允许,git checkout --force 不允许
3. 路径验证(pathValidation.ts)
禁止访问 ~/.ssh/、/etc/passwd 等敏感路径
4. 只读检查(readOnlyValidation.ts)
网络请求、磁盘写入等被标记为 destructive
5. 破坏性命令警告(destructiveCommandWarning.ts)
rm -rf / 等危险命令触发警告
6. 沙箱检查(shouldUseSandbox.ts)
高风险命令在沙箱中执行
⚠️ 安全边界 :Claude Code 内置了 2400+ 行安全代码。
COMMAND_ALLOWLIST声明式地列出每个允许的命令和它的合法标志位,比黑名单模式安全得多。
2.3 文件系统权限
typescript
// src/utils/permissions/filesystem.js
// 每个文件操作都经过权限检查
export function checkFileAccess(
path: string,
operation: 'read' | 'write' | 'delete',
permissions: PermissionSettings
): PermissionResult {
// 1. 检查是否在允许目录内
if (!isInAllowedDirectory(path, permissions.allow)) {
return { allowed: false, reason: 'denied' }
}
// 2. 检查是否在禁止目录内
if (isInDeniedDirectory(path, permissions.deny)) {
return { allowed: false, reason: 'denied' }
}
// 3. 写操作需要明确授权
if (operation === 'write' && permissions.mode !== 'bypass') {
return { allowed: false, reason: 'needsConfirmation' }
}
return { allowed: true }
}
📁 三、文件操作工具族
3.1 FileReadTool(读文件)
支持偏移量和行数限制,避免一次性读取大文件导致内存爆炸。
3.2 FileEditTool(编辑文件)
这是最复杂的工具之一,核心是 sed 语义的实现:
typescript
// src/tools/FileEditTool/utils.ts
// 支持三种编辑模式
export type EditMode =
| { type: 'replace', path, oldStr, newStr } // 字符串替换
| { type: 'insert', path, after, newStr } // 指定位置后插入
| { type: 'create', path, content } // 创建新文件
3.3 GlobTool + GrepTool(代码搜索)
text
// GlobTool:通配符文件搜索
// 支持:**/*.ts、**/node_modules/**、src/**/*.js
// GrepTool:正则表达式全文搜索
// 支持:上下文行数、正则表达式、大小写敏感
⚡ 四、命令执行工具
4.1 BashTool vs PowerShellTool
Claude Code 同时支持 Linux/Bash 和 Windows/PowerShell:
text
// Bash 特殊安全检查:
// - 管道重定向安全
// - 环境变量过滤(LD_*, DYLD_* 被阻止)
// - here-doc 解析安全
// PowerShell 特殊安全检查:
// - ExecutionPolicy 检查
// - Git 安全命令白名单
// - 脚本签名验证
4.2 命令分类
typescript
// src/tools/BashTool/readOnlyValidation.ts
// 声明式命令配置
const COMMAND_ALLOWLIST = {
'cat': { flags: { '-n': 'none', '-b': 'none' } },
'ls': { flags: { '-l': 'none', '-a': 'none', '-R': 'none' } },
'grep': { flags: { '-r': 'none', '-n': 'string' } },
'git': {
'status': { flags: {} }, // 读,自动允许
'diff': { flags: { '--stat': 'none' } },
'log': { flags: { '--oneline': 'none' } },
'branch': { flags: {} },
'commit': { flags: { '-m': 'string' }, needsConfirm: true },
'push': { flags: {}, needsConfirm: true },
'checkout': { flags: { '-b': 'string' }, needsConfirm: true },
},
}
🌐 五、网络工具
5.1 WebSearchTool
typescript
name: 'web_search',
input: { query: string, recency_days?: number }
output: { results: Array<{ title, url, snippet }> }
5.2 WebFetchTool
typescript
// 限制:只能访问预批准域名列表(preapproved.ts)
// 防止 SSRF 攻击(服务器端请求伪造)
// 禁止:内网 IP(10.x、172.16.x、192.168.x)
// 禁止:localhost、127.0.0.1
💡 为什么 WebFetch 有域名白名单?
SSRF(服务器端请求伪造)是严重安全漏洞。Claude Code 防止 AI 被诱导访问内网服务盗取数据。
🤖 六、AgentTool:子 Agent 系统
这是 Claude Code 最独特的能力------让一个 AI Agent 去启动另一个 Agent:
typescript
// src/tools/AgentTool/
// 内置 5 种 Agent 类型
const builtInAgents = [
GENERAL_PURPOSE_AGENT, // 通用任务执行
PLAN_AGENT, // 规划模式
EXPLORE_AGENT, // 代码探索
VERIFICATION_AGENT, // 验证任务
CLAUDECODE_GUIDE_AGENT, // 使用指南
]
// 子 Agent 可以并发启动(forkSubagent.ts)
// 每个子 Agent 有独立上下文
// 主 Agent 汇总子 Agent 结果继续工作
使用场景示例:
主 Agent:"重构这个项目"
→ EXPLORE_AGENT:分析代码结构
→ VERIFICATION_AGENT:写测试用例
→ PLAN_AGENT:生成重构计划
→ 主 Agent 汇总结果,执行修改
🔌 七、MCP 工具集成
Model Context Protocol(MCP)是 Claude Code 连接外部工具的标准协议:
typescript
// src/tools/MCPTool/MCPTool.ts
// Claude Code 内置 MCP 客户端
// 连接外部 MCP 服务器(任何实现了 MCP 协议的工具)
class MCPClient {
async connect(serverConfig: MCPConfig): Promise<void> {
const connection = await createMCPConnection(serverConfig)
this.servers.set(serverConfig.name, connection)
// 注册该服务器提供的所有工具
const tools = await connection.listTools()
for (const tool of tools) {
registerTool(`mcp_${serverConfig.name}_${tool.name}`, tool)
}
}
}
📋 八、工具分类速查表
| 类别 | 工具 | 权限级别 |
|---|---|---|
| 文件读 | FileRead, Glob, Grep, Bash(cat/ls) | 只读,自动允许 |
| 文件写 | FileWrite, FileEdit | 需写权限 |
| 命令执行 | Bash, PowerShell | 白名单+沙箱 |
| Git | git status/diff/log | 只读,自动 |
| Git写 | git commit/push/checkout | 需确认 |
| 网络 | WebSearch, WebFetch | 域名白名单 |
| 代码 | LSPTool(语法分析/跳转/补全) | 只读 |
| Agent | AgentTool(子Agent启动) | 需确认 |
| MCP | MCPTool(外部工具集成) | 动态权限 |
| 任务 | TaskCreate/Get/List/Stop/Update | 需确认 |
| 计划 | EnterPlanMode, ExitPlanMode | 自动 |
| 配置 | ConfigTool, SkillTool | 需确认 |
| 杂项 | TodoWrite, Brief, WebSearch, Sleep | 各异 |
🏛️ 九、工具系统架构总结
用户输入(自然语言)
│
▼
chat.ts(对话引擎)
│
▼
toolExecution.ts(工具编排)
│
├─► 分组:依赖分析(无依赖 → 并行)
│
├─► 权限检查(validate)
│ ├─► pathValidation(路径安全)
│ ├─► readOnlyValidation(只读检查)
│ ├─► bashSecurity(命令白名单)
│ └─► destructiveCommandWarning(危险警告)
│
├─► 用户确认(needsConfirm)
│
└─► execute(实际执行)
├─► 文件工具(filesystem API)
├─► Bash工具(spawn child process)
├─► Agent工具(fork sub-agent)
├─► MCP工具(mcpClient)
└─► 网络工具(fetch/搜索API)
📋 总结
本篇深入了 Claude Code 工具系统的核心架构:
- ✅ buildTool 模式:统一工具接口,支持动态描述、Schema 验证、流式进度
- ✅ 三层权限模型:read / auto / bypass / deny,完整覆盖只读和破坏性操作
- ✅ Bash 安全:2400+ 行安全代码,声明式命令白名单
- ✅ 文件安全:路径验证 + 目录白名单,防止越权访问
- ✅ Agent 系统:内置 5 种 Agent,支持并发 fork 子任务
- ✅ MCP 集成:通过 Model Context Protocol 连接任意外部工具
- ✅ 199 个工具:覆盖文件、命令、Git、网络、代码分析、任务计划全部场景
💡 设计精华 :Claude Code 的工具系统本质是一个安全沙箱 + 权限网关 + 执行引擎。AI 模型负责决策「用什么工具」,而工具系统负责确保这些决策安全可控。这套架构值得在任何 AI Agent 项目中借鉴。
📅 下篇预告
深入解析 代码理解系统------LSPTool 如何实现语法分析、符号跳转、自动补全?敬请期待!
#ClaudeCode #工具系统 #安全架构 #权限模型 #MCP