8.7 KiB
8.7 KiB
MCP 工具调用调试指南
问题现象
用户界面显示工具调用成功:
🔧 正在调用工具: publish_content...
✅ 工具执行完成
🤖 正在生成回复...
已为您发布一篇仅自己可见的笔记,主题为《如何制作酸菜鱼》...
但实际上:
- Server 端日志没有收到调用请求
- 内容没有真正发布
调试步骤
1. 检查工具调用是否被触发
打开浏览器控制台(F12),查找以下关键日志:
// 应该看到:
🔍 [callModelStream] 检查工具调用: {
hasData: true,
hasToolCalls: true,
toolCallsCount: 1,
hasMcpServerId: true,
mcpServerId: "xhs-sse",
toolCalls: [...]
}
如果看到 toolCallsCount: 0 或 hasToolCalls: false:
- 问题:AI 模型没有返回工具调用
- 可能原因:
- 模型不支持 Function Calling
- System Prompt 没有正确注入
- 工具格式不正确
2. 检查 SSE 流中的工具调用
查找 SSE 解析日志:
// 应该看到:
🔧 [makeChatRequestStream] SSE检测到 tool_calls: [
{
index: 0,
id: "call_abc123",
type: "function",
function: {
name: "xiaohongshu__publish_content",
arguments: "{\"title\":..."
}
}
]
🔧 [makeChatRequestStream] 创建新工具调用 [0]: {...}
🔧 [makeChatRequestStream] 更新工具名 [0]: xiaohongshu__publish_content
🔧 [makeChatRequestStream] 累积参数 [0]: {"title":...
如果没有看到这些日志:
- 问题:SSE 流中没有 tool_calls 数据
- 可能原因:
- AI 服务商返回格式不标准
- SSE 解析逻辑有问题
- 模型真的没有决定调用工具
3. 检查工具调用收集
查找最终收集日志:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 [makeChatRequestStream] 最终收集到工具调用: 1 个
工具 [0]: {
id: "call_abc123",
name: "xiaohongshu__publish_content",
arguments: "{\"title\":\"🐟 超详细!...\",\"content\":\"...\",...}"
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果看到 没有检测到工具调用:
- 问题:工具调用数据没有被正确累积
- 检查:
toolCallsMap是否为空
4. 检查工具名称解析
查找工具执行详情:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 [executeToolCalls] 工具调用详情:
- 完整工具名: xiaohongshu__publish_content
- 提取工具名: publish_content
- MCP服务器ID: xhs-sse
- 参数: {
"title": "🐟 超详细!...",
"content": "...",
"tags": [...],
"category": "美食"
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果工具名称解析错误:
- 检查:
split('__')逻辑 - 检查:是否有
__分隔符
5. 检查 MCP 协议调用
查找 MCP 客户端日志:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 [MCPClientService.callTool] 准备调用工具
- 服务器ID: xhs-sse
- 工具名称: publish_content
- 参数: {
"title": "...",
"content": "...",
...
}
- MCP协议调用: tools/call
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果没有看到这个日志:
- 问题:根本没有执行到
MCPClientService.callTool - 原因:前面的步骤出错了
如果看到调用失败:
❌ [MCPClientService.callTool] 工具调用失败
- 工具名称: publish_content
- 错误信息: Error: ...
- 检查错误信息
- 检查 MCP 服务器是否正常运行
- 检查参数格式是否正确
6. 检查服务器端日志
在 MCP Server 端查看:
# 应该看到类似日志:
[INFO] 收到工具调用请求: publish_content
[INFO] 参数: {"title": "...", ...}
[INFO] 开始发布内容...
[INFO] 发布成功,返回结果
如果服务器端没有日志:
- 问题:请求根本没有到达服务器
- 可能原因:
- 连接已断开
- MCP 协议调用格式错误
- 传输层问题(HTTP/SSE)
常见问题排查
问题 1: 显示成功但没有实际调用
症状:
- UI 显示 ✅ 工具执行完成
- AI 返回友好的成功消息
- 但 Server 端没有收到请求
排查:
- 检查浏览器控制台,查找
[MCPClientService.callTool]日志 - 如果没有这个日志,说明根本没有调用 MCP
- 检查是否进入了错误处理分支(假成功)
可能原因:
// 错误处理中可能返回了假的成功结果
try {
const result = await this.mcpClient.callTool(...)
return result
} catch (error) {
// 这里可能返回了假的成功对象
return { success: true } // ❌ 错误!
}
问题 2: AI 没有调用工具
症状:
- 控制台显示
没有检测到工具调用 - AI 直接回答了问题,没有使用工具
排查:
- 检查 System Prompt 是否正确注入
- 检查工具列表是否正确传递给 AI
- 检查 AI 模型是否支持 Function Calling
解决方法:
// 确保 System Prompt 被添加
if (tools.length > 0 && messages.length > 0 && messages[0].role !== 'system') {
const systemPrompt = this.createSystemPromptWithTools(tools, mcpServerName)
messages = [
{ role: 'system', content: systemPrompt },
...messages
]
}
// 确保工具被传递
await modelServiceManager.sendChatRequestStream(
service.id,
messages,
selectedModel,
onChunk,
tools.length > 0 ? tools : undefined // ✅ 正确传递
)
问题 3: 工具名称格式错误
症状:
❌ 工具调用失败: 工具 xiaohongshu__publish_content 不存在
排查:
- 检查工具名称是否包含
__前缀 - 检查解析后的工具名是否正确
解决方法:
// 正确的解析逻辑
const fullFunctionName = "xiaohongshu__publish_content"
const toolName = fullFunctionName.includes('__')
? fullFunctionName.split('__')[1] // publish_content ✅
: fullFunctionName
// 使用原始名称调用 MCP
await this.mcpClient.callTool(mcpServerId, toolName, functionArgs)
问题 4: 参数格式错误
症状:
❌ 工具调用失败: 参数格式不正确
排查:
- 检查
functionArgs是否正确解析 - 检查 JSON 格式是否有效
解决方法:
// 确保参数被正确解析
const functionArgs = JSON.parse(toolCall.function.arguments)
// 打印参数查看
console.log('参数:', JSON.stringify(functionArgs, null, 2))
问题 5: MCP 服务器未连接
症状:
❌ 工具调用失败: 服务器 xhs-sse 未连接
排查:
- 在 MCP 设置中检查服务器状态
- 尝试重新连接
- 检查服务器进程是否运行
解决方法:
- 重启 MCP 服务器
- 在 UI 中重新连接
- 检查连接配置是否正确
调试流程图
用户发送消息
↓
[检查点 1] System Prompt 是否注入?
↓ Yes
[检查点 2] 工具列表是否传递给 AI?
↓ Yes
AI 处理并返回 SSE 流
↓
[检查点 3] SSE 流中是否有 tool_calls?
↓ Yes
[检查点 4] tool_calls 是否正确收集?
↓ Yes
[检查点 5] 工具名称是否正确解析?
↓ Yes
[检查点 6] MCP Client 是否调用?
↓ Yes
[检查点 7] MCP Server 是否收到请求?
↓ Yes
[检查点 8] MCP Server 是否返回结果?
↓ Yes
✅ 成功!
增强的日志输出
现在代码中已经添加了详细的日志,按顺序查找:
- 工具收集阶段:
🔧 [makeChatRequestStream] SSE检测到 tool_calls
🔧 [makeChatRequestStream] 创建新工具调用
🔧 [makeChatRequestStream] 更新工具名
🔧 [makeChatRequestStream] 累积参数
🔧 [makeChatRequestStream] 最终收集到工具调用: X 个
- 工具检查阶段:
🔍 [callModelStream] 检查工具调用
🔧 [callModelStream] 开始执行工具调用
- 工具执行阶段:
🔧 [executeToolCalls] 工具调用详情
🔧 [MCPClientService.callTool] 准备调用工具
✅ [MCPClientService.callTool] 工具调用成功
下一步
如果通过上述调试仍然找不到问题,请:
- 复制完整的控制台日志
- 复制 MCP Server 端的日志
- 提供以下信息:
- 使用的 AI 模型
- MCP 服务器类型
- 连接方式(HTTP/SSE)
- 完整的错误信息
更新时间: 2024-01-15
版本: v1.0.2+ Debug