Skip to content

Claude Code 源码文档 - 工具系统 (Tools)

版本: 2.1.88 | 文件数: 184 | 源码路径: src/tools/

1. 模块概述

工具系统是 Claude Code 的核心能力层,定义了 AI 可以执行的所有操作。每个工具对应一种具体能力(文件编辑、命令执行、网页搜索等),通过统一的 Tool 类型接口注册和调度。

架构设计

┌─────────────────────────────────────────┐
│           tools.ts (注册中心)             │
│  getAllBaseTools() → Tools[]             │
│  getTools(context) → 过滤后的工具列表      │
└──────────┬──────────────────────────────┘

    ┌──────┴──────┐
    │   Tool.ts    │ ← 类型定义 & 接口
    │   Tool<T>    │ ← 泛型工具类型
    └──────┬──────┘

   ┌───────┼───────────────────┐
   │       │                   │
 BashTool  FileEditTool  AgentTool  ...(45+工具)

2. 核心类型定义

Tool<T> 类型 (Tool.ts)

typescript
type Tool<
  T extends AnyObject = AnyObject,
  P extends ToolProgressData = ToolProgressData,
  R = unknown
> = {
  name: string                              // 工具唯一标识
  description(context) => string            // 动态描述(给模型看的)
  inputSchema: T                            // Zod schema 定义输入
  progress?: ToolCallProgress<P>            // 进度回调
  isEnabled?(context): boolean              // 是否启用
  isReadOnly?(context): boolean             // 是否只读
  needsPermissions?(context): boolean       // 是否需要权限
  canUse?(context): PermissionResult        // 权限检查
  execute(params, context): Promise<R>      // 执行逻辑
  renderToolUse?: (...) => ReactNode        // UI 渲染
  renderResult?: (...) => ReactNode         // 结果渲染
}

ToolUseContext (Tool.ts)

工具执行时的上下文对象,包含:

  • permissionMode - 权限模式 (bypassPermissions, default, etc.)
  • canUseTool - 权限检查函数
  • options - CLI 选项
  • abortController - 中断控制
  • fileStateCache - 文件状态缓存
  • messages - 对话历史
  • tools - 可用工具列表

3. 所有工具清单

核心工具(默认启用)

工具目录功能
BashTooltools/BashTool/执行 Shell 命令,支持沙盒模式
FileReadTooltools/FileReadTool/读取文件内容,支持图片处理
FileEditTooltools/FileEditTool/精确编辑文件(搜索替换)
FileWriteTooltools/FileWriteTool/写入/创建文件
GlobTooltools/GlobTool/文件名模式匹配搜索
GrepTooltools/GrepTool/文件内容搜索(正则)
WebFetchTooltools/WebFetchTool/抓取网页内容
WebSearchTooltools/WebSearchTool/网页搜索
AgentTooltools/AgentTool/子代理系统(多Agent协作)
TaskOutputTooltools/TaskOutputTool/获取任务输出
TaskStopTooltools/TaskStopTool/停止运行中的任务
TodoWriteTooltools/TodoWriteTool/待办事项管理
AskUserQuestionTooltools/AskUserQuestionTool/向用户提问
SkillTooltools/SkillTool/技能系统调用
BriefTooltools/BriefTool/Brief/摘要工具
EnterPlanModeTooltools/EnterPlanModeTool/进入计划模式
ExitPlanModeV2Tooltools/ExitPlanModeTool/退出计划模式
SendMessageTooltools/SendMessageTool/发送消息
ListMcpResourcesTooltools/ListMcpResourcesTool/列出 MCP 资源
ReadMcpResourceTooltools/ReadMcpResourceTool/读取 MCP 资源
NotebookEditTooltools/NotebookEditTool/Jupyter Notebook 编辑
ToolSearchTooltools/ToolSearchTool/工具搜索
LSPTooltools/LSPTool/语言服务协议(代码诊断)

条件启用工具

工具条件功能
PowerShellToolWindows 平台PowerShell 命令执行
ConfigToolUSER_TYPE=ant配置管理
TungstenToolUSER_TYPE=ant内部工具
REPLToolUSER_TYPE=antREPL 交互
CronCreateToolAGENT_TRIGGERS feature创建定时任务
CronDeleteToolAGENT_TRIGGERS feature删除定时任务
CronListToolAGENT_TRIGGERS feature列出定时任务
RemoteTriggerToolAGENT_TRIGGERS_REMOTE远程触发器
SleepToolPROACTIVE or KAIROS延迟执行
MonitorToolMONITOR_TOOL监控工具
EnterWorktreeToolworktree 模式进入 git worktree
ExitWorktreeToolworktree 模式退出 git worktree
TeamCreateToolAgent Swarms创建团队
TeamDeleteToolAgent Swarms删除团队
TaskCreateToolTodoV2创建任务
TaskGetToolTodoV2获取任务
TaskUpdateToolTodoV2更新任务
TaskListToolTodoV2列出任务
MCPToolMCP 服务配置调用外部 MCP 工具
SendUserFileToolKAIROS发送文件给用户
PushNotificationToolKAIROS推送通知
SubscribePRToolKAIROS_GITHUB_WEBHOOKS订阅 PR 事件

4. 工具注册机制

工具池组装 (tools.ts)

typescript
// 获取所有基础工具
getAllBaseTools(): Tools → Tool[]

// 根据权限上下文获取可用工具
getTools(permissionContext): Tools → 过滤后的 Tool[]

// 合并工具(含 MCP 工具)
getMergedTools(context): Tools

// 组装工具池(含 MCP + 动态工具)
assembleToolPool(context): Tools

工具过滤 (filterToolsByDenyRules)

权限系统会根据以下规则过滤工具:

  • Deny 规则:匹配的工具直接移除
  • Blanket deny:无内容的规则匹配整个工具
  • MCP 前缀mcp__server 形式的规则过滤整个 MCP 服务

5. BashTool 详解(最复杂的工具)

BashTool 有 15+ 个支持文件:

文件职责
prompt.ts给模型的工具描述 prompt
bashCommandHelpers.ts命令辅助函数
bashPermissions.ts权限检查逻辑
bashSecurity.ts安全沙盒
commandSemantics.ts命令语义分析
destructiveCommandWarning.ts危险命令警告
modeValidation.ts模式验证
pathValidation.ts路径验证
readOnlyValidation.ts只读验证
sedEditParser.tssed 编辑解析
sedValidation.tssed 命令验证
shouldUseSandbox.ts沙盒使用判断
toolName.ts工具名定义
utils.ts工具函数
commentLabel.ts注释标签

6. AgentTool 子代理系统

AgentTool 是多 Agent 协作的核心:

文件职责
runAgent.ts运行子代理
forkSubagent.tsFork 子代理进程
resumeAgent.ts恢复暂停的代理
loadAgentsDir.ts加载代理定义目录
builtInAgents.ts内置代理列表
agentMemory.ts代理记忆系统
agentColorManager.ts代理颜色管理
agentDisplay.ts代理显示渲染

内置代理 (built-in/)

代理功能
claudeCodeGuideAgent.tsClaude Code 使用指南
exploreAgent.ts代码库探索
generalPurposeAgent.ts通用目的代理
planAgent.ts计划代理
verificationAgent.ts验证代理
statuslineSetup.ts状态栏设置

7. 工具生命周期

1. 注册阶段
   getAllBaseTools() → 收集所有工具实例

2. 过滤阶段
   getTools(context) → 根据权限、feature flag 过滤
   assembleToolPool() → 加入 MCP 工具

3. 提交阶段
   QueryEngine → 将工具列表发送给 API

4. 调用阶段
   模型返回 tool_use → 匹配工具 → 检查权限 → execute()

5. 渲染阶段
   renderToolUse() → 显示工具调用 UI
   renderResult() → 显示结果 UI

6. 进度阶段
   progress() → 实时进度更新

8. 扩展:如何添加新工具

  1. src/tools/ 下创建新目录,如 MyTool/
  2. 创建主文件 MyTool.ts,导出 Tool 对象
  3. 创建 prompt.ts(工具描述)、constants.ts(常量)
  4. src/tools.tsgetAllBaseTools() 中注册
  5. 如需条件启用,添加 feature flag 检查
typescript
// MyTool/MyTool.ts
export const MyTool: Tool = buildTool({
  name: 'my_tool',
  description: () => 'A custom tool',
  inputSchema: z.object({ input: z.string() }),
  async *execute({ input }, context) {
    // 实现逻辑
    yield { type: 'progress', text: 'Working...' }
    return { type: 'text', text: 'Done' }
  }
})

9. MCP 工具集成

MCP (Model Context Protocol) 工具通过 MCPTool 动态注册:

  • MCPTool.ts - MCP 工具包装器
  • classifyForCollapse.ts - 工具折叠分类
  • MCP 服务配置在 services/mcp/ 中管理
  • 支持多种传输:stdio、SSE、WebSocket

MIT