让 Claude 调用外部 API
用 GitHub 元数据走通 tool_use → HTTP → tool_result。
先完成首次 API 请求,将 client.mjs、external-tool.mjs 放在同一目录。本例无需 GitHub 令牌即可读取公开仓库元数据,但 Claude 调用仍消耗 API 额度,GitHub 也有限流。
1. 定义范围明确的工具
定义 name、description、input_schema。示例只接受 owner 与 repo,不接受任意 URL;执行代码验证参数,始终请求 api.github.com。Schema 指导生成参数,但执行端仍要验证。定义工具本身不会执行 API。
{
"name": "get_github_repository",
"description": "Read public repository metadata",
"input_schema": {
"type": "object",
"properties": {"owner": {"type": "string"}, "repo": {"type": "string"}},
"required": ["owner", "repo"],
"additionalProperties": false
}
}2. 由应用执行工具请求
将工具定义随用户消息发送。stop_reason 为 tool_use 时,逐个检查工具块、名称与输入,由代码发 HTTP 请求。示例仅返回所需仓库信息、来源链接与获取时间。open_issues_count 包含拉取请求,不能简单标成问题数。
3. 返回匹配的工具结果
将完整 assistant content 追加到历史,紧接一个 user 消息,内含所有 tool_result,每项匹配 tool_use_id。失败标记 is_error: true。再发送更新后的历史与工具定义,循环至 end_turn 并限制轮数,不假设调用一次就一定结束。
messages.push({role: "assistant", content: response.content});
messages.push({role: "user", content: [{
type: "tool_result", tool_use_id: call.id, content: result
}]});4. 运行并核验完整示例
使用 .env 运行下载脚本,将 URL、数字与仓库原页面对比,数量会随时间变化。示例最多五轮,每个响应最多四个工具调用,并含 HTTP 超时和工具错误回传。外部描述作为不可信数据处理;写入工具应在执行端加入授权和确认。
node --env-file=.env external-tool.mjs下载示例文件
教学示例的模型输出可能不同。请按前置条件操作并核验结果,页面本身不发送 API 请求。
练习与自检
跟踪一次成功调用和一次不存在仓库的查询,确认失败通过 is_error 回传,不生成虚构事实。
完成后,花一点时间检查:
阅读官方原始资料
CLI 操作已对照官方文档核查;API 示例通过模拟响应测试。未登录产品账户进行完整实机演示。