Files
Cloud-Tour-to-Libo/docs/MCP_TOOL_EXPOSURE_FIX_AND_VERIFICATION.md

283 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MCP 工具未暴露问题修复与验证说明
## 1. 问题现象
MCP 客户端配置了服务地址:
```text
http://8.163.40.99:8102/mcp
```
但页面显示:
```text
工具 0
该服务还没有发现工具
```
直接访问服务也返回:
```text
404 Not Found
```
说明当前系统只有普通 HTTP 问答接口,还没有真正实现 MCP Server 的工具发现协议。
## 2. 问题归类
这不是知识图谱数据问题,也不是 LLM 问答引擎问题。
这是:
```text
MCP Server 适配层未实现 / tools/list 未暴露
```
已有能力:
```text
POST /v1/openapi/knowledge-qa/query
```
缺少能力:
```text
POST /mcp
initialize
ping
tools/list
tools/call
```
## 3. 修复方式
新增 FastAPI MCP 适配层:
```text
app/api/mcp_server.py
```
并在主应用挂载:
```text
app.include_router(mcp_router)
```
MCP 层不重写业务逻辑,只把 MCP 工具调用转换成现有百姓惠客服问答接口的内部调用:
```text
MCP Client
-> POST /mcp tools/call
-> ask_customer_service 等工具
-> 现有百姓惠客服问答 engine
-> FalkorDB / 图谱 / LLM
```
## 4. 已暴露工具
当前 `/mcp` 暴露 5 个只读工具:
| 工具名 | 作用 |
| --- | --- |
| `ask_customer_service` | 通用百姓惠智能客服问答 |
| `query_route_price` | 查询线路参考价格 |
| `list_travel_routes` | 查询旅行线路清单 |
| `query_route_detail` | 查询线路天数、景区、酒店、费用等详情 |
| `compare_routes` | 对比两条线路适配度、景点数量、轻松程度等 |
## 5. MCP 初始化验证
请求:
```bash
curl -sS http://8.163.40.99:8102/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "manual-check",
"version": "1.0.0"
}
}
}'
```
预期返回:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {
"listChanged": false
}
},
"serverInfo": {
"name": "baixinghui-customer-service-mcp",
"version": "0.1.0"
}
}
}
```
## 6. 工具发现验证
请求:
```bash
curl -sS http://8.163.40.99:8102/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
--data '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}'
```
预期结果:
```text
tools 数量 = 5
```
并能看到:
```text
ask_customer_service
query_route_price
list_travel_routes
query_route_detail
compare_routes
```
## 7. 工具调用验证
请求:
```bash
curl -sS http://8.163.40.99:8102/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
--data '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "ask_customer_service",
"arguments": {
"question": "黄小西三日游多少钱?",
"session_id": "mcp-test-session"
}
}
}'
```
预期返回结构:
```json
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "客服可直接回复的话术"
}
],
"structuredContent": {
"customer_reply": "客服可直接回复的话术",
"answer": "完整答案",
"knowledge": {
"plans": [],
"evidence": []
},
"trace_id": "排查链路 ID"
},
"isError": false
}
}
```
## 8. 客户端侧证明
修复后MCP 客户端刷新服务配置,应从:
```text
工具 0
该服务还没有发现工具
```
变为:
```text
工具 5
```
如果客户端仍显示 0按顺序检查
1. 服务地址是否为 `http://8.163.40.99:8102/mcp`
2. 服务是否已经重新构建并重启。
3. 客户端是否点击了“刷新”或重新检查连接。
4. 如果启用了鉴权,客户端是否带了正确的 `Authorization: Bearer <token>`
## 9. 鉴权说明
当前 MCP 适配层支持可选鉴权。
未设置环境变量时:
```text
BXH_MCP_TOKEN 为空
```
`/mcp` 不强制鉴权,方便内测。
如果设置:
```bash
export BXH_MCP_TOKEN="<your-token>"
```
客户端需要传:
```http
Authorization: Bearer <your-token>
```
或:
```http
X-MCP-API-Key: <your-token>
```
## 10. 结论
这次修复解决的是 MCP 协议层工具暴露问题。
修复前:
```text
/mcp 404
tools/list 无法执行
客户端工具数 0
```
修复后:
```text
/mcp 可响应 JSON-RPC
tools/list 返回 5 个工具
tools/call 可调用百姓惠客服问答 engine
```