Java/Python MCP 401 排查里程碑:Token 对齐与方案简化
本篇记录本次 Java/Python MCP 401 问题的收敛结论、方案调整与发布证据。
里程碑结论
- 401 根因已确认:Java 侧与 Python 侧在 MCP 鉴权 token 上不一致,导致请求头
X-AI-MCP-TOKEN校验失败。 - 方案已简化:Python 侧仅保留一个配置入口
MCP_API_TOKEN,默认值固定为AAA,移除复杂 fallback 链路,减少歧义与隐式行为。
方案变更说明(单一目的)
本次变更目标只有一个:让 Python MCPClient 的 token 来源明确、默认行为稳定,避免再次出现“配置看似生效但实际不一致”的 401。
- 配置入口:
MCP_API_TOKEN - 默认值:
AAA - 行为:若未显式设置环境变量,统一走默认
AAA;若设置了MCP_API_TOKEN,严格使用该值。
验证证据
1) 直连 probe(MCP 可达性 + 工具数量)
命令:
1 | |
结果要点:
tools/list返回code=200system/mcp/status返回:connected=truetool_count=10detail="ok (tools=10)"
2) Python 单测
命令:
1 | |
结果要点:
collected 5 items5 passed- 核验覆盖了:
- 未设置
MCP_API_TOKEN时默认AAA - 设置
MCP_API_TOKEN时优先使用环境变量值
- 未设置
回滚与风险说明(按 SPEC)
可追溯
- 结论、命令、结果均已固化在本工作日志。
- 验证入口固定:
/system/mcp/status?refresh=true与tests/test_mcp_client.py。
可回退
若线上出现不兼容,可按最小改动回退:
- 回退 Python 侧本次 token 简化提交(仅回退 token 配置相关变更)。
- 恢复旧配置逻辑后,立即执行:
pytest tests/test_mcp_client.pycurl .../system/mcp/status?refresh=true
- 以
connected、tool_count、401 告警是否消失作为回退验收。
单一目的变更
- 本次只处理 MCP token 对齐与默认值策略,不扩展到工具路由、SSE、RunStore 等其他模块。
- 遵循最小变更面,降低联动回归风险。
后续观察项
- 统一各环境(dev/test/prod)
MCP_API_TOKEN注入方式,避免“本地默认可用、环境变量缺失”导致偏差。 - 监控 Java MCP 401/403 比例,作为 token 配置漂移的早期信号。
Java/Python MCP 401 排查里程碑:Token 对齐与方案简化
https://willfordzhan.github.io/2026/02/21/java-python-mcp-401-token/