mcp修复
This commit is contained in:
1 parent
801c0af692
commit
3080b17d02
9 files changed
+378
-73
No files matched your search
@@ -6,7 +6,7 @@
|
||||
| 运行方式 | 宿主机 Nginx 终止 HTTPS,Docker Compose 运行单个 Go 服务 |
|
||||
| 应用监听边界 | 容器内监听 8080,只发布到宿主机 127.0.0.1:16587 |
|
||||
| 数据库 | 使用现有 PostgreSQL/PostGIS;本手册不创建数据库容器、不导入 SQL |
|
||||
| 状态 | 测试环境部署基线;目标服务器、公网 DNS/TLS 和 SuperAgent 回调仍需现场验证 |
|
||||
| 状态 | 测试环境部署基线;目标机镜像构建和 Nginx 语法检查已由现场截图证明通过,但容器稳定运行、公网 TLS 和 SuperAgent MCP 握手/工具回调仍待重测 |
|
||||
|
||||
本手册不包含真实 Token、API Key、数据库密码或旧 Nginx 配置内容。命令中的尖括号是服务器上需要替换的占位符;不要把 Secret 写进命令行、Nginx 文件、镜像构建参数或 Git。
|
||||
|
||||
@@ -305,9 +305,28 @@ Method: POST
|
||||
Authorization: Bearer <FIRE_SAFETY_MCP_AUTH_TOKEN>
|
||||
~~~
|
||||
|
||||
该 Bearer 必须是 .env 中独立的 FIRE_SAFETY_MCP_AUTH_TOKEN,不要填 Chat xtoken 或 SuperAgent Open API Key。SuperAgent 还可能需要公网来源 IP 白名单、TLS CA 或自定义 Header,按实际平台和网络策略确认。
|
||||
该 Bearer 必须是 .env 中独立的 FIRE_SAFETY_MCP_AUTH_TOKEN,不要填 Chat xtoken 或 SuperAgent Open API Key。SuperAgent 当前不能在配置中指定 `protocolVersion`;不要把它或 `MCP-Protocol-Version` 作为客户端配置项加入。已稳定接通的 `th-hotel-simple-superagent` 不读取或校验这些版本元数据,而是固定返回 `2025-06-18`;消防 MCP 按这一已验证兼容档案接入,目标是打通工具调用,不是追求最新协议。SuperAgent 还可能需要公网来源 IP 白名单、TLS CA 或其他平台级 Header,按实际平台和网络策略确认。
|
||||
|
||||
在服务器或受控终端用独立变量测试初始化:
|
||||
服务端兼容规则如下:对可解析的 JSON-RPC `initialize`,`params.protocolVersion` 的缺失、空值、非字符串或其他值都不作为版本拒绝条件,响应固定返回 `result.protocolVersion: "2025-06-18"`;`MCP-Protocol-Version` Header 的缺失或值也不作为版本拒绝条件。固定返回该版本不表示服务实现或声明支持任意客户端版本,`2025-03-26`、`2025-11-25` 等值也不改变服务端实现目标。兼容仅针对版本元数据,Bearer、`Content-Type`、非空 `Origin`、JSON-RPC 结构、只读工具、服务端数据范围和敏感字段边界仍严格执行。
|
||||
|
||||
现场截图只证明公网 `/mcp` 已到达 Go 服务:Bearer、`Content-Type` 和 JSON-RPC 前置检查已通过,随后旧版本门禁返回错误。该历史截图没有捕获客户端版本字段是否存在、类型和值;同一 SuperAgent 中 `th-hotel-simple-superagent` 已稳定调用是兼容档案参照,但不是消防 MCP 成功证据。部署后通过 `direct_success`(客户端值为 `2025-06-18`)或 `compatibility_success`(版本字段缺失或其他值被兼容处理)日志分类确认,并完成完整调用链;服务端不得记录原始版本值。公网 SuperAgent 尚未调用消防数据库工具,因此不能把该截图当成公网部署或业务联调完成。
|
||||
|
||||
如果修改了 MCP Handler 或握手协商逻辑,目标机必须拉取包含该修改的明确 revision 后重建镜像;仅 `docker compose restart` 不会更新镜像中的代码:
|
||||
|
||||
~~~bash
|
||||
cd /home/firee-safety-ymd
|
||||
git fetch --prune origin
|
||||
git switch main
|
||||
git pull --ff-only origin main
|
||||
docker compose config --quiet
|
||||
docker compose build --pull
|
||||
docker compose up -d --force-recreate --remove-orphans
|
||||
docker compose ps
|
||||
docker compose logs --tail=100 api
|
||||
curl --fail http://127.0.0.1:16587/health
|
||||
~~~
|
||||
|
||||
在服务器或受控终端用独立变量测试初始化。下面的版本字段只是普通 JSON-RPC 参数示例,SuperAgent 不需要配置它;也可以省略或使用客户端实际发送的值:
|
||||
|
||||
~~~bash
|
||||
read -rsp 'MCP bearer: ' MCP_BEARER
|
||||
@@ -315,23 +334,33 @@ printf '\n'
|
||||
curl --fail \
|
||||
-H "Authorization: Bearer $MCP_BEARER" \
|
||||
-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-probe","version":"1"}}}' \
|
||||
'https://agent.nianxx.com/mcp'
|
||||
|
||||
curl --fail --output /dev/null --write-out 'initialized HTTP %{http_code}\n' \
|
||||
-H "Authorization: Bearer $MCP_BEARER" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'Accept: application/json, text/event-stream' \
|
||||
--data '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
|
||||
'https://agent.nianxx.com/mcp'
|
||||
|
||||
curl --fail \
|
||||
-H "Authorization: Bearer $MCP_BEARER" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'Accept: application/json, text/event-stream' \
|
||||
--data '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
|
||||
'https://agent.nianxx.com/mcp'
|
||||
|
||||
curl --fail \
|
||||
-H "Authorization: Bearer $MCP_BEARER" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'Accept: application/json, text/event-stream' \
|
||||
--data '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"fire_safety_search_place_candidates","arguments":{"place_name":"观水镇","limit":3}}}' \
|
||||
'https://agent.nianxx.com/mcp'
|
||||
~~~
|
||||
|
||||
确认第一步返回 `protocolVersion: 2025-06-18`,第二步返回 HTTP 202,第三步列出 7 个固定工具;再用无敏感信息的已知地名/点位做少量只读调用,核对正确 Bearer 成功、错误/缺失 Bearer 为 401、warnings 保留、非法参数不会变成任意 SQL。查询到资源记录不代表实时可用、路线已规划或正式集结点。
|
||||
确认第一步固定返回 `result.protocolVersion: 2025-06-18`,第二步返回 HTTP 202,第三步列出 7 个固定工具,第四步至少完成一个受控只读 `tools/call`。这四步 `initialize` → `notifications/initialized` → `tools/list` → `tools/call` 才是 SuperAgent 能调用消防 MCP 的验收链路;只看到 initialize 成功不能宣称接通。版本 Header 不需要配置或继续携带。再用无敏感信息的已知地名/点位做少量只读调用,核对正确 Bearer 成功、错误/缺失 Bearer 为 401、warnings 保留、非法参数不会变成任意 SQL。查询到资源记录不代表实时可用、路线已规划或正式集结点。
|
||||
|
||||
完成 MCP 测试后清理当前 shell 中的临时变量:
|
||||
|
||||
@@ -408,7 +437,7 @@ docker compose down
|
||||
- 目标机 nginx -t 和 reload 成功;443 证书、DNS、安全组及旧 location / 已确认不再生效。
|
||||
- Chat 首轮/多轮 SSE、错误凭证、未知 app/path 的实际 HTTPS 响应。
|
||||
- 若为已交付旧客户端临时开启 Chat legacy 短凭证兼容,应记录受控迁移窗口,确认启动 warning 不含 Secret,并在凭证轮换后恢复 `FIRE_SAFETY_CHAT_ALLOW_LEGACY_SHORT_TOKEN=false`。
|
||||
- SuperAgent -> /mcp 的独立 Bearer、TLS/网络白名单、工具发现和至少一个受控只读工具调用。
|
||||
- SuperAgent -> `/mcp` 的独立 Bearer、TLS/网络白名单、无版本配置 initialize 兼容响应、`notifications/initialized`、`tools/list` 和至少一个受控只读 `tools/call`。版本字段/Header 不作为配置或拒绝门禁;公网请求到达但没有完成这条调用链,不算完成。
|
||||
- 数据库未公开 5432,运行账号保持只读,PostGIS readiness warning 和 35 条无效面几何缺口已记录。
|
||||
|
||||
若目标服务器无法使用 host.docker.internal、Compose 不支持 --quiet、Nginx include 目录不同、证书路径不同或 SuperAgent 对 MCP 的认证格式不同,应先记录实际环境并调整部署 Spec;不要通过放开端口、写入 Token、关闭 readiness 或恢复全路径反代规避问题。
|
||||
Reference in new issue
Block a user