跳转到内容

Builtin Tools

Claude Code 内置了 40 余个 tool,分为多个类别。每个 tool 以目录形式实现于 src/tools/ 下,包含 tool 定义、UI 组件和 prompt 文本。本章对所有 tool 进行分类说明,并阐述各类别的设计原理。

每个 tool 遵循统一的文件布局:

src/tools/
├── BashTool/
│ ├── BashTool.tsx # Tool definition (call, schema, permissions)
│ ├── UI.tsx # Rendering components
│ ├── prompt.ts # System prompt for the tool
│ ├── toolName.ts # Exported name constant
│ ├── bashPermissions.ts # Permission logic
│ ├── bashSecurity.ts # Security checks
│ └── commandSemantics.ts # Command classification
├── FileReadTool/
│ ├── FileReadTool.ts
│ ├── UI.tsx
│ ├── prompt.ts
│ └── limits.ts
└── ...
mindmap
  root((Tools))
    File Operations
      FileRead
      FileWrite
      FileEdit
      NotebookEdit
    Search & Discovery
      Glob
      Grep
      ToolSearch
      LSP
    Execution
      Bash
      PowerShell
      REPL
    Agent & Task
      Agent
      TaskCreate
      TaskGet
      TaskList
      TaskOutput
      TaskStop
      TaskUpdate
    Communication
      AskUserQuestion
      SendMessage
      Brief
    Web
      WebSearch
      WebFetch
    Meta & Config
      TodoWrite
      Config
      Skill
    Plan & Workflow
      EnterPlanMode
      ExitPlanMode
      EnterWorktree
      ExitWorktree
    MCP
      MCPTool
      McpAuth
      ListMcpResources
      ReadMcpResource
    Team
      TeamCreate
      TeamDelete
    Background
      Sleep
      ScheduleCron
      RemoteTrigger
      SyntheticOutput

路径src/tools/FileReadTool/FileReadTool.ts

从本地文件系统读取文件。支持:

  • 带行号的文本文件(cat -n 格式)
  • 图片(PNG、JPG)——以 base64 返回,用于多模态处理
  • PDF——逐页文本 + 视觉提取
  • Jupyter notebook(.ipynb)——所有单元格及其输出
  • 偏移量/限制参数,支持分块读取大文件
inputSchema: z.object({
file_path: z.string(),
offset: z.number().optional(),
limit: z.number().optional(),
})

设计maxResultSizeChars: Infinity——结果永不持久化,因为该 tool 已通过 limits.ts 自行控制大小,从而避免 Read→file→Read 的循环。

路径src/tools/FileWriteTool/FileWriteTool.ts

写入完整文件内容。如有需要会创建父目录。记录新增/删除的行数用于费用展示。

设计:需要 permission 检查。非并发(有副作用)。在 TUI 中显示差异预览。

路径src/tools/FileEditTool/FileEditTool.ts

对文件执行精确字符串替换。old_string → new_string 模式确保精准编辑,无需依赖行号(行号可能发生漂移)。

inputSchema: z.object({
file_path: z.string(),
old_string: z.string(),
new_string: z.string(),
replace_all: z.boolean().default(false),
})

设计:若 old_string 在文件中不唯一(且 replace_all 为 false),编辑将失败。此约束防止意外编辑错误位置。

路径src/tools/NotebookEditTool/NotebookEditTool.ts

按索引编辑 Jupyter notebook 单元格。支持替换、插入和删除操作。

设计:默认延迟加载(shouldDefer: true)——仅当模型通过 ToolSearch 发现它时才加载。searchHint: 'jupyter' 有助于发现。

路径src/tools/GlobTool/GlobTool.ts

使用 glob 模式(如 **/*.ts)进行快速文件匹配。返回按修改时间排序的匹配文件路径。

设计:并发安全(只读)。结果数量上限为 globLimits.maxResults

路径src/tools/GrepTool/GrepTool.ts

基于 ripgrep 的内容搜索。支持正则表达式、文件类型过滤、上下文行数以及多种输出模式(contentfiles_with_matchescount)。

设计:并发安全。ripgrep 二进制文件与 Claude Code 捆绑,确保跨平台行为一致。

路径src/tools/ToolSearchTool/

通过关键词搜索可用 tool 列表。实现延迟加载模式——带有 shouldDefer: true 的 tool 仅在通过此 tool 发现后才完整加载。

路径src/tools/LSPTool/LSPTool.ts

Language Server Protocol 集成。提供语义代码智能(跳转定义、查找引用、诊断)。仅在 LSP 服务器已连接时启用(IDE 集成)。

路径src/tools/BashTool/BashTool.tsx

最复杂的 builtin tool。在持久化 session 中执行 shell 命令,具备:

  • 超时管理
  • 沙箱模式(macOS Seatbelt、Linux Landlock)
  • 安全命令分类(破坏性检测)
  • 大结果的输出截断
  • sed 验证,防止意外文件损坏
inputSchema: z.object({
command: z.string(),
timeout: z.number().optional(),
description: z.string().optional(),
})

设计:非并发。在 StreamingToolExecutor 中,只有 Bash 错误才会触发兄弟取消——原因是 Bash 命令通常形成隐式依赖链。

路径src/tools/PowerShellTool/

通过 PowerShell 执行 Windows 专用命令。在 Windows 平台上作为 Bash 的替代方案。

路径src/tools/REPLTool/

一个”透明包装器”,委托给其他 tool 执行。在模型可以链式调用多个 tool 的交互式 REPL 循环中内部使用。

路径src/tools/AgentTool/AgentTool.tsx

生成一个拥有独立对话 context 的 sub-agent。sub-agent 运行嵌套的 query() 循环并返回摘要。

设计:支持以下几种内置 agent 类型:

  • generalPurposeAgent——通用任务处理
  • exploreAgent——代码探索
  • planAgent——规划
  • verificationAgent——验证
  • claudeCodeGuideAgent——帮助/文档

任务管理(TaskCreate、TaskGet、TaskList、TaskOutput、TaskStop、TaskUpdate)

Section titled “任务管理(TaskCreate、TaskGet、TaskList、TaskOutput、TaskStop、TaskUpdate)”

路径src/tools/Task*Tool/

用于管理后台任务的 tool 族。任务作为独立进程运行,可以被监控、更新或停止。

Tool用途
TaskCreate启动新的后台任务
TaskGet检查任务状态
TaskList列出所有任务
TaskOutput读取任务输出
TaskStop终止任务
TaskUpdate向运行中的任务发送更新

路径src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx

向用户提问并获取输入。将用户回复作为 tool result 返回。

设计requiresUserInteraction: () => true——hook 可通过在 PreToolUse hook 响应中提供 updatedInput 来满足此交互。

路径src/tools/SendMessageTool/

在 multi-agent 场景中向其他 agent 发送消息。

路径src/tools/BriefTool/BriefTool.ts

创建带有可选文件附件和上传的简报/报告。

路径src/tools/WebSearchTool/

使用 Anthropic 服务端 web 搜索 tool 执行网络搜索。返回带摘要和链接的搜索结果。

路径src/tools/WebFetchTool/

从 URL 获取内容,将 HTML 转换为 markdown,并使用小型模型进行摘要处理。

路径src/tools/TodoWriteTool/TodoWriteTool.ts

创建并管理显示在 TUI 侧边栏中的结构化任务列表。用于追踪多步骤任务。

设计renderToolResultMessage 返回 null——结果显示在 todo 面板中,而非对话记录里。

路径src/tools/ConfigTool/ConfigTool.ts

查看和修改 Claude Code 设置。支持 supportedSettings.ts 中定义的一组配置项。

路径src/tools/SkillTool/

调用已注册的 skill(专业能力)。skill 可通过 ToolSearch 发现或直接引用。

路径src/tools/EnterPlanModeTool/src/tools/ExitPlanModeTool/

在计划模式(只读,不写入)和普通模式之间切换。计划模式将可用 tool 限制为只读操作。

设计:使用 contextModifier 修改 ToolPermissionContext.mode——这正是 ToolResult 类型上存在 context modifier 的原因。

路径src/tools/EnterWorktreeTool/src/tools/ExitWorktreeTool/

Git worktree 管理。创建并切换 worktree,支持并行开发工作流。

路径src/tools/MCPTool/MCPTool.ts

将 MCP 服务器 tool 适配为 Claude Code Tool interface 的通用包装器。在 MCP 服务器连接时动态创建。

McpAuth、ListMcpResources、ReadMcpResource

Section titled “McpAuth、ListMcpResources、ReadMcpResource”

用于认证、资源发现和资源读取的 MCP 基础设施 tool。

规范示例用途
PascalCase 目录BashTool/Tool 目录名
PascalCaseBashTool导出的 tool 名称
camelCase 文件toolName.ts辅助模块
mcp__server__toolmcp__github__create_issueMCP tool 命名

每个 tool 将其 system prompt 分离到专属的 prompt.ts 文件中:

src/tools/BashTool/prompt.ts
export async function getBashPrompt(options: {...}): Promise<string> {
return `You have access to a Bash tool for terminal operations...`;
}

这种模式使 prompt 可以:

  • 懒加载(仅在 tool 被使用时)
  • 独立测试
  • 根据 context 动态生成

Tool 可通过 onProgress 回调在执行期间上报进度:

async call(args, context, canUseTool, parentMessage, onProgress) {
onProgress?.({
toolUseID: context.toolUseId!,
data: { type: 'bash_progress', output: 'Running tests...' },
});
// ... execute ...
}

进度消息会立即提交给 UI(不缓冲),实现实时状态更新。

常并发运行的 tool(如 Grep、Glob)可以实现 renderGroupedToolUse,以展示精简视图:

Searched 5 files with Grep [3 results, 2 no match]

而非显示 5 个独立的 tool 使用/结果块。