Tool Use 是 Claude API 构建 Agent 的核心能力。没有工具时,模型只能生成文本;有工具后,Claude 可以查询数据库、调用 API、执行代码、搜索网页、编辑文件,形成真正的“观察—行动—反馈”循环。
两类工具:Client Tools 与 Server Tools
Anthropic 文档把工具按执行位置分为两类。
Client Tools
由你的应用执行。Claude 只返回结构化工具调用:
{
"type": "tool_use",
"name": "get_weather",
"input": { "location": "Shanghai" }
}然后你的代码执行这个函数,并把结果作为 tool_result 发回 Claude。
适合:
- 内部数据库查询
- 企业 API 调用
- 私有系统操作
- 需要自定义权限和审计的工具
Server Tools
由 Anthropic 基础设施执行,例如 web search、code execution、web fetch 等。你不需要自己实现执行逻辑。
适合:
- 快速接入通用能力
- 不想维护工具执行环境
- 搜索、代码执行等标准化工具
Agent Loop 如何工作?
一个典型工具循环:
- 用户提出任务
- Claude 判断需要工具
- API 返回
stop_reason: "tool_use" - 应用执行工具
- 应用把结果作为
tool_result发回 - Claude 基于结果继续回答或继续调用工具
这就是 Agent Loop。复杂任务可能循环多次,直到 Claude 判断任务完成。
工具定义怎么写?
工具定义通常包括:
name:稳定、清晰、可读description:说明何时使用、何时不要使用input_schema:JSON Schema,定义参数
示例:
{
"name": "get_customer_order",
"description": "Fetch a customer's order by order_id. Use only when the user provides an order ID.",
"input_schema": {
"type": "object",
"properties": {
"order_id": { "type": "string" }
},
"required": ["order_id"]
}
}描述越具体,Claude 越不容易误用工具。
strict tool use
对于生产环境,建议启用 strict schema,让 Claude 的工具调用严格符合 schema。
好处:
- 减少无效参数
- 降低后端校验复杂度
- 更适合自动化执行
- 让工具调用更可预测
但 strict 不代表业务安全。你仍然需要在工具执行层做权限验证、参数校验和审计。
参数缺失时会怎样?
如果用户说“查一下天气”,但工具需要 location:
- 更强模型更可能追问位置
- 某些情况下模型可能尝试推断默认值
- 行为不应被当作绝对保证
生产系统应在 Prompt 和工具描述中明确:缺少必填信息时先追问,不要猜。
成本构成
Tool Use 会增加 token:
- 工具定义本身会进入输入 token
tool_use块会进入输出/输入上下文tool_result会进入后续输入- server tools 可能有额外按次计费
如果工具很多、schema 很长,建议:
- 只暴露当前任务需要的工具
- 精简 schema 描述
- 对稳定工具定义使用 Prompt Caching
安全最佳实践
- 工具执行层永远不要信任模型参数
- 对危险操作加入人类确认
- 对读/写/删除权限分开设计工具
- 不要把“万能 execute_sql”直接暴露给模型
- 记录每次 tool_use 和 tool_result
- 对外部网页、邮件、Issue 内容做 prompt injection 防护
来源:Anthropic 官方文档 - Tool use with Claude | 整理:ClaudeEagle