当前位置: 首页 > news >正文

Claude Code 工具 详解

Claude Code 工具实现详解

工具总览

工具功能只读
Read读取文件内容,支持行范围和图片(Base64)
Write写入文件内容
Edit替换文件中的文本
Bash执行 shell 命令(PowerShell/cmd/bash)
Grep正则搜索文件内容(优先 ripgrep)
Globglob 模式搜索文件
WebSearchDuckDuckGo HTML 搜索
WebFetchHTTP GET 获取网页内容
Agent启动子 Agent 处理复杂任务
Skill执行 .md 格式的 Skill 脚本
Tasks任务管理(创建/获取/列表/更新/停止/输出)
NotebookEditJupyter notebook 编辑
LSP语言服务器协议交互
MCP连接 MCP 服务器工具桥接
Ask向用户提问获取输入
Notification发送系统通知
Config读取/写入配置
Brief切换简洁输出模式

核心实现模式

每个工具实现Tool接口,核心方法:

public interface Tool { String name(); // 工具名称 String description(); // LLM 看到的描述(含使用指南) String inputSchema(); // JSON Schema 定义参数 String execute(Map<String, Object> input, ToolContext context); // 执行逻辑 boolean isReadOnly(); // 是否只读(权限判断用) }

Tool 接口定义

public interface Tool { String name(); String description(); String inputSchema(); String execute(Map<String, Object> input, ToolContext context); ​ // 可选重写 default PermissionResult checkPermission(Map<String, Object> input, ToolContext context) { return PermissionResult.ALLOW; } default boolean isEnabled() { return true; } default boolean isReadOnly() { return false; } default String activityDescription(Map<String, Object> input) { return "Running " + name() + "..."; } }

典型实现示例

BashTool(命令执行)

路径:tool/impl/BashTool.java

功能:

  • 自动检测 shell:Windows 优先 pwsh,降级到 powershell.exe / cmd.exe

  • 危险命令黑名单(rm -rf /,fork bomb等)直接拦截

  • 高风险命令(rm -rf,git push -f等)记录警告

  • 超时保护(默认 120 秒)

  • 流式输出进度报告

危险命令黑名单:

rm -rf /, rm -rf /*, rm -rf ~, mkfs, dd if=, :(){:|:&};:, // fork bomb chmod -R 777 /, git push --force, git push -f, git reset --hard, shutdown, reboot, halt, format c:, del /f /s /q c:\

Shell 检测优先级:

  • Windows: pwsh → powershell.exe → cmd.exe

  • Unix: bash → sh

GrepTool(内容搜索)

路径:tool/impl/GrepTool.java

功能:

  • 优先使用ripgrep (rg)— 支持正则、多输出模式、上下文行

  • Windows 降级到findstr,Unix 降级到grep

  • 支持content/files_with_matches/count三种输出模式

  • 跳过隐藏目录和 node_modules/target/build

输出模式:

  • content: 显示匹配行及上下文(默认)

  • files_with_matches: 仅显示包含匹配的文件路径

  • count: 显示每个文件的匹配数量

WebSearchTool(网络搜索)

路径:tool/impl/WebSearchTool.java

功能:

  • 使用 DuckDuckGo HTML 搜索(无需 API Key)

  • 正则解析搜索结果(标题、URL、摘要)

  • 备用解析模式应对页面结构变化

  • 默认返回 8 条结果,最多 20 条

搜索端点:https://html.duckduckgo.com/html/

WebFetchTool(网页获取)

路径:tool/impl/WebFetchTool.java

功能:

  • HTTP GET 请求,自动处理重定向

  • HTML → 纯文本转换(移除脚本/样式,转换标签为文本格式)

  • 响应体最大 100KB,超出截断

  • 30 秒超时保护

FileReadTool(文件读取)

路径:tool/impl/FileReadTool.java

功能:

  • 文本文件:支持line_start/line_end行范围(1-based)

  • 图片文件:返回 Base64 编码 + MIME 类型

  • 单次最多读取 2000 行,超出显示... (X more lines)

支持图片格式: png, jpg, jpeg, gif, webp, svg, bmp, ico

输出格式:

1 | 文件第一行 2 | 文件第二行 ...

AgentTool(子 Agent)

路径:tool/impl/AgentTool.java

功能:

  • 从 ToolContext 获取 AgentLoop 工厂创建子 Agent

  • 子 Agent 拥有独立消息历史,共享工具集

  • 用于复杂多步骤任务、并行处理、隔离风险操作

子 Agent 提示词构建:

private String buildSubAgentPrompt(String prompt, String additionalContext) { // 包含任务描述、附加上下文、输出要求 }

SkillTool(Skill 执行)

路径:tool/impl/SkillTool.java

功能:

  • 解析.md文件中的!嵌入命令语法

  • 支持---分隔的 frontmatter(shell/workDir/effectiveTime 等)

  • 命令输出替换占位符后返回内容

嵌入命令语法:

  • 代码块:```! command ```

  • 行内:!command

工具注册

工具通过ToolRegistry注册到系统:

public class ToolRegistry { public List<ToolCallback> toCallbacks(ToolContext context) { // 将所有 Tool 转为 Spring AI 的 ToolCallback } }

工具调用流程

LLM 返回 tool_calls JSON ↓ AgentToolExecutor.parseArguments() // 用 Jackson 解析 JSON 为 Map ↓ findCallbackByName() // 查找对应的 Tool ↓ checkPermission() // 权限检查 ↓ adapter.call(toolArgs) // 执行工具 ↓ 返回结果文本,加入消息历史

参数解析

// 从 JSON 字符串解析为 Map private Map<String, Object> parseArguments(String toolName, String toolArgs) { return MAPPER.readValue(toolArgs, Map.class); }

工具执行上下文 (ToolContext)

public class ToolContext { Path getWorkDir(); // 工作目录 void reportProgress(String line); // 进度回调 <T> T getOrDefault(String key, T defaultValue); // 扩展属性 }

工具可以通过 ToolContext 传递共享状态,如 AgentTool 通过AGENT_FACTORY_KEY获取 AgentLoop 工厂。

http://www.jsqmd.com/news/739216/

相关文章:

  • 别再为内存不够发愁了!手把手教你用STM32的FSMC外扩IS61WV102416BLL SRAM(附CubeMX配置)
  • 从PS5到Switch:游戏玩家专属电视选购指南(含索尼/三星/LG型号推荐及参数设置)
  • 终极热键侦探:3分钟快速定位Windows快捷键冲突的智能解决方案
  • 2026年西安GEO公司综合实力排行榜(TOP5) - GrowthUME
  • AI思维框架实战:用八大师模型提升深度分析与决策能力
  • 测试开发全日制学徒班7期第8天“-字典
  • STM32F103+SX1262 LoRa模块点对点通信实战:从硬件连接到代码调试(Keil MDK环境)
  • SLAM算法调参好帮手:用evo_config保存你的专属评估模板,告别重复命令
  • 为内部知识问答系统集成 Taotoken 的多模型聚合能力
  • 连接器
  • [具身智能-543]:终端卖硬件,连接“人”与物理世界;云端卖服务,淘金大市场无所不包。
  • 开发者如何打造高质量技术视频:从定位到运营的完整实战指南
  • 工业Python故障预测不讲原理只讲结果:12个已商用案例的特征工程清单(含振动+电流+温度多源融合技巧)
  • 避坑指南:Xilinx OSERDESE2仿真时序对不齐?可能是CLK/CLKDIV相位和复位没搞对
  • 从状态机到主函数:手把手拆解AutoSar COM模块的运行时行为与配置映射
  • 3个步骤掌握AKShare:Python量化投资数据获取终极指南
  • 别再只调IOU了!深入StrongSORT的BoT、EMA、NSA Kalman,揭秘多目标跟踪的六大核心trick
  • 使用 Taotoken 统一管理多个 AI 模型的 API 密钥与访问控制
  • 终极指南:3分钟掌握My-TODOs免费桌面待办工具,开启高效生活新篇章
  • 国产麒麟系统(arm64)离线部署Docker全家桶:从下载到启动的保姆级避坑记录
  • Python原生AI应用推理加速的“最后一公里”:细粒度算子级Fusion策略,实测降低H100显存占用37.6%
  • 跨平台音频下载工具终极指南:快速搭建个人音频资源库
  • 微信好友智能检测:高效发现单向好友关系的自动化解决方案
  • 告别理论!在Vivado里手把手搭建一个USB 2.0协议分析仪(基于FPGA+FT232)
  • 为Nodejs后端服务配置Taotoken作为大模型统一调用层
  • uni-app + ECharts 从踩坑到优雅集成:一个保险数据可视化页面的完整开发记录
  • 英雄联盟皮肤注入神器R3nzSkin:从零开始实现游戏换肤自由
  • 探索猫抓:让浏览器资源获取变得触手可及
  • QueryExcel:基于NPOI与多线程架构的分布式Excel内容检索引擎
  • 为什么92%的LLM偏见报告经不起统计推断?用R语言做p-hacking防御与多重检验校正,立即规避假阳性陷阱