本文假设你已经了解 Coze、Dify、FastGPT、n8n 或对同类 AI Ops 平台有比较深入的了解,有一定的技术理解能力。 最好还了解Linux 的基础命令。
那么本篇文章更深一层,挖掘 Claude Code(由 Anthropic 官方开发)的工具架构设计,从权限管理、工具分层及配套体系方面进行深入分析。
如果对这个项目不熟悉,可以先移步了解下该项目:
这是 Anthropic 官方的 AI 编程助手,完成度很高,更新频繁,但这并不妨碍我们快速学习和理解该项目的核心思想、核心工具,还有重点的 What LLM sees ,有助于快速培养 AI 智能体工程师职业素养。
注:本文解析学习的 claude code 为2025-12 最新代码版本
前言
在拿到 Claude Code 源码后,我第一反应是:"Bash 能做所有事,Anthropic 怎么还搞了一堆工具?"
结果一深挖才发现,人家这 15 个工具的设计,处处藏着"权限边界"的哲学。这不是简单的功能堆砌,而是经过实战验证、多次安全修复后的最佳实践。
这篇文章就是要扒一扒 Claude Code 的工具架构设计,看看 Anthropic 是如何平衡"大道至简"和"安全可控"的。
一、Claude Code 的完整工具清单
先上一份完整的工具列表,看看 Claude Code 到底留下了哪些"精选武器":
1.1 文件操作类(6 个工具)
| 工具名称 | 核心用途 | 一句话总结 |
|---|---|---|
| Read | 读取文件内容 | 只读,零副作用,永远安全 |
| Write | 创建或完全覆盖文件 | 语义明确:我就是要覆盖! |
| Edit | 精确编辑现有文件 | 局部修改,不动其他代码 |
| Glob | 文件名模式匹配 | 快速找文件(**/*.js) |
| Grep | 内容搜索(正则) | 基于 ripgrep,性能炸裂 |
| LS | 列出目录内容 | 就是 ls,但更安全 |
1.2 执行类(4 个工具)
| 工具名称 | 核心用途 | 一句话总结 |
|---|---|---|
| Bash | 执行 Shell 命令 | 唯一的"高危工具",最严格权限 |
| NotebookEdit | 编辑 Jupyter Notebook | 专门伺候数据科学家 |
| BashOutput | 获取后台 Bash 输出 | 监控长运行进程 |
| KillShell | 终止后台进程 | 一键停止失控任务 |
1.3 交互类(3 个工具)
| 工具名称 | 核心用途 | 一句话总结 |
|---|---|---|
| AskUserQuestion | 向用户提问 | 多选、单选、确认,体验拉满 |
| TodoWrite | 管理任务列表 | AI 的"待办清单" |
| Task | 启动子 Agent | 委托给专业选手处理 |
1.4 信息获取类(2 个工具)
| 工具名称 | 核心用途 | 一句话总结 |
|---|---|---|
| WebFetch | 获取网页内容 | HTML→Markdown,15 分钟缓存 |
| WebSearch | 网页搜索 | 实时信息(仅美国可用,懂的都懂) |
二、核心设计理念
每个工具是一个权限边界 ,这是理解 Claude Code 架构的核心钥匙。
2.1 为什么不是"只用 Bash"?
你可能会想:"既然 Bash 能执行 cat、grep、find,为啥还要这么多专用工具?"
Anthropic 的答案是:权限边界 + 语义清晰 + 安全第一
对比:两种设计方案
方案 A:极简主义(只用 Bash)
yaml
allowed-tools: Bash(*)
看起来很优雅,但问题在于:
- ❌ AI 可以执行
rm -rf /(想想就后怕) - ❌ 用户无法精细控制 AI 的权限
- ❌ 审计日志全是
Bash: "xxx && yyy && zzz",根本看不出干了啥
方案 B:权限边界设计(Claude Code 的选择)
yaml
allowed-tools: Read, Grep, Bash(git:*)
这个配置的含义是:
- ✅
Read工具只能读,想删文件?门都没有 - ✅
Grep工具只能搜索,性能更好且安全 - ✅
Bash(git:*)表示只允许 git 命令,其他命令直接拒绝
这就是 "权限边界" 的精髓:每个工具明确定义了 AI 能做什么、不能做什么。
2.2 Read/Write/Edit 分离:看似冗余,实则精妙
很多人会问:"为什么不搞一个 FileOp 工具,统一处理所有文件操作?"
typescript
// 为什么不这样?
FileOp({
action: 'read' | 'write' | 'edit',
path: string,
content?: string
})
Anthropic 的答案分三层:
原因 1:权限管理的精细化
yaml
# 场景:代码审查任务
allowed-tools: Read, Grep
# 含义:AI 只能读取和搜索,不能修改任何代码
如果用统一的 FileOp,要么:
- 允许所有操作(不安全)
- 每次操作都询问用户(体验差)
而分离设计下,权限配置即文档,一眼就知道 AI 能干啥。
原因 2:语义清晰性
typescript
Read("src/main.ts") // 明确:只是读取
Write("src/main.ts") // 明确:要覆盖整个文件!(请三思)
Edit("src/main.ts") // 明确:局部修改,其他代码不动
分离的工具让 AI 和用户都清楚操作的意图,减少"手滑"概率。
原因 3:错误防止
typescript
// 如果 AI 想读取文件
Read("config.json") // ✅ 不可能误操作
// 如果只有 FileOp
FileOp({ action: 'read', path: 'config.json' })
// ❌ AI 可能误写成 'write',然后你的配置文件就没了
2.3 Bash:唯一的"高危工具"
在 Claude Code 的架构中,Bash 是唯一的高风险工具,因此有最严格的管理。
权限过滤机制(命令级白名单)
yaml
# 命令级别的权限过滤
Bash(git:*) # 只允许 git 开头的命令
Bash(npm:*) # 只允许 npm 开头的命令
Bash(git add:*) # 只允许 git add(更细粒度)
Bash(*) # 允许所有命令(慎用!)
血泪教训:安全修复历史
翻翻 Claude Code 的 CHANGELOG,你会发现 Bash 工具经历了多次安全加固:
v2.0.1 - Fixed security vulnerability in Bash tool permission checks
v2.0.2 - Fixed security vulnerability where Bash tool permission checks
could be bypassed using prefix matching
v2.0.5 - Improved path validation for Bash tool
这说明:Bash 是最容易出安全问题的工具,也是 Anthropic 重点防范的对象。
所以 Claude Code 的策略是:能用专用工具就不用 Bash。
三、工具架构的分层设计
Claude Code 的工具不是一锅乱炖,而是有清晰的层次结构:
┌─────────────────────────────────────────────────────────┐
│ Claude Code 工具架构体系 │
└─────────────────────────────────────────────────────────┘
第一层:特化型工具(Specialized Tools)
├─ 文件操作
│ ├─ Read ──────→ 只读,零副作用
│ ├─ Write ─────→ 创建/覆盖文件
│ ├─ Edit ──────→ 精确编辑,保留上下文
│ └─ NotebookEdit → 特定于 Jupyter 格式
│
├─ 搜索工具
│ ├─ Glob ──────→ 文件名模式匹配(快速)
│ └─ Grep ──────→ 内容正则搜索(ripgrep 加持)
│
└─ 交互工具
├─ AskUserQuestion → 结构化用户交互
└─ TodoWrite ──────→ 任务管理
第二层:通用执行工具(General Purpose)
└─ Bash ────────→ Shell 命令执行(最严格权限)
第三层:信息工具(Information)
├─ WebFetch, WebSearch → 外部信息获取
└─ BashOutput, KillShell → 进程管理
3.1 使用优先级:能不用 Bash 就不用
Claude Code 的 Prompt 里明确写了工具使用顺序:
优先使用顺序:
1️⃣ 专用工具(Read, Write, Edit, Grep, Glob)
2️⃣ 搜索工具(Grep, Glob)
3️⃣ 交互工具(AskUserQuestion)
4️⃣ 命令执行(Bash - 最后才用)
这个优先级体现了 "能不用 Bash 就不用" 的原则------毕竟它是唯一能"搞事情"的工具。
四、按权限级别分类:四个风险等级
从安全角度看,工具可以分为 4 个风险等级:
4.1 只读工具(无风险 ✅)
Read, Grep, Glob, LS, WebFetch, WebSearch
→ 不修改任何文件,可以放心使用
4.2 修改工具(中等风险 ⚠️)
Write, Edit, NotebookEdit
→ 会修改文件,但范围可控
→ 偶尔需要用户确认
4.3 执行工具(高风险 🔴)
Bash
→ 可以执行任意命令(如果没有权限过滤)
→ 每次使用都可能触发权限检查
4.4 交互工具(无风险 ✅)
AskUserQuestion, Task, TodoWrite
→ 只涉及状态管理和用户交互
→ 不直接操作文件系统
五、工具组合的最佳实践
Claude Code 在不同场景下使用不同的工具组合,堪称"权限配置的艺术":
5.1 代码审查场景
yaml
allowed-tools: Read, Grep, Bash(git:*)
语义翻译:
- ✅ 可以读代码
- ✅ 可以搜索代码
- ✅ 可以查看 git 历史
- ❌ 不能修改任何代码(这是底线)
5.2 代码编写场景
yaml
allowed-tools: Read, Edit, Write, Bash(npm:*), Bash(git:*)
语义翻译:
- ✅ 可以读取、编辑、创建文件
- ✅ 可以运行 npm 命令(装依赖、跑测试)
- ✅ 可以运行 git 命令(提交代码)
5.3 探索代码库场景
yaml
allowed-tools: Glob, Grep, Read, LS
语义翻译:
- ✅ 可以搜索文件
- ✅ 可以搜索内容
- ✅ 可以读取文件
- ❌ 不能执行任何命令,不能修改文件
六、工具设计的关键启示
通过分析 Claude Code 的工具架构,我们可以总结出以下设计原则:
6.1 最小权限原则(Principle of Least Privilege)
每个工具只做一件事,每个任务只给最小权限
yaml
# ✅ 好的设计
allowed-tools: Read, Grep
# ❌ 不好的设计
allowed-tools: "*"
6.2 语义清晰性(Semantic Clarity)
工具名称直接反映能力,减少歧义
typescript
Read() // 一看就知道只读
Write() // 一看就知道会写入
Edit() // 一看就知道是编辑
6.3 权限边界(Permission Boundary)
每个工具是一个权限边界,方便审计和控制
typescript
// 系统可以精确追踪
{
tool: "Read",
file: "src/main.ts",
timestamp: "2025-12-02T10:30:00Z"
}
// vs Bash 的难点
{
tool: "Bash",
command: "cat src/main.ts && git add . && npm test"
// 包含多个操作,难以拆解
}
6.4 特化优化(Domain Optimization)
专用工具可以针对特定场景优化
Grep(基于 ripgrep)
├─ 比 Bash grep 快 10-100 倍
├─ 自动处理二进制文件
├─ 支持完整正则表达式
└─ 更好的输出格式
AskUserQuestion
├─ 美观的多选界面
├─ 支持自动补全
└─ 比 Bash read 体验好 100 倍
6.5 可扩展性(Extensibility)
通过 MCP 协议集成外部工具
Claude Code 支持通过 MCP(Model Context Protocol) 集成外部工具:
MCP 工具命名规则:
mcp__plugin_<name>_<server>__<tool>
示例:
mcp__plugin_database_postgres__query
mcp__plugin_api_rest__fetch
这使得 Claude Code 可以在不修改核心代码的情况下扩展功能。
七、工具架构的演进历程
翻翻 CHANGELOG,可以看到 Claude Code 的工具架构经历了这些演进:
v1.x → v2.0:从"能用"到"安全"
✅ 添加 MCP 工具集成
✅ 添加 NotebookEdit(Jupyter 支持)
✅ 添加 AskUserQuestion(交互改进)
✅ 添加 TodoWrite(任务管理)
✅ 改进 Bash 权限过滤机制
✅ 改进路径权限验证
✅ 修复多个安全漏洞
演进方向:越来越"克制"
→ 更细粒度的权限控制
→ 更丰富的特化工具
→ 减少对 Bash 的依赖(能不用就不用)
→ 改进用户交互体验
→ 更好的安全性(多次修复 Bash 漏洞)
八、总结:Claude Code 的工具设计哲学
经过深入分析,Claude Code 的工具架构体现了以下核心设计哲学:
8.1 核心原则
- 安全第一:每个工具都是一个权限边界,防止"手滑"
- 最小权限:每个任务只能访问所需的工具
- 语义清晰:工具名称直接反映能力,减少误操作
- 特化优化:专用工具性能更好、体验更好
- 可审计性:精确的工具追踪,方便事后分析
- 可扩展性:通过 MCP 集成外部工具
8.2 架构优势
相比"只用 Bash"的设计,这种多工具架构的优势在于:
✅ 权限管理更精细(命令级白名单)
✅ 安全漏洞面更小(减少 Bash 使用)
✅ AI 的行为更可预测(语义明确)
✅ 用户可以精确控制权限(配置即文档)
✅ 系统可以提供更好的错误防止和恢复
✅ 审计和日志更清晰(不是一堆 Bash 命令)
8.3 适用场景
这套架构特别适合:
- ✅ 需要 AI 辅助的代码开发
- ✅ 需要精细权限控制的场景
- ✅ 需要审计 AI 操作的企业环境
- ✅ 需要安全保障的生产环境
九、对 AI Agent 开发者的启示
如果你正在开发 AI Agent 或 MCP Server,Claude Code 的架构给我们以下启示:
9.1 不要过度简化
❌ 错误思路:"Bash 可以做所有事,只要一个工具就够了"
✅ 正确思路:"权限边界和语义清晰比工具数量更重要"
9.2 工具数量的平衡点
太少(1-2 个)→ 权限控制困难,安全风险高
太多(20+ 个)→ 用户难以管理,AI 难以选择
刚好(5-15 个)→ 权限清晰,易于管理 ✅
Claude Code 的 15 个工具是经过实践验证的平衡点。
9.3 必须分离的工具
必须分离:
✅ Read / Write / Edit(权限边界)
✅ 文件搜索 / 内容搜索(性能差异)
可以合并:
✅ Glob + Grep(如果性能不是瓶颈)
✅ BashOutput + KillShell(进程管理)
9.4 权限过滤是关键
如果你的工具支持命令执行,必须实现权限过滤机制:
typescript
// 最小实现
{
command: string,
allowed_prefixes: string[] // ['git:', 'npm:', 'python:']
}
至此,我们已经学习和理解了 Claude Code 的核心 tools,也基本了解了 What LLM sees(虽然本篇还没深挖到 prompt 级别),那我们接下来要思考的是,我自己做一个 AI 智能体平台,我要怎么做。我希望参考 claude code ,来打造一个高内聚的超级 MCP-Server,这样就可以给 AI智能体 平台提供通用利器,快速实现类似 claude code 的能力。
可以看下一篇《Claude Code 核心工具封装成高内聚 MCP-Filesystem 实现方案》