# MCP 容器重启问题诊断报告 ## 问题概述 MCP 服务容器(strapi_mcp, order_mcp, aftersale_mcp, product_mcp)一直在重启。 ## 容器架构 ```mermaid graph TB subgraph "MCP Servers" A[strapi_mcp:8001] B[order_mcp:8002] C[aftersale_mcp:8003] D[product_mcp:8004] end subgraph "外部依赖" E[Strapi CMS
49.234.16.160:1337] F[Hyperf API
apicn.qa1.gaia888.com] end subgraph "内部依赖" G[agent:8005] end A --> E B --> F C --> F D --> F G --> A G --> B G --> C G --> D ``` ## 诊断结果 ### 1. 环境变量配置问题(主要原因) 在 [`.env`](../.env) 文件中发现以下问题: | 环境变量 | 当前值 | 问题 | |---------|--------|------| | `STRAPI_API_TOKEN` | `""` (空) | strapi_mcp 无法认证 | | `HYPERF_API_TOKEN` | `""` (空) | order_mcp, aftersale_mcp, product_mcp 无法认证 | | `REDIS_PASSWORD` | `""` (空) | Redis 健康检查可能失败 | ### 2. 客户端初始化问题 在 [`mcp_servers/shared/strapi_client.py`](../mcp_servers/shared/strapi_client.py) 和 [`mcp_servers/shared/hyperf_client.py`](../mcp_servers/shared/hyperf_client.py) 中: ```python class StrapiSettings(BaseSettings): strapi_api_url: str strapi_api_token: str # 必需字段,但值为空字符串 settings = StrapiSettings() # 模块加载时执行 ``` 当 `api_token` 为空时: - 不会立即抛出异常(空字符串是有效的 str 值) - 但所有 API 请求都会因认证失败而报错 - 可能导致服务启动失败或运行时崩溃 ### 3. 健康检查配置 在 [`docker-compose.yml`](../docker-compose.yml) 中,所有 MCP 服务都配置了健康检查: ```yaml healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8001/health"] interval: 30s timeout: 10s start-period: 5s retries: 3 ``` 如果服务启动失败或 `/health` 端点不可用,健康检查会失败,Docker 可能会重启容器。 ### 4. 服务启动流程 MCP 服务的启动流程: ```mermaid sequenceDiagram participant DC as Docker participant SVR as Server.py participant ENV as Settings participant CLI as HTTP Client participant API as External API DC->>SVR: python server.py SVR->>ENV: 加载环境变量 ENV-->>SVR: api_token = "" SVR->>CLI: 初始化客户端 CLI->>API: 首次请求(如果需要) API-->>CLI: 401 Unauthorized CLI-->>SVR: 抛出异常 SVR-->>DC: 启动失败 DC->>DC: 重启容器 ``` ## 可能的错误信息 基于代码分析,容器日志中可能出现以下错误: 1. **认证失败**: ``` httpx.HTTPStatusError: 401 Unauthorized ``` 2. **连接错误**: ``` httpx.ConnectError: Connection refused ``` 3. **超时错误**: ``` httpx.TimeoutException ``` 4. **健康检查失败**: ``` curl: (7) Failed to connect to localhost port 8001 ``` ## 影响范围 | 服务 | 影响原因 | |-----|---------| | `strapi_mcp` | `STRAPI_API_TOKEN` 为空 | | `order_mcp` | `HYPERF_API_TOKEN` 为空 | | `aftersale_mcp` | `HYPERF_API_TOKEN` 为空 | | `product_mcp` | `HYPERF_API_TOKEN` 为空 | | `agent` | 依赖所有 MCP 服务,可能间接受影响 | ## 修复建议 ### 方案 1: 配置正确的 API Token(推荐) 1. 获取 Strapi API Token 2. 获取 Hyperf API Token 3. 更新 `.env` 文件 ### 方案 2: 使服务在 Token 为空时也能启动(临时方案) 修改客户端代码,延迟初始化或添加容错逻辑。 ### 方案 3: 禁用需要认证的服务 如果某些服务暂时不需要,可以将其从 docker-compose 中移除。 ## 下一步行动 请确认: 1. 是否有可用的 Strapi 和 Hyperf API Token? 2. 是否需要修改代码以支持空 Token 的启动模式? 3. 是否需要查看具体的容器日志以确认错误?