工具检索:几十把工具,按需取用

Claude Code 有 40 个内置工具(src/tools/ 目录下一一对应),按功能分组如下:

分组工具说明
文件操作FileReadTool、FileWriteTool、FileEditTool读、写、改文件
代码搜索GlobTool、GrepTool文件名匹配、内容搜索
命令执行BashTool、PowerShellTool执行 Shell 命令(跨平台)
Agent 协作AgentTool、SendMessageTool、TeamCreateTool、TeamDeleteTool启动子 Agent、团队协作
任务管理TaskCreateTool、TaskGetTool、TaskListTool、TaskOutputTool、TaskStopTool、TaskUpdateTool后台任务的全生命周期管理
计划模式EnterPlanModeTool、ExitPlanModeTool只规划、不执行
沙箱隔离EnterWorktreeTool、ExitWorktreeTool进入 / 退出 git worktree 隔离环境
MCP 协议MCPTool、McpAuthTool、ListMcpResourcesTool、ReadMcpResourceTool连接外部 MCP 服务器及其资源
网络能力WebFetchTool、WebSearchTool抓取网页、搜索引擎查询
NotebookNotebookEditTool编辑 Jupyter Notebook
开发辅助REPLTool、LSPTool、ToolSearchTool、SkillTool批量工具调用、语言服务、工具搜索、技能加载
交互与配置AskUserQuestionTool、ConfigTool、TodoWriteTool向用户提问、读写配置、任务清单
调度与触发ScheduleCronTool、RemoteTriggerTool、SleepTool定时任务、远程触发、等待
内部工具BriefTool、SyntheticOutputTool内部摘要生成、合成输出(不对外暴露)

全部在第一轮就塞进 Claude 的上下文,会浪费 token。shouldDefer 和 alwaysLoad 解决了这个问题:

// src/Tool.ts
readonly shouldDefer?: boolean
// 当 true 时:工具只发送名称,不发送完整参数 schema
// Claude 需要先调用 ToolSearch 才能获取完整定义,再调用该工具

readonly alwaysLoad?: boolean
// 当 true 时:即使整体开启了延迟加载,这个工具也始终包含完整 schema
// 适合 Claude 在第一轮就需要的工具(如 ToolSearch 本身)

这套机制实现了"按需加载":常用工具(Bash、FileEdit)始终加载,冷门工具(如 CronCreate)先隐藏,Claude 用 ToolSearch 描述关键词后才拿到完整定义。