MCP 客户端作为代理策略插件,支持使用计算机代理(UI-TARS-SDK)。
[!IMPORTANT] Dify 不是
MCP 服务器而是MCP 主机。

每个 MCP 客户端(ReAct 代理)节点可以连接到 MCP 服务器。
工具、资源、提示列表转换为 Dify 工具。名称、描述、参数类型。[!NOTE] 本仓库中的大部分代码包含以下文件。
Dify 官方插件 / 代理策略
https://github.com/langgenius/dify-official-plugins/tree/main/agent-strategies/cot_agent
ReAct.py 并将其重命名为 mcpReAct.pymcpReAct.yaml 和 class mcpReActParams() 添加了 config_json GUI 输入字段__init__() 用于初始化 AsyncExitStack 和 事件循环_handle_invoke_action() 中的一些代码用于 MCP_invoke() 中设置和清理 MCP[!IMPORTANT] ReAct 的 while 循环保持不变
/sse?key=value(v0.0.6)此插件包括 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 来解决这个问题。
life_time 参数控制 UI-TARS 可执行的最大 GUI 动作次数:
ui_tars_max_life_time_count 配置最大值[!NOTE] 当前硬编码为使用 UI-TARS-1.5-7B 模型以获得最佳性价比。
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 Desktop 部署指南。
插件会自动将 UI-TARS 配置为 ReAct 循环中的一个工具。您需要提供:
ui_tars_max_life_time_count[!CAUTION] 该插件默认情况下不实现 人工介入 机制,因此只能连接 可靠的 mcp 服务器。<br> 为了避免这种情况,可以将
最大迭代次数(默认值:3)减少到1,并在 Chatflow 中重复使用此代理节点。<br> 然而,代理记忆会在工作流程结束时被重置。<br> 使用对话变量来保存历史记录并传递给查询。<br> 不要忘记在 INSTRUCTION 中添加类似 “调用工具前询问用户许可” 的短语。
https://github.com/3dify-project/dify-mcp-client/


问题:如果遇到错误消息:“已启用插件验证,您想要安装的插件签名无效”,如何处理?<br>
解决方案:打开 /docker/.env 并将 true 更改为 false:
FORCE_VERIFYING_SIGNATURE=false
运行以下命令重启 Dify 服务:
cd docker
docker compose down
docker compose up -d
一旦添加了此字段,Dify 平台将允许安装所有未列出(因此未经验证)的插件。

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]
- 每个服务器的端口号应不同,例如 8080, 8008, ...
- 如果想使用标准输入输出 MCP 服务器,有三种方法。
- 使用 mcp-proxy 将其转换为流式 HTTP MCP 服务器 https://github.com/sparfenyuk/mcp-proxy?tab=readme-ov-file#1-stdio-to-ssestreamablehttp
- 使用源代码部署(不是通过 .difypkg 或 GitHub 仓库名称安装) https://github.com/3dify-project/dify-mcp-client/edit/main/README.md#-如何开发和部署插件
- 在 dify-plugin docker 内部预安装 Node.js(仅适用于 TypeScript 标准输入输出服务器)

[!WARNING]
- 工具字段不应为空,所以请选择 Dify 工具,如“当前时间”。
.yml 用于测试此插件。https://github.com/3dify-project/dify-mcp-client/tree/main/test/chatflow
https://github.com/modelcontextprotocol/servers/tree/main/src/everything
如果是 fastMCP 服务器,更改如下
if __name__ == "__main__":
- mcp.run(transport="stdio")
+ mcp.run(transport="streamable-http")
<details> <summary>SSE 设置(非流式 HTTP)</summary>[!WARNING] 推荐使用流式 HTTP 而不是已弃用的 SSE 旧的 SSE 设置不起作用。请阅读 https://github.com/sparfenyuk/mcp-proxy。
\mcp-proxy>uv venv -p 3.12
.venv\Scripts\activate
uv tool install mcp-proxy
(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-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
如果您使用的是 Windows 操作系统且 CPU 是 Intel 或 AMD,您需要下载最新的 dify-plugin-windows-amd64.exe<br>
在这里选择与您的操作系统兼容的版本:<br>
https://github.com/langgenius/dify-plugin-daemon/releases <br>
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初始设置如下图所示
cd dify-mcp-client
Python3.12+ 兼容。venv 和 uv 不是必需的,但推荐使用。
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_HOST 从 debug.dify.ai 更改为 localhost
(Docker Compose 环境)
点击 🪲bug 图标按钮查看这些信息
python -m main
(Ctrl+C 停止)
[!TIP] .env 中的 REMOTE_INSTALL_KEY 经常变化。 如果遇到类似“握手失败,无效密钥”的错误消息,请更新它。
./dify-mcp-client 是我的默认根名称
dify plugin package ./ROOT_OF_YOUR_PROJECT
https://github.com/langgenius/dify-plugin-sdks
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。