Open
Description
Claude.ai 官方客户端现在支持 MCP 服务器了,理论上官网已经可以进行工具调用。
抓包看了一下。工具定义包含在 completion 请求 Body 的 tools 中。相比标准 API,多了一个 integration_name 参数(MCP 服务器名称)。
{
"name": "read_file",
"description": "Read the contents of a file from the file system or a URL with optional offset and length parameters.",
"input_schema": {
"type": "object",
"properties": {
"path": { "type": "string" },
"isUrl": { "type": "boolean", "default": false },
"offset": { "type": "number", "default": 0 },
"length": { "type": "number", "default": 1000 }
},
"required": ["path"],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
},
"integration_name": "desktop-commander"
}
completion 的工具调用响应与 API 大致一致。输出完成后会在 content_block_stop 事件处暂停,等待工具调用结果。不会返回 message_delta 和 message_stop 事件。
客户端通过 tool_result 端点发送工具调用结果。(在 API 中这个结果位于新请求的最后一条消息)
POST /api/organizations/{}/chat_conversations/{}/tool_result
Req:
{"type":"tool_result","tool_use_id":"toolu_01F1hJryMVsgXexHtuze1zxK","content":[{"type":"text","text":"[DIR] clewdr"}]}
发送工具调用结果后,先前的 completion 响应会继续返回后续内容。
经过测试 Claude.ai 不会进行并行工具调用。
考虑到请求中可能有工具调用历史,钓了一下工具调用的结构:
<antml:function_calls>
<antml:invoke name="desktop-commander:list_directory">
<antml:parameter name="path">/home/user/Projects</antml:parameter>
</antml:invoke>
</antml:function_calls>
<function_results>[DIR] clewdr</function_results>
"antml:" 前面需要跟真 Role 一样加特殊字符处理。
可能的实现方案:
对 completion 返回的 content_block,如果 type 为 tool_use:
- 在该 block 结束时构造并返回 message_delta 和 message_stop 事件
- 记录 tool_use_id,反代与 completion 保持连接
收到新请求时:
- 检查最后一条消息是否为 tool_result 且 ID 匹配
- 构造一个 message_start 事件返回
- 调用 tool_result 端点发送结果
- 将 completion 的后续结果返回到新请求
对于不在最后一条消息的历史工具调用,可以按照上述格式与其他消息一样格式化到文档里。
酒馆现在也可以工具调用了,但没有反代支持,生态还不完善。如果能工具调用,估计很多插件都可以大幅升级。这里仅作抛砖引玉,实施起来会比较复杂,期待佬的进一步开发。
Metadata
Metadata
Assignees
Labels
No labels