news 2026/9/13 9:38:46

HTTP MCP 客户端连 Vibe-Trading 的 /sse 端点返回 405 是怎么回事?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HTTP MCP 客户端连 Vibe-Trading 的 /sse 端点返回 405 是怎么回事?

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启动方式有效端点文档中的定位
stdiovibe-trading-mcp无网络端口,父子进程管道默认方式,客户端自行拉起子进程,无需服务器设置
Streamable HTTPvibe-trading-mcp --transport http单一 POST/GET/mcp,默认http://127.0.0.1:8900/mcp当前 MCP 规范的默认 transport(2025-03-26 及以后的规范)
legacy SSEvibe-trading-mcp --transport sseGET/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 客户端)。分两步:

  1. 服务端以 Streamable HTTP 启动(如果还没运行):

    vibe-trading-mcp --transport http

    确认进程成功绑定后(README 的示例中默认是127.0.0.1:8900,非默认时用--host/--port指定的地址)。

  2. 把客户端的 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-typeapplication/jsontext/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::1localhost),可用环境变量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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 9:37:47

关节力矩控制:从原理到工程落地的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 9:33:23

HDMI切换器选购避坑指南:从参数陷阱到品牌梯队一次说清

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 9:32:30

diagram-design:图谱即代码的工程化实践

1. 为什么“diagram-design”不是个工具名&#xff0c;而是一套需要重新理解的工程能力 最近在几个技术社区里反复看到这个词被当作搜索关键词刷屏&#xff1a; diagram-design 。它不像“React开发”或“Python爬虫”那样指向明确的技术栈&#xff0c;也不像“UI设计”那样有…

作者头像 李华
网站建设 2026/9/13 9:32:15

静态代码分析工具实战:从Cppcheck到SonarQube的选型与集成

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华