Dify 与 MySQL 深度融合:基于 MCP 协议的数据交互实践
引言
在当今数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 MySQL 出色的数据存储和管理能力,实现更复杂、更智能的数据驱动型应用开发。
技术栈介绍
Dify
Dify 是一款极具创新性的开源大语言模型(LLM)应用开发平台,它将后端即服务(Backend as Service, BaaS)与 LLMOps 理念巧妙融合,为开发者打造了一个便捷高效的 AI 应用开发环境。其低代码/无代码开发模式是一大亮点,通过直观的可视化界面,开发者只需简单的拖拽和配置操作,就能轻松定义 Prompt、上下文以及插件等关键要素,无需在底层技术细节中耗费过多精力。
Dify 采用了模块化设计,提供了丰富的功能组件,涵盖 AI 工作流、RAG 管道、Agent、模型管理等多个领域,全面支持从应用原型设计到实际生产部署的整个过程。同时,Dify 对多种主流大型语言模型提供了良好的支持。
MCP
MCP,即模型上下文协议(Model Context Protocol),在 Dify 与 MySQL 的整合中扮演着至关重要的桥梁角色。作为一项新兴的开放协议,MCP 为大语言模型与外部应用之间搭建了一条双向通信通道,让模型能够便捷地发现、理解并安全调用各种外部工具或 API。
在 Dify 通过 MCP 整合 MySQL 的场景中,MCP 主要发挥了两方面关键作用。一方面,它提供了统一的协议支持,使得 Dify 中的大语言模型能够以标准化的方式与 MySQL 进行交互。另一方面,MCP 还具备强大的工具调用能力,允许 Dify 根据用户的需求和指令,动态地调用 MySQL 相关的工具和功能,实现对数据库中数据的查询、更新、插入等操作。
MySQL
MySQL 作为一款开源的关系型数据库管理系统,在数据存储和管理领域拥有着广泛的应用和卓越的声誉。它具备高度的可靠性和稳定性,性能表现出色,采用了高效的索引和查询优化技术,能够快速处理大规模数据和高并发的访问请求。此外,MySQL 还具备出色的可扩展性,支持水平和垂直扩展,能够满足不断变化的业务需求。
准备工作
环境搭建
在开始整合 Dify 与 MySQL 之前,需要确保开发环境准备就绪。主要涉及 Python 环境以及相关插件的安装,建议使用 Python 3.8 及以上版本。同时,为了实现 Dify 与 MySQL 之间基于 MCP 的通信和数据交互,还需要安装一些关键的插件和依赖库。
安装与配置 Dify
安装步骤:
首先,通过官方 GitHub 仓库获取 Dify 的源代码。打开终端,执行以下命令进行克隆:
git clone https://github.com/langgenius/dify.git --branch 1.1.0
安装过程需要依赖 Docker 和 Docker Compose。在 Linux 系统上,安装 Docker 的命令如下:
dnf update
dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
设置 docker 的下载镜像代理,在 /etc/systemd/system/docker.service.d 目录新增文件 http-proxy.conf:
[Service]
Environment="HTTP_PROXY=http://192.168.1.xxx:7897"
Environment="HTTPS_PROXY=http://192.168.1.xxx:7897"
Environment="NO_PROXY=localhost,127.0.0.1"
systemctl daemon-reload
systemctl restart docker
systemctl status docker
在 Dify 项目目录下,通过 Docker Compose 来启动 Dify 服务:
cp .env.example .env
docker compose up -d
验证安装是否成功:
docker compose ps
此命令会在后台启动 Dify 的所有相关服务,包括前端、后端以及必要的中间件服务。
基础配置:
启动完成后,通过浏览器访问 Dify 的前端界面,默认地址为 http://localhost:3000。首次访问时,需要进行一些基础配置,如设置管理员账号和密码等信息。
接着,配置 Dify 的服务器地址和端口。若采用默认配置,服务器地址即为 localhost,端口为 5000。若需修改,可在 Dify 项目目录下的 .env 文件中修改 API_SERVER_HOST 和 API_SERVER_PORT 等环境变量。
安装与配置 MySQL
安装流程:略
准备表结构和数据:新建数据库 test。
CREATE DATABASE test CHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 班级表
CREATE TABLE `classes` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级 ID',
`className` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级名称',
`grade` int NOT NULL COMMENT '年级',
`headTeacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班主任 ID',
`classroom` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教室位置',
`studentCount` int NOT NULL COMMENT '学生人数',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注信息',
PRIMARY KEY (`id`),
KEY `headTeacherId` (`headTeacherId`),
CONSTRAINT `headTeacherId` FOREIGN KEY (`headTeacherId`) REFERENCES `teachers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 utf8mb4_unicode_ci COMMENT;
- 课程表
CREATE TABLE `courses` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程 ID',
`courseName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程名称',
`credit` int NOT NULL COMMENT '学分',
`teacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授课教师 ID',
`semester` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学期',
`type` enum('必修','选修') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '选修' COMMENT '课程类型',
`prerequisite` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '先修课程 ID',
PRIMARY KEY (`id`),
KEY `teacherId` (`teacherId`),
CONSTRAINT `teacherId` FOREIGN KEY (`teacherId`) REFERENCES `teachers` (`id`) ON DELETE CASCADE ON CASCADE
) ENGINEInnoDB CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
- 成绩表
CREATE TABLE `scores` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '成绩记录 ID',
`studentId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生 ID',
`courseId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程 ID',
`score` int NOT NULL COMMENT '综合成绩',
`examDate` date NOT NULL COMMENT '考试日期',
`usualScore` int DEFAULT '0' COMMENT '平时成绩',
`finalScore` int DEFAULT '0' COMMENT '期末成绩',
PRIMARY KEY (`id`),
KEY `studentId` (`studentId`),
KEY `courseId` (`courseId`),
CONSTRAINT `courseId` FOREIGN KEY (`courseId`) REFERENCES `courses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `studentId` FOREIGN KEY (`studentId`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
- 学生表
CREATE TABLE `students` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学号',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生姓名',
`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '男' COMMENT '性别',
`birthDate` datetime NOT NULL COMMENT '出生日期',
`classId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级 ID',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '电子邮箱',
`emergencyContact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '紧急联系人电话',
`address` varchar(255) CHARACTER SET utf8mb4 utf8mb4_unicode_ci COMMENT ,
`height` COMMENT ,
`weight` COMMENT ,
`healthStatus` enum(,,) utf8mb4 utf8mb4_unicode_ci COMMENT ,
(`id`),
KEY `classId` (`classId`),
`classId` (`classId`) `classes` (`id`) CASCADE CASCADE
) ENGINEInnoDB CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
- 教师表
CREATE TABLE `teachers` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师 ID',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师姓名',
`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '男' COMMENT '性别',
`subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教授科目',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '职称',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
`office` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '办公室位置',
`wechat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT COMMENT ,
`isHeadTeacher` enum(,) utf8mb4 utf8mb4_unicode_ci COMMENT ,
(`id`,`office`) BTREE,
KEY `id` (`id`)
) ENGINEInnoDB CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
录入数据示例:
INSERT INTO `teachers` (`id`,`name`,`gender`,`subject`,`title`,`phone`,`office`,`wechat`,`isHeadTeacher`) VALUES ('T001','张建国','男','数学','教授','13812345678','博学楼 301','lily_teacher','true');
关键步骤
安装必要插件
在 Dify 平台中,要实现通过 MCP 整合 MySQL,首先需要安装两个关键插件:Agent 策略(支持 MCP 工具)和 MCP SSE。
配置 MCP SSE
插件安装完成后,需要对 MCP SSE 进行配置,以建立与 MySQL 服务的连接。
在 Dify 的插件管理界面中,点击已安装的 MCP SSE 插件,点击已授权,配置上 mcp mysq server 的 sse 地址:
{"mysql_mcp_server_pro":{"url":"http://192.168.1.XXX:9000/sse"}}
注:不要留空格,不然会报错。填写完成后,点击保存。
创建 Dify 工作流
进入 Dify 的工作流创建页面,选择创建工作流类型为 "Chatflow",并为工作流命名,例如 "Dify_MySQL_Integration"。
在工作流设计画布中,删除默认的 LLM 节点,因为我们主要通过 Agent 来调用 MySQL 相关工具。从节点库中拖拽一个 "Agent" 节点到画布上。这个 Agent 节点将作为与 MySQL 交互的核心组件。
配置 Agent 策略
-
选择 ReAct (Support MCP Tools) 策略:点击添加的 Agent 节点,在右侧的配置面板中,将 AGENT 策略选择为 "ReAct (Support MCP Tools)"。该策略对 MCP 工具的支持较为稳定。
-
配置工具列表:在 Agent 配置面板的 "工具列表" 部分,点击右侧的添加按钮,选择 "通过 SSE 发现和调用 MCP 工具"。然后添加与 MySQL 相关的工具列表。
建议选用高性能 API 模型,如阿里百炼云的 API 模型,以获得更好的效果。
- 配置指令:指令部分也就是提示词,它是引导 Agent 正确执行任务的关键。例如,可以设置如下指令:
使用中文回复。当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:
... (此处省略详细表结构,参考上文)
这里的 "query" 变量将作为用户输入的查询内容,传递给 Agent。同时,还需要设置最大迭代次数,默认值通常为 3。最后,在 "连接直接回复" 部分选择变量 "Agent.text"。
搭建 MCP SERVER
- 下载代码
git clone https://github.com/wenb1n-dev/mysql_mcp_server_pro.git
- 配置数据库
vi .env
cd mysql_mcp_server_pro/src/config
- 配置依赖
pip install mcp
pip install mysql-connector-python
pip install uvicorn
pip install python-dotenv
pip install starlette
- 启动 mcp server
uv run server.py
测试与优化
工作流测试
完成上述配置后,就可以对创建的 Dify 工作流进行测试。
测试方式:进入 Dify 的工作流测试界面,在输入框中输入实际的查询问题,例如 "哪个老师学生最多"。
工作原理:Agent 节点根据配置的指令和策略,识别出这是一个需要查询 MySQL 数据库的任务,然后通过 MCP 协议调用相应的 MySQL 工具。该工具将问题转化为 SQL 查询语句,并发送到 MySQL 数据库进行执行。
假设数据库中存储教师和学生信息的表分别为 teachers 和 students,生成的 SQL 查询语句可能类似于:
SELECT teachers.name, COUNT(students.id) AS student_count FROM teachers JOIN students ON teachers.id = students.headTeacherId GROUP BY teachers.name ORDER BY student_count DESC LIMIT 1;
结果查看:MySQL 数据库执行查询后,将结果返回给 Dify 工作流中的 Agent 节点,Agent 节点再将结果通过 "连接直接回复" 中的 Agent.text 变量返回给用户。
具体测试案例:
- 列出身高大于等于 168cm 所有学生
- 列出体重大于等于 60kg 的学生
- 哪个学生成绩最好
- 总成绩最好的是哪个班级
以上测试均符合预期。
常见问题与解决方案
连接失败
错误描述:Dify 无法成功连接到 MySQL,可能提示 "连接超时" 或 "无法找到服务器"。
可能原因:
- 网络问题:防火墙阻止了连接。
- 地址或端口错误:配置中填写错误。
- MySQL 服务未正常运行。
解决方案:
- 检查网络和防火墙,确保 Dify 所在服务器的 IP 地址能够访问 MySQL 的端口(默认为 3306)。
- 确认地址和端口与 MySQL 服务器的实际配置一致。
- 检查 MySQL 服务状态,使用
sudo systemctl status mysql 命令检查。
工具调用错误
错误描述:调用 MySQL 相关工具时,提示 "找不到工具" 或 "工具调用失败"。
可能原因:
- 插件安装或配置问题。
- 策略选择不当。
- 工具列表配置错误。
解决方案:
- 确认 Agent 策略 (支持 MCP 工具) 和 MCP SSE 插件已成功安装。
- 将 Agent 的 AGENT 策略选择为 "ReAct (Support MCP Tools)"。
- 仔细检查 MCP 服务器地址的配置,确保与 MCP SSE 插件中配置的地址一致。
SQL 执行错误
错误描述:返回的结果提示 SQL 执行错误,如 "语法错误""表不存在" 等。
可能原因:
- 提示词或指令问题:生成的 SQL 语句语法错误。
- 数据库结构变化:表结构发生变化但未更新配置。
解决方案:
- 优化提示词和指令,确保其能够准确地将用户输入转换为正确的 SQL 语句。
- 定期检查 MySQL 数据库的结构变化,及时更新 Dify 工作流中的相关配置和查询逻辑。