BrainBank
AI 课堂/知识Claude Code Deep Dive

工具系统解析:Tool 抽象与 tools 注册表

2026/7/31 15:18:25 · 更新于 2026/7/31 15:21:21

#claude-code#knowledge#tool-architecture#protocol-design#agent-systems#capability-discovery

本文深入解析 Claude Code 如何通过统一的 Tool.ts 抽象层定义工具协议(输入 Schema、运行上下文、权限约束),并通过 tools.ts 注册表动态管理可调用的能力全集,揭示其从「聊天 + 插件」到可操作工程代理的核心架构差异。

Claude Code 的强执行力不仅依赖底层模型,更离不开其外部工具系统的精密设计。本文将深入解析该系统的核心架构:通过 Tool.ts 定义的统一抽象协议、ToolUseContext 提供的丰富运行时上下文,以及 tools.ts 实现的动态注册与权限过滤机制,揭示该系统如何构建出一个安全、可扩展且高度可控的工程代理执行层。

核心协议层:Tool.ts 的统一抽象

Tool.ts 并非某个具体工具的实现,而是全系统的工具抽象层。其核心价值在于两点:

  • 统一语义:标准化工具的输入结构、输出格式、上下文依赖与权限边界。
  • 固化契约:为所有工具提供一致的执行规范,确保系统能准确理解与调度。

该文件定义了系统的关键类型接口:

  • ToolInputJSONSchema
  • ToolUseContext
  • ToolPermissionContext
  • 进度追踪与状态管理类型
export type ToolInputJSONSchema = {
  [x: string]: unknown
  type: 'object'
  properties?: {
    [x: string]: unknown
  }
}

这段定义虽短,却确立了系统的设计基线:工具不是随意的文本描述或 Prompt 技巧,而是具备明确输入结构、可枚举参数、且能被系统层级理解的契约对象。 这正是工程化工具系统与单纯提示词工程的本质区别。

运行时支撑:ToolUseContext 的完整会话上下文

ToolUseContext 承载了工具执行时所需的全部运行时资源,证明工具在系统中并非孤立函数,而是深度嵌入完整会话生态的能力节点

  • 能力路由:当前工具集合 (tools)、命令集合 (commands)、MCP Client/Resource
  • 状态管理AppState 读写方法、文件读取缓存 (readFileState)
  • 交互控制:通知能力、中断逻辑 (abortController)、消息历史流 (messages)
  • 元数据追踪attribution / fileHistory 更新器
export type ToolUseContext = {
  options: {
    commands: Command[]
    debug: boolean
    mainLoopModel: string
    tools: Tools
    verbose: boolean
    thinkingConfig: ThinkingConfig
    mcpClients: MCPServerConnection[]
    mcpResources: Record<string, ServerResource[]>
  }
  abortController: AbortController
  readFileState: FileStateCache
  getAppState(): AppState
  setAppState(f: (prev: AppState) => AppState): void
  messages: Message[]
}

一个工具的执行,实际上是被注入完整运行时沙箱中进行的。它依赖的不仅是参数,而是整个 Agent 会话的状态、配置与生命周期控制。

能力注册表:tools.ts 的动态目录

如果说 Tool.ts 定义了协议,tools.ts 则维护着本次系统实际暴露的能力清单。其覆盖范围已远超基础 CRUD,呈现高度模块化的智能体工作流特征:

工具类别核心组件
文件操作FileReadTool, FileEditTool, FileWriteTool, Notebook
终端执行BashTool, PowerShell (通过 Command 集成)
搜索与检索GlobTool, GrepTool, WebFetchTool, WebSearchTool
网络与交互WebBrowser, AskUserQuestionTool
任务与协作TodoWriteTool, TeamCreate/TeamDelete, AgentTool, SendMessageTool
模式控制EnteringPlanModeTool, ExitPlanModeV2Tool
协议集成LSPTool, ToolSearchTool, MCP 资源读写工具
export function getAllBaseTools(): Tools {
  return [
    AgentTool, TaskOutputTool, BashTool,
    ...(hasEmbeddedSearchTools() ? [] : [GlobTool, GrepTool]),
    ExitPlanModeV2Tool, FileReadTool, FileEditTool, FileWriteTool,
    WebFetchTool, TodoWriteTool, WebSearchTool, AskUserQuestionTool,
    SkillTool, EnterPlanModeTool,
    ...(isEnvTruthy(process.env.ENABLE_LSP_TOOL) ? [LSPTool] : []),
    ListMcpResourcesTool, ReadMcpResourceTool,
  ]
}

工具集并非静态硬编码。系统会根据环境变量 (process.env)、平台特性与 Feature Flag 动态决定最终清单,体现出极强的构建期配置能力。

安全与权限:前置过滤与动态暴露

Claude Code 从不将全部代码级工具直接暴露给模型。在模型实际调度前,工具集会经历严格的环境检测与权限过滤:

export function filterToolsByDenyRules<
  T extends {
    name: string
    mcpInfo?: { serverName: string; toolName: string }
  },
>(tools: readonly T[], permissionContext: ToolPermissionContext): T[] {
  return tools.filter(tool => !getDenyRuleForTool(permissionContext, tool))
}

这一设计体现两大安全与工程原则:

  1. 最小权限动态暴露:模型实际可见的工具集 ≠ 代码库中的工具总量。系统通过规则引擎按需裁剪能力边界。
  2. 安全前置(Shift-Left Security):权限控制不依赖执行时的运行时拦截,而是在能力挂载阶段直接过滤。无效/危险工具甚至不会出现在模型的 Prompt 上下文中,从根本上降低了越权调用的概率。

工程哲学与设计演进

从该工具系统的架构取舍中,可清晰识别出 Claude Code 的核心工程取向:

  • 能力统一封装:先定义抽象协议与上下文模型,再挂载具体实现,解耦协议层与业务层。
  • 权限前置与环境驱动:通过构建期配置与声明式规则控制能力面,而非依赖运行时的补丁式安全。
  • 扩展优先(Extension-First):MCP、LSP、Agent 协作、Worktree 等均作为“插件式”节点接入统一协议,无需修改核心调度逻辑。

这也解释了系统后续的演进路径。当工具协议稳定后,新增能力的路径变得高度可预测:

  1. 实现符合 ToolInputJSONSchema 的新工具类
  2. 注入标准 ToolUseContext 与权限上下文
  3. 注册至 tools.ts 并配置启用条件
  4. 按需暴露给模型

Claude Code 的工具系统,本质上是用统一的 Tool 协议,将文件系统、终端、搜索、外部集成和智能体能力包装成模型可调用、可控、可扩展的执行层。理解这层架构,便能明白它并非“聊天模型 + 插件”的简单拼凑,而是一个具备完整工程代理能力的操作中枢。

Key takeaways

  • 协议驱动执行Tool.ts 通过强类型输入 Schema 与标准契约,将工具从 Prompt 依赖转变为系统级可调度对象。
  • 上下文即资源ToolUseContext 提供完整会话沙箱,工具在状态感知、权限控制与中断管理下协同工作。
  • 注册表动态化tools.ts 结合环境变量与 Feature Flag 实现构建期裁剪,模型可见能力严格受控于安全规则。
  • 架构演进红利:统一抽象层使得扩展新能力(MCP/LSP/Agent协作)可复用现有调度与安全基础设施,大幅降低系统熵增。

image.png

image.png

image.png

学习地图

分阶学习路线

第一阶段:建立认知

  • 理解 AI 工具系统为什么需要统一协议而非自由拼接
  • 明确 Tool.ts 四个设计目标:输入 Schema、统一上下文、权限约束、进度反馈
  • 认识 ToolUseContext 承载的运行时资源全貌

第二阶段:源码探索

  • 在 Claude Code GitHub 仓库中定位 Tool.ts,分析核心类型定义
  • 阅读 tools.tsgetAllBaseTools() 注册列表,理解能力面分类
  • 跟踪 filterToolsByDenyRules() 权限过滤链路

第三阶段:对比扩展认知

  • 对比 MCP(外部工具接入)与内建工具的协议差异
  • 分析 feature gate / Env flag 对工具集裁剪的影响
  • 梳理自定义工具接入的完整路径

第四阶段:实践输出

  • 在 Claude Code 中实际调用不同类别工具,观察能力边界
  • 配置 ENABLE_LSP_TOOL 等环境变量验证动态启用机制

动手实践——分步指南

  1. 安装并初始化 Claude Code(https://github.com/anthropics/claude-code),确认 CLI 可正常运行
  2. 在终端中启动一次会话,观察初始加载时模型收到的工具列表信息
  3. 依次调用三类基础工具验证能力:
    • 文件类:用 FileRead 读取仓库中的任一 .ts 源文件
    • 命令类:用 Bash 执行 ls -la 查看当前目录结构
    • 搜索类:用 Grep 在当前项目中搜索关键词(如 'Tool')
  4. 打开 Claude Code 源码仓库的 src/agents/tools/ 目录,逐一阅读以下文件:
    • Tool.ts — 对照文章列出核心类型及职责
    • tools.ts — 追踪 getAllBaseTools() 返回的工具清单
  5. getAllBaseTools() 输出中尝试找出受环境变量控制的工具(查找 ENABLE_ 前缀的条件分支)
  6. 查看 filterToolsByDenyRules() 源码,理解权限过滤是在模型调用前还是执行时生效
  7. 查阅 MCP 文档(https://modelcontextprotocol.io/docs/concepts/tools),对比其工具定义与 Claude Code 内建协议差异
  8. 尝试在代码中新增一个极简 Tool 实现:定义输入 Schema、实现 execute 方法、注册到 tools 数组,观察如何暴露给模型

三大推荐资源

  1. 1
    Claude Code GitHub 仓库

    Claude Code 官方开源仓库,包含 Tool.ts、tools.ts 等核心源码,是研究其工具系统架构的第一手资料。

    https://github.com/anthropics/claude-code

  2. 2
    Model Context Protocol (MCP) 规范

    MCP 官方协议文档,定义标准化工具调用接口,可与 Claude Code 内建工具系统对比理解统一协议的设计理念。

    https://modelcontextprotocol.io/docs/concepts/tools

  3. 3
    TypeScript Handbook — Interfaces and Types

    理解 Tool.ts 中 `ToolInputJSONSchema`、`ToolUseContext` 等 TypeScript 类型定义,是解读工具契约源码的基础参考。

    https://www.typescriptlang.org/docs/handbook/2/objects.html

链接由 AI 推荐——使用前建议快速核实。