fix mcp
parent
355be362fc
commit
f140ed9218
|
|
@ -48,6 +48,8 @@ app.add_middleware(
|
||||||
allow_credentials=True,
|
allow_credentials=True,
|
||||||
allow_methods=["*"],
|
allow_methods=["*"],
|
||||||
allow_headers=["*"],
|
allow_headers=["*"],
|
||||||
|
# Browser-based MCP clients may need to read the negotiated session header.
|
||||||
|
expose_headers=["mcp-session-id", "Mcp-Session-Id"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# 注册 API 路由
|
# 注册 API 路由
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ NexDocs 现在不再使用项目根目录下的独立 `mcp_server/`。
|
||||||
- 业务 REST API 继续走 `/api/v1/...`
|
- 业务 REST API 继续走 `/api/v1/...`
|
||||||
- MCP 入口挂载在同一个 backend 服务上
|
- MCP 入口挂载在同一个 backend 服务上
|
||||||
- 传输协议为 `streamableHttp`
|
- 传输协议为 `streamableHttp`
|
||||||
- MCP 地址为 `/mcp/`
|
- MCP 地址为 `/mcp`(`/mcp/` 也兼容)
|
||||||
- 认证方式为 `X-Bot-Id` + `X-Bot-Secret`
|
- 认证方式为 `X-Bot-Id` + `X-Bot-Secret`
|
||||||
|
|
||||||
这意味着:
|
这意味着:
|
||||||
|
|
@ -24,20 +24,21 @@ NexDocs 现在不再使用项目根目录下的独立 `mcp_server/`。
|
||||||
MCP 对外地址:
|
MCP 对外地址:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
http://<backend-host>:<backend-port>/mcp/
|
http://<backend-host>:<backend-port>/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
例如:
|
例如:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
http://backend.internal:8000/mcp/
|
http://backend.internal:8000/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
说明:
|
说明:
|
||||||
|
|
||||||
- 请直接使用带尾部 `/` 的地址
|
- 推荐优先使用 `/mcp`
|
||||||
- 请求 `/mcp` 会被后端重定向到 `/mcp/`
|
- `/mcp/` 也兼容
|
||||||
- 未携带 bot 凭证时,访问 `/mcp/` 会返回 `401`
|
- 如果前面还有 Nginx/网关,请不要对 `/mcp` 做 `301`/`302` 重定向
|
||||||
|
- 未携带 bot 凭证时,访问 `/mcp` 或 `/mcp/` 都会返回 `401`
|
||||||
|
|
||||||
|
|
||||||
## 3. 认证模型
|
## 3. 认证模型
|
||||||
|
|
@ -206,7 +207,7 @@ delete_file
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"biz_mcp": {
|
"biz_mcp": {
|
||||||
"type": "streamableHttp",
|
"type": "streamableHttp",
|
||||||
"url": "http://backend.internal:8000/mcp/",
|
"url": "http://backend.internal:8000/mcp",
|
||||||
"headers": {
|
"headers": {
|
||||||
"X-Bot-Id": "nexbot_xxxxxxxxxxxxxxxx",
|
"X-Bot-Id": "nexbot_xxxxxxxxxxxxxxxx",
|
||||||
"X-Bot-Secret": "nxbotsec_xxxxxxxxxxxxxxxxxxxxxxxx"
|
"X-Bot-Secret": "nxbotsec_xxxxxxxxxxxxxxxxxxxxxxxx"
|
||||||
|
|
@ -220,9 +221,10 @@ delete_file
|
||||||
|
|
||||||
注意:
|
注意:
|
||||||
|
|
||||||
- `url` 建议使用 `/mcp/`
|
- `url` 建议使用 `/mcp`
|
||||||
- `headers` 中不需要再放业务用户名密码
|
- `headers` 中不需要再放业务用户名密码
|
||||||
- `X-Bot-Secret` 只应发给受信任的调用端
|
- `X-Bot-Secret` 只应发给受信任的调用端
|
||||||
|
- 如果客户端运行在浏览器环境,记得把对应站点加入后端 `CORS_ORIGINS`
|
||||||
|
|
||||||
|
|
||||||
## 7. 后端部署要求
|
## 7. 后端部署要求
|
||||||
|
|
@ -269,13 +271,13 @@ env -u HTTP_PROXY -u HTTPS_PROXY ./venv312/bin/pip install -r requirements.txt
|
||||||
|
|
||||||
- Python 3.12 环境可正常启动 backend
|
- Python 3.12 环境可正常启动 backend
|
||||||
- `/health` 返回 `200`
|
- `/health` 返回 `200`
|
||||||
- `/mcp/` 已挂载成功
|
- `/mcp` 与 `/mcp/` 均可访问
|
||||||
- 未传 `X-Bot-Id` / `X-Bot-Secret` 时返回 `401`
|
- 未传 `X-Bot-Id` / `X-Bot-Secret` 时返回 `401`
|
||||||
|
|
||||||
调试使用地址:
|
调试使用地址:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
http://127.0.0.1:8012/mcp/
|
http://127.0.0.1:8012/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
生产或测试环境请替换为你的 backend 实际域名或 IP。
|
生产或测试环境请替换为你的 backend 实际域名或 IP。
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
当前 MCP 入口:
|
当前 MCP 入口:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
/mcp/
|
/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
当前支持的工具:
|
当前支持的工具:
|
||||||
|
|
@ -59,12 +59,12 @@
|
||||||
|
|
||||||
### 3. Nginx 统一入口支持 MCP
|
### 3. Nginx 统一入口支持 MCP
|
||||||
|
|
||||||
前端 Nginx 已新增 `/mcp/` 反向代理配置。
|
前端 Nginx 已新增 `/mcp` 与 `/mcp/` 兼容的反向代理配置。
|
||||||
|
|
||||||
现在在只暴露一个公网入口端口的部署模式下,可以通过统一入口访问:
|
现在在只暴露一个公网入口端口的部署模式下,可以通过统一入口访问:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
http(s)://<host>/mcp/
|
http(s)://<host>/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
不再要求调用端直连 backend 容器端口。
|
不再要求调用端直连 backend 容器端口。
|
||||||
|
|
@ -122,7 +122,7 @@ backend Docker 镜像构建已做以下处理:
|
||||||
- 基础镜像切换为 `python:3.12-slim`
|
- 基础镜像切换为 `python:3.12-slim`
|
||||||
- 增加 pip 构建工具升级
|
- 增加 pip 构建工具升级
|
||||||
- pip 安装支持国内源失败后回退官方源
|
- pip 安装支持国内源失败后回退官方源
|
||||||
- Nginx 已补充 `/mcp/` 代理配置
|
- Nginx 已补充 `/mcp` 与 `/mcp/` 兼容代理配置
|
||||||
|
|
||||||
|
|
||||||
### 3. 数据持久化目录调整
|
### 3. 数据持久化目录调整
|
||||||
|
|
@ -159,7 +159,7 @@ storage/
|
||||||
如果当前部署是通过前端 Nginx 暴露统一入口,推荐改为:
|
如果当前部署是通过前端 Nginx 暴露统一入口,推荐改为:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
http(s)://<host>/mcp/
|
http(s)://<host>/mcp
|
||||||
```
|
```
|
||||||
|
|
||||||
调用头保持不变:
|
调用头保持不变:
|
||||||
|
|
@ -179,6 +179,6 @@ http(s)://<host>/mcp/
|
||||||
建议升级到 `v0.9.6` 后按以下顺序验证:
|
建议升级到 `v0.9.6` 后按以下顺序验证:
|
||||||
|
|
||||||
1. 验证 backend `/health` 是否正常
|
1. 验证 backend `/health` 是否正常
|
||||||
2. 验证统一入口 `/api/` 与 `/mcp/` 是否可访问
|
2. 验证统一入口 `/api/`、`/mcp` 与 `/mcp/` 是否可访问
|
||||||
3. 验证 MCP client 是否能正常完成 `initialize`
|
3. 验证 MCP client 是否能正常完成 `initialize`
|
||||||
4. 验证个人中心的 MCP 凭证展示与轮换功能
|
4. 验证个人中心的 MCP 凭证展示与轮换功能
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,25 @@ server {
|
||||||
}
|
}
|
||||||
|
|
||||||
# MCP Streamable HTTP 反向代理
|
# MCP Streamable HTTP 反向代理
|
||||||
|
# 不对 /mcp 做 301/302 重定向,避免部分 MCP client 在跳转后丢失 POST body 或请求方法
|
||||||
location = /mcp {
|
location = /mcp {
|
||||||
return 301 /mcp/;
|
proxy_pass http://backend:8000/mcp/;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 3600s;
|
||||||
|
proxy_read_timeout 3600s;
|
||||||
|
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||||
}
|
}
|
||||||
|
|
||||||
location /mcp/ {
|
location /mcp/ {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue