从 405 到 200:记一次 Dify 接入同花顺 iFind MCP 服务的踩坑全过程
本文记录了将同花顺 iFind MCP 服务接入 Dify 的完整排查过程,涉及 SSE vs StreamableHTTP 协议差异、MCP 协议版本兼容性问题,以及 Dify 1.10.1 的局限与解决方案。
背景
同花顺 iFind 提供了基于 MCP 协议的股票数据服务(hexin-ifind-ds-stock-mcp),理论上可以直接在 Dify 中作为工具节点使用。然而实际接入时,迎面而来的是一个 405 Not Allowed 错误。
PluginInvokeError: {
"error_type": "ConnectionError",
"message": "hexin-ifind-ds-stock-mcp - MCP Server connection failed:
Client error '405 Not Allowed' for url
'https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp'"
}
第一步:搞清楚 405 的真正含义
405 Method Not Allowed 不是鉴权失败,也不是服务器挂了——它的意思是:服务器在线,但你用错了 HTTP 方法。
MCP 协议支持两种传输方式:
| 传输方式 | HTTP 方法 | 工作原理 |
|---|---|---|
| SSE | GET |
客户端发起长连接,服务端持续推送事件流 |
| StreamableHTTP | POST |
标准 HTTP 请求,响应体以流式返回 |
Dify 默认使用 SSE(GET 请求),但 iFind 服务端是否支持?——用 curl 直接验证。
第二步:curl 实测,找到真相
测试 GET(SSE 方式)
curl -v -X GET "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp" \
-H "Authorization: Bearer <your_token>"
响应:
HTTP/2 405
{"jsonrpc":"2.0","error":{"message":"Route and protocol analysis failed: SSE protocol is Unsupported","code":-32601}}
服务端明确拒绝 SSE,错误信息直白:SSE protocol is Unsupported。
测试 POST(StreamableHTTP 方式)
curl -v -X POST "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp" \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{}'
响应:
HTTP/2 400
{"jsonrpc":"2.0","error":{"message":"Missing method","code":-32600}}
POST 可以进入服务器,只是 body 格式不对(缺少 JSON-RPC method 字段)。这说明 StreamableHTTP 是正确方向。
第三步:发送正确的 MCP 握手请求
MCP 协议基于 JSON-RPC 2.0,连接时需要先发送 initialize 握手,同时声明客户端支持的协议版本。
curl -v -X POST "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp" \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {"name": "test", "version": "1.0"}
},
"id": 1
}'
响应:HTTP/2 200 ✅
{
"id": 1,
"result": {
"serverInfo": {
"version": "1.0.0",
"name": "hexin-ifind-ds-stock-mcp"
},
"capabilities": {
"tools": {"listChanged": false},
"prompts": {"listChanged": false},
"resources": {"subscribe": false, "listChanged": false}
},
"protocolVersion": "2025-06-18"
},
"jsonrpc": "2.0"
}
握手成功,服务端返回了完整能力声明,还分配了 mcp-session-id。服务器完全正常,问题 100% 在客户端(Dify)侧。
第四步:发现双重障碍
至此暴露出两个问题:
障碍一:Dify 1.10.1 没有 StreamableHTTP 选项
Dify 1.10.1 的 MCP 工具配置界面只有 SSE,而 iFind 明确不支持 SSE。这是一个功能缺失问题。
障碍二:协议版本不兼容
iFind 服务端使用的是 MCP 最新协议 2025-06-18,而 Dify 内置 MCP 客户端发送的是旧版本 2024-11-05。服务端会直接拒绝:
{
"error": {
"message": "Unsupported protocol version",
"data": {
"supported": ["2025-06-18"],
"requested": "2024-11-05"
}
}
}
这个问题已在 Dify GitHub 上有对应 Issue(#27677),截至目前尚未在内置客户端中修复。
解决方案
方案一:安装第三方插件(推荐)
Dify Marketplace 上有一个社区插件 MCP SSE / StreamableHTTP(作者:Junjie.M),同时支持 SSE 和 StreamableHTTP 两种传输方式,并支持新版协议。
插件地址:
-
Marketplace: https://marketplace.dify.ai/plugins/junjiem/mcp_sse -
GitHub: https://github.com/junjiem/dify-plugin-tools-mcp_sse
安装步骤:
-
进入 Dify → 插件管理 → 从 Marketplace 安装 -
搜索 MCP SSE安装插件 -
在插件配置中填入以下 JSON:
{
"ifind-stock": {
"transport": "streamable_http",
"url": "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp",
"headers": {
"Authorization": "Bearer <your_token>"
},
"timeout": 60
}
}
注意:如果安装时遇到签名验证错误,在
.env文件末尾添加FORCE_VERIFYING_SIGNATURE=false即可。
方案二:升级 Dify
StreamableHTTP 原生支持在更新版本中已加入。如果你的部署方式允许升级:
# Docker Compose 部署
docker compose pull
docker compose up -d
方案三:本地代理桥接(不想改 Dify)
如果既不想装插件也不想升级,可以在本地运行一个代理,将 Dify 发出的 SSE 请求转换为 StreamableHTTP 再转发给 iFind。
使用 supergateway(一行命令):
npx supergateway \
--streamableHttp "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp" \
--header "Authorization: Bearer <your_token>" \
--port 3100
然后 Dify 配置:
-
传输类型:SSE -
URL: http://localhost:3100/sse -
无需 API Key(已在代理层处理)
背景知识:SSE vs StreamableHTTP vs 普通 HTTP
理解这三者的区别,有助于以后排查类似问题:
普通 HTTP: 请求 → 等待 → 完整响应 → 断开
(等水桶装满再给你)
SSE: GET 建立长连接 → 服务端持续推送事件
(服务端主动流水,但客户端不能在同一连接里发新消息)
StreamableHTTP:POST 请求 → 响应体持续流式返回 → 支持会话
(一根管道双向通,带 session-id 保持上下文)
MCP 协议在 2025 年 3 月正式将 SSE 标记为废弃,StreamableHTTP 成为新标准。iFind 直接采用了最新规范,而 Dify 1.10.1 还未跟上,这是本次问题的根本原因。
验证连接是否完全正常
握手成功后,可以继续验证工具列表(需要带上 session-id):
curl -s -X POST "https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp" \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-H "mcp-session-id: <握手返回的session-id>" \
-d '{
"jsonrpc": "2.0",
"method": "tools/list",
"params": {},
"id": 2
}'
能返回工具列表,即说明整条链路完全通畅。
总结
| 问题 | 原因 | 解决 |
|---|---|---|
| 405 Not Allowed | Dify 用 SSE(GET),iFind 只支持 StreamableHTTP(POST) | 切换传输类型 |
| 协议版本不兼容 | Dify 发 2024-11-05,iFind 只接受 2025-06-18 |
安装社区插件 |
| Dify 1.10.1 无 StreamableHTTP | 内置功能缺失 | 安装插件或升级 |
最终可用配置:
-
Dify 版本:1.10.1 + junjiem/mcp_sse插件 -
传输类型: streamable_http -
URL: https://api-mcp.51ifind.com:8643/ds-mcp-servers/hexin-ifind-ds-stock-mcp -
认证:Bearer Token 写入 headers
排查过程中最关键的一步:用 curl 直接打服务器,绕过所有框架层,让服务端的错误信息说话。SSE protocol is Unsupported 这七个字,比任何文档都清晰。
