从 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

安装步骤:

  1. 进入 Dify → 插件管理 → 从 Marketplace 安装
  2. 搜索 MCP SSE 安装插件
  3. 在插件配置中填入以下 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 这七个字,比任何文档都清晰。