HTTP MCP 客户端连 Vibe-Trading 的 /sse 端点返回 405 是怎么回事?
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
当你的 MCP 客户端(QwenPaw、Cursor 或任何通过 POSTInitializeRequest协商的 HTTP 客户端)配置了 Vibe-Trading 的 MCP 地址,连接后却收到405 Method Not Allowed(有时是404),原因几乎总是同一个:客户端把地址指到了/sse。Vibe-Trading 的 MCP server 有三种 transport,/sse只属于其中已弃用的那一种。本文基于仓库 README.md 的 MCP Plugin 章节、MCP server 入口 agent/mcp_server.py 和仓库自带集成测试,说明这个错误的成因、正确的端点配置,以及如何验证连接已恢复。
Vibe-Trading MCP server 的三种 transport 与各自端点
README.md 和 agent/mcp_server.py 的文档字符串给出的完整端点表如下:
| transport | 启动方式 | 有效端点 | 文档中的定位 |
|---|---|---|---|
| stdio | vibe-trading-mcp | 无网络端口,父子进程管道 | 默认方式,客户端自行拉起子进程,无需服务器设置 |
| Streamable HTTP | vibe-trading-mcp --transport http | 单一 POST/GET/mcp,默认http://127.0.0.1:8900/mcp | 当前 MCP 规范的默认 transport(2025-03-26 及以后的规范) |
| legacy SSE | vibe-trading-mcp --transport sse | GET/sse(事件流)+ POST/messages/(消息) | 已弃用,仅服务较老的客户端 |
对应的启动命令(README 原文):
vibe-trading-mcp # stdio (default) vibe-trading-mcp --transport http # Streamable HTTP (current MCP spec default) at http://127.0.0.1:8900/mcp vibe-trading-mcp --transport sse # legacy SSE (deprecated) for older clients其中--host/--port可以覆盖 http transport 的绑定地址;README 给出的默认端口是8900。
为什么 POST /sse 会返回 405
先看 HTTP 类客户端的协商方式:它把一条 JSON-RPCinitialize请求 POST 到自己配置的单一 URL 上。README 对这一错误场景的表述是:
Donotpoint an HTTP client at
/sse; that path belongs to the deprecated two-endpoint SSE transport and will return405 Method Not AllowedonPOST.
agent/mcp_server.py 的文档字符串口径一致:单一端点服务在/mcp,客户端应指向http://<host>:<port>/mcp,而不是/sse——/sse是 legacy SSE transport 的产物。
需要注意仓库中存在两个数字:
- README 记录的现象是
405 Method Not Allowed; - 针对
--transport http的集成测试 agent/tests/test_mcp_server_http_transport.py 断言得更具体:该 transport 下/sse根本没有挂载,POST 返回404。
这两个数字对应服务端不同的运行模式:legacy--transport sse模式挂载了/sse(只接受 GET 的事件流路径,消息走 POST/messages/),对它发 POST 得到 405;--transport http模式不挂载该路径,得到 404。无论看到哪个状态码,结论相同:客户端的 URL 指向了无效端点,而不是服务器故障。
一个容易混淆的分支:如果你实际用的是较老的、只支持 legacy SSE 协议的客户端,那也不该用"单一 URL"的方式配置——legacy 模式本身是两个端点:GET/sse建立事件流,POST/messages/发送消息。把这种客户端的 URL 直接填成/sse再发InitializeRequestPOST,就是 405 的典型来源。
修复:把客户端指向 /mcp
主路径(适用于绝大多数 HTTP 客户端)。分两步:
服务端以 Streamable HTTP 启动(如果还没运行):
vibe-trading-mcp --transport http确认进程成功绑定后(README 的示例中默认是
127.0.0.1:8900,非默认时用--host/--port指定的地址)。把客户端的 MCP 服务器 URL 改为单一的
/mcp端点:http://127.0.0.1:8900/mcp如果客户端配置里原来写的是
http://127.0.0.1:8900/sse,直接改掉路径即可,主机和端口不变。
可选分支一:客户端只支持 legacy SSE 协议。服务端改用vibe-trading-mcp --transport sse启动,客户端按其文档分别配置 GET/sse与 POST/messages/两个端点。该 transport 在文档中已标注 deprecated,仅作为老客户端的过渡路径。
可选分支:改用 stdio,完全不占网络端口。若客户端支持command形式的子进程配置(Claude Desktop、OpenClaw 等),直接按 README 的配置走 stdio,客户端自己拉起服务器:
{ "mcpServers": { "vibe-trading": { "command": "vibe-trading-mcp" } } }注意 README 特别提醒:stdio 模式下服务器由客户端拉起,shell 里的export环境变量传不进去,必须写在客户端配置的env块里。例如生成回测代码的产物要写入自己的工作区时,VIBE_TRADING_ALLOWED_RUN_ROOTS就要放在这个env块中:
{ "mcpServers": { "vibe-trading": { "command": "vibe-trading-mcp", "env": { "VIBE_TRADING_ALLOWED_RUN_ROOTS": "C:\\Users\\me\\research" } } } }验证连接已恢复正常
仓库的集成测试 agent/tests/test_mcp_server_http_transport.py 就是这条验证路径:它对真实启动的--transport http服务器 POST 一条initialize请求。按同样的请求手写一条 curl(clientInfo.name等字段取自测试用例,可按需替换):
curl -i -X POST http://127.0.0.1:8900/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": {"name": "test-mcp-server-http", "version": "1"} } }'判断标准来自该集成测试的断言(文档示例,不是固定日志):
- HTTP 状态码为
200; - 响应头包含
MCP-Session-Id(测试中写作mcp-session-id); content-type是application/json或text/event-stream之一(若为 SSE 帧,取data:行后的 JSON);- 响应体
result.serverInfo.name等于Vibe-Trading。
四项都满足,说明 Streamable HTTP 握手成功,客户端侧此时应能发现工具列表——Vibe-Trading 通过 MCP 暴露 74 个工具,其中 HK/US/加密货币的核心研究工具无需 API key,run_swarm需要 LLM key,trading_*工具则依赖你选定的 connector profile。
边界与相邻情况
- 网络传输默认只允许 loopback。agent/mcp_server.py 对
--transport http/sse两种网络 transport 内置了 Host/Origin 白名单(默认仅127.0.0.1、::1、localhost),可用环境变量VIBE_TRADING_MCP_ALLOWED_HOSTS覆盖。若客户端从其他机器连上来被拒,先检查这一层,而不是端点路径。 - 反向情况:Vibe-Trading 作为客户端连外部 MCP server。给
run_swarmworker 配置外部 MCP 工具时,URL 类 transport 必须显式写type字段,agent 不再根据 URL 后缀在 SSE 与 Streamable HTTP 之间猜测(见 README_zh.md 的相关说明)。如果你的配置是靠"看到/sse后缀就按 SSE 处理"写出来的,同样需要修正。
按上面的顺序检查后:/sse上的 405/404 意味着客户端 URL 配错 transport 端点,改指/mcp并通过initialize握手验证即可恢复;握手仍失败时,再回到 Host 白名单和服务端启动参数两处排查。
【免费下载链接】Vibe-Trading"Vibe-Trading: Your Personal Trading Agent"项目地址: https://gitcode.com/GitHub_Trending/vi/Vibe-Trading
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考