返回市场
差异-MCP客户端

差异-MCP客户端

作者:3dify-project158 星标更新:2025-07-05

项目介绍

dify-mcp-client

MCP 客户端作为代理策略插件,支持使用计算机代理(UI-TARS-SDK)。

[!IMPORTANT] Dify 不是 MCP 服务器 而是 MCP 主机

展示1

工作原理

每个 MCP 客户端(ReAct 代理)节点可以连接到 MCP 服务器

  1. 工具资源提示列表转换为 Dify 工具。
  2. 您选择的 LLM 可以看到它们的 名称描述参数类型
  3. LLM 根据 ReAct 循环(推理 → 行动 → 观察)调用工具。

[!NOTE] 本仓库中的大部分代码包含以下文件。

Dify 官方插件 / 代理策略

https://github.com/langgenius/dify-official-plugins/tree/main/agent-strategies/cot_agent

✅ 我做了什么

  • 复制了 ReAct.py 并将其重命名为 mcpReAct.py
  • 通过编辑 mcpReAct.yamlclass mcpReActParams() 添加了 config_json GUI 输入字段

在 mcpReAct.py 中,我添加了

  • 用于 MCP 的 12 个新函数
  • __init__() 用于初始化 AsyncExitStack事件循环
  • _handle_invoke_action() 中的一些代码用于 MCP
  • _invoke() 中设置和清理 MCP

[!IMPORTANT] ReAct 的 while 循环保持不变

🔄 更新历史

  • 添加 SSE MCP 客户端(v0.0.2)
  • 支持多 SSE 服务器(v0.0.3)
  • 更新 Python 模块并简化其依赖关系(v0.0.4)
    • mcp(v1.1.2→v1.6.0+)
    • dify_plugin(0.0.1b72→v0.1.0)
  • 添加 UI-TARS SDK 集成以实现 GUI 自动化功能(v0.0.5)
  • 支持流式 HTTP MCP 客户端
  • 特性 SSE 参数:/sse?key=value(v0.0.6)

🤖 UI-TARS 集成

此插件包括 UI-TARS SDK 集成,以实现 GUI 自动化功能。

[!WARNING] UI-TARS-SDK 集成仅在 Dify 插件本地调试部署中受支持。 https://github.com/3dify-project/dify-mcp-client#-如何开发和部署插件

正常的 difypkg 安装不起作用。因为 UI-TARS 需要操作系统原生 API,而 Dify 插件环境是 Linux 容器。

我正在考虑通过流式 HTTP MCP 来解决这个问题。

关键特性

  • 按需 GUI 自动化:仅在需要时调用 UI-TARS,减少令牌消耗
  • 生命周期控制:设置每个任务的最大循环次数,防止失控自动化

已知限制

  • 单显示器支持:UI-TARS 目前仅识别主显示器。不支持多显示器设置。
  • Mac Retina 显示问题:在 macOS 上使用 Retina 显示时,UI-TARS 需要将显示分辨率设置为“默认”而不是最高质量设置。否则点击的坐标会错误。https://github.com/bytedance/UI-TARS-desktop/issues/591

生命周期参数

life_time 参数控制 UI-TARS 可执行的最大 GUI 动作次数:

  • 默认值:10 次迭代
  • 用户可通过 ui_tars_max_life_time_count 配置最大值
  • 您选择的 LLM 可根据任务复杂度在用户定义的范围内动态调整

[!NOTE] 当前硬编码为使用 UI-TARS-1.5-7B 模型以获得最佳性价比。

🐳 使用预构建 Node.js 的 Docker 部署

构建 Docker 镜像

<details> <summary>此下拉指南适用于 TypeScript 标准输入输出 MCP 服务器用户</summary>
docker build -t dify-mcp-client:latest .

或者使用我们的预构建镜像:

# 在您的 docker-compose.yml 中
services:
  plugin-daemon:
    image: memedayo/dify-plugin-daemon:latest  # 带有预构建 Node.js
    # ... 其余配置

容器中没有 Node.js,则会失去对 TypeScript 标准输入输出 MCP 的支持。

</details>

UI-TARS 配置

有关详细的 UI-TARS 设置,请参阅 UI-TARS Desktop 部署指南

插件会自动将 UI-TARS 配置为 ReAct 循环中的一个工具。您需要提供:

  • Hugging Face 推理端点 URL
  • API 密钥(如 hf_xxxxx)
  • (可选)在代理参数中调整 ui_tars_max_life_time_count

⚠️ 注意事项和限制

[!CAUTION] 该插件默认情况下不实现 人工介入 机制,因此只能连接 可靠的 mcp 服务器<br> 为了避免这种情况,可以将 最大迭代次数(默认值:3)减少到 1,并在 Chatflow 中重复使用此代理节点。<br> 然而,代理记忆会在工作流程结束时被重置。<br> 使用 对话变量 来保存历史记录并传递给查询。<br> 不要忘记在 INSTRUCTION 中添加类似 “调用工具前询问用户许可” 的短语。

如何使用此插件

🛜 从 GitHub 安装插件

  • 输入以下 GitHub 仓库名称
https://github.com/3dify-project/dify-mcp-client/
  • Dify > 插件 > + 安装插件 > 从 > GitHub difyUI1

⬇️ 从 .difypkg 文件安装插件

安装插件时遇到错误怎么办?

问题:如果遇到错误消息:“已启用插件验证,您想要安装的插件签名无效”,如何处理?<br> 解决方案:打开 /docker/.env 并将 true 更改为 false

FORCE_VERIFYING_SIGNATURE=false

运行以下命令重启 Dify 服务:

cd docker
docker compose down
docker compose up -d

一旦添加了此字段,Dify 平台将允许安装所有未列出(因此未经验证)的插件。

此插件在哪里显示?

  • 安装大约需要几分钟时间
  • 安装后,您可以将其用作任何工作流程中的代理节点
  • 选择 "mcpReAct" 策略(否则没有 MCP) asAgentStrategiesNode

配置

MCP 代理插件节点需要类似以下的 config_json 来指定命令或 URL 连接到 MCP 服务器

{
    "mcpServers":{
        "name_of_server1":{
            "url": "http://host.docker.internal:8080/sse"
        },
        "name_of_server2":{
            "url": "http://host.docker.internal:8008/mcp"
        }
    }
}

[!WARNING]

Chatflow 示例

展示2

[!WARNING]

  • 工具字段不应为空,所以请选择 Dify 工具,如“当前时间”。

我提供了这个 Dify ChatFlow .yml 用于测试此插件。

https://github.com/3dify-project/dify-mcp-client/tree/main/test/chatflow

下载 DSL(yml) 文件后,在 Dify 中导入它,然后可以使用 "Everything MCP 服务器" 测试 MCP。

https://github.com/modelcontextprotocol/servers/tree/main/src/everything

如何将标准输入输出 MCP 服务器转换为流式 HTTP(或 SSE)

选项1️⃣:编辑 MCP 服务器的代码

如果是 fastMCP 服务器,更改如下

if __name__ == "__main__":
-    mcp.run(transport="stdio")
+    mcp.run(transport="streamable-http")

选项2️⃣:通过 mcp-proxy

[!WARNING] 推荐使用流式 HTTP 而不是已弃用的 SSE 旧的 SSE 设置不起作用。请阅读 https://github.com/sparfenyuk/mcp-proxy。

<details> <summary>SSE 设置(非流式 HTTP)</summary>
\mcp-proxy>uv venv -p 3.12
.venv\Scripts\activate
uv tool install mcp-proxy

检查 Node.js 是否已安装及 npx(.cmd) 路径

(Mac/Linux)

which npx

(Windows)

where npx

结果

C:\Program Files\nodejs\npx
C:\Program Files\nodejs\npx.cmd
C:\Users\USER_NAME\AppData\Roaming\npm\npx
C:\Users\USER_NAME\AppData\Roaming\npm\npx.cmd

如果 claude_desktop_config.json 是以下模式,

{
  "mcpServers": {
    "SERVER_NAME": {
       "command": CMD_NAME_OR_PATH 
       "args": {VALUE1, VALUE2}
    }
  }
}

通过此命令唤醒标准输入输出 MCP 服务器

mcp-proxy --sse-port=8080 --pass-environment -- CMD_NAME_OR_PATH --arg1 VALUE1 --arg2 VALUE2 ...

如果您使用的是 Windows,使用 npx.cmd 而不是 npx。以下是一个示例命令,通过 mcp-proxy 将标准输入输出 "everything MCP 服务器" 转换为 SSE。

mcp-proxy --sse-port=8080 --pass-environment -- C:\Program Files\nodejs\npx.cmd --arg1 -y --arg2 @modelcontextprotocol/server-everything

同样,在另一个命令行(如果您使用的是 v0.0.3 的示例 Chatflow)

pip install mcp-simple-arxiv
mcp-proxy --sse-port=8008 --pass-environment -- C:\Users\USER_NAME\AppData\Local\Programs\Python\Python310\python.exe -m -mcp_simple_arxiv

以下是 mcp-proxy 设置日志。

(mcp_proxy) C:\User\USER_NAME\mcp-proxy>mcp-proxy --sse-port=8080 --pass-environment -- C:\Program Files\nodejs\npx.cmd --arg1 -y --arg2 @modelcontextprotocol/server-everything
DEBUG:root:Starting stdio client and SSE server
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:mcp.server.lowlevel.server:Initializing server 'example-servers/everything'
DEBUG:mcp.server.sse:SseServerTransport initialized with endpoint: /messages/
INFO:     Started server process [53104]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
</details>

🔨 如何开发和部署插件

官方插件开发指南

https://github.com/3dify-project/dify-mcp-client/blob/main/GUIDE.md

Dify 插件 SDK 守护进程

如果您使用的是 Windows 操作系统且 CPU 是 Intel 或 AMD,您需要下载最新的 dify-plugin-windows-amd64.exe<br> 在这里选择与您的操作系统兼容的版本:<br> https://github.com/langgenius/dify-plugin-daemon/releases <br>

  1. 为了方便,将其重命名为 dify.exe
  2. 在 Windows 中创建目录 "C\User\user\.local\bin" 并将其注册为系统路径。
  3. dify.exe 复制到 dify-mcp-client/ 下

[!TIP] 以下指南很有帮助。 https://docs.dify.ai/plugins/quick-start/develop-plugins/initialize-development-tools

参考

https://docs.dify.ai/plugins/quick-start/develop-plugins/initialize-development-tools

[!NOTE] 如果您拉取或下载了此仓库的代码,可以跳过此阶段

dify plugin init

初始设置如下图所示 初始Dify插件设置

更改目录

cd dify-mcp-client

安装 Python 模块

Python3.12+ 兼容。venvuv 不是必需的,但推荐使用。

uv venv -p 3.12
.venv\Scripts\activate

安装插件开发所需的 Python 模块

uv pip install -r requirements.txt

仅针对 UI-TARS-SDK 用户(在安装 Node.js v22 LTS 后)

npm install

复制并重命名 env.example

我将 REMOTE_INSTALL_HOSTdebug.dify.ai 更改为 localhost (Docker Compose 环境) 点击 🪲bug 图标按钮查看这些信息

激活 Dify 插件

python -m main

(Ctrl+C 停止)

[!TIP] .env 中的 REMOTE_INSTALL_KEY 经常变化。 如果遇到类似“握手失败,无效密钥”的错误消息,请更新它。

打包为 .difypkg

./dify-mcp-client 是我的默认根名称

dify plugin package ./ROOT_OF_YOUR_PROJECT

开发者有用的 GitHub 仓库

Dify 插件 SDKs

https://github.com/langgenius/dify-plugin-sdks

MCP Python SDK

https://github.com/modelcontextprotocol/python-sdk <br>

[!TIP] MCP 客户端示例<br> https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/clients/simple-chatbot/mcp_simple_chatbot/main.py<br>

[!NOTE] Dify 插件具有 requirements.txt,会自动安装 Python 模块。<br> 我已在其中包含最新版 mcp,因此无需单独下载 MCP SDK。