Dify 与 MySQL 深度融合实战:基于 MCP 协议的数据交互指南
本文详细介绍了如何使用 Dify 平台结合 MCP 协议与 MySQL 数据库进行深度集成。文章涵盖了环境搭建、Dify 与 MySQL 的安装配置、MCP Server 的搭建、Dify 工作流及 Agent 策略的配置等关键步骤。通过具体的 SQL 表结构设计和数据录入示例,展示了如何构建学生管理系统数据库。此外,还提供了工作流测试案例及常见问题解决方案,帮助开发者实现基于自然语言的数据查询与分析功能。

本文详细介绍了如何使用 Dify 平台结合 MCP 协议与 MySQL 数据库进行深度集成。文章涵盖了环境搭建、Dify 与 MySQL 的安装配置、MCP Server 的搭建、Dify 工作流及 Agent 策略的配置等关键步骤。通过具体的 SQL 表结构设计和数据录入示例,展示了如何构建学生管理系统数据库。此外,还提供了工作流测试案例及常见问题解决方案,帮助开发者实现基于自然语言的数据查询与分析功能。

在数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 MySQL 出色的数据存储和管理能力,实现更复杂、更智能的数据驱动型应用开发。
Dify 是一款极具创新性的开源大语言模型(LLM)应用开发平台,它将后端即服务(Backend as Service, BaaS)与 LLMOps 理念巧妙融合,为开发者打造了一个便捷高效的 AI 应用开发环境。其低代码/无代码开发模式是一大亮点,通过直观的可视化界面,开发者只需简单的拖拽和配置操作,就能轻松定义 Prompt、上下文以及插件等关键要素,无需在底层技术细节中耗费过多精力。
Dify 采用了模块化设计,提供了丰富多样的功能组件,涵盖 AI 工作流、RAG 管道、Agent、模型管理等多个领域,全面支持从应用原型设计到实际生产部署的整个过程。同时,Dify 对多种主流大型语言模型提供了良好的支持。
MCP,即模型上下文协议(Model Context Protocol),在 Dify 与 MySQL 的整合中扮演着至关重要的桥梁角色。作为一项新兴的开放协议,MCP 为大语言模型与外部应用之间搭建了一条双向通信通道,让模型能够便捷地发现、理解并安全调用各种外部工具或 API。
在 Dify 通过 MCP 整合 MySQL 的场景中,MCP 主要发挥了两方面关键作用。一方面,它提供了统一的协议支持,使得 Dify 中的大语言模型能够以标准化的方式与 MySQL 进行交互。另一方面,MCP 还具备强大的工具调用能力,允许 Dify 根据用户的需求和指令,动态地调用 MySQL 相关的工具和功能,实现对数据库中数据的查询、更新、插入等操作。
MySQL 作为一款开源的关系型数据库管理系统,在数据存储和管理领域拥有着广泛的应用和卓越的声誉。它具备高度的可靠性和稳定性,性能表现出色,采用了高效的索引和查询优化技术。此外,MySQL 还具备出色的可扩展性,支持水平和垂直扩展,能够满足不断变化的业务需求。
在开始整合 Dify 与 MySQL 之前,需要确保开发环境准备就绪。主要涉及 Python 环境以及相关插件的安装,建议使用 Python 3.8 及以上版本。为了实现 Dify 与 MySQL 之间基于 MCP 的通信和数据交互,还需要安装一些关键的插件和依赖库。
安装步骤:
首先,通过官方 GitHub 仓库获取 Dify 的源代码。打开终端,执行以下命令进行克隆:
git clone https://github.com/langgenius/dify.git --branch 1.1.0
安装过程需要依赖 Docker 和 Docker Compose。若尚未安装,需先完成这两个工具的安装。在 Rocky Linux 9.5 系统上,安装 Docker 的命令如下:
# 设置代理 export http_proxy="http://192.168.1.xxx:7897" export https_proxy="http://192.168.1.xxx:7897" export no_proxy="localhost,127.0.0.1"
# 更新 dnf 源 dnf update
# 搜索 docker 镜像 dnf search docker
# 添加 docker 安装包仓库 dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
# 安装 docker compose sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# docker 设置为开机自启动 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 等环境变量。
安装流程:略
准备表结构和数据:新建数据库 test。
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE `classes` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级 ID,示例:202301',
`className` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级名称,示例:2023 级计算机 1 班',
`grade` int NOT NULL COMMENT '年级,示例:2023',
`headTeacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班主任 ID,外键 (teachers.id),示例:T003',
`classroom` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教室位置,示例:1 号楼 302',
`studentCount` int NOT NULL COMMENT '学生人数,示例:35',
`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 CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
CREATE TABLE `courses` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程 ID,示例:C001',
`courseName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程名称,示例:高等数学',
`credit` int NOT NULL COMMENT '学分,示例:4',
`teacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授课教师 ID,外键 (teachers.id),示例:T001',
`semester` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学期,格式"YYYY-N",示例:2023-1',
`type` enum('必修','选修') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '选修' COMMENT '课程类型,"必修"或"选修",示例:选修',
`prerequisite` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '先修课程 ID,可选,外键 (courses.id),示例:C003',
PRIMARY KEY (`id`),
KEY `teacherId` (`teacherId`),
CONSTRAINT `teacherId` FOREIGN KEY (`teacherId`) REFERENCES `teachers` (`id`) ON CASCADE CASCADE
) ENGINEInnoDB CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
CREATE TABLE `scores` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '成绩记录 ID,示例:S20230101C001',
`studentId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生 ID,外键 (students.id),示例:S20230101',
`courseId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程 ID,外键 (courses.id),示例:C001',
`score` int NOT NULL COMMENT '综合成绩,0-100,示例:85',
`examDate` date NOT NULL COMMENT '考试日期,示例:2024-5-20',
`usualScore` int DEFAULT '0' COMMENT '平时成绩,0-100,示例:90',
`finalScore` int DEFAULT '0' COMMENT '期末成绩,0-100,示例:80',
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
) ENGINEInnoDB CHARSETutf8mb4 utf8mb4_unicode_ci COMMENT;
CREATE TABLE `students` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学号,示例:S20230101',
`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 '出生日期,示例:2005-01-15',
`classId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级 ID,外键 (classes.id),示例:202301',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话,示例:13812345678',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '电子邮箱,示例:[email protected]',
`emergencyContact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '紧急联系人电话,示例:13876543210',
`address` varchar() 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,示例:T001',
`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 '联系电话,示例:13812345678',
`office` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '办公室位置,示例:博学楼 301',
`wechat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 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'),('T002','李明','男','英语','副教授','13812345679','博学楼 302','tom_teacher','false'),('T003','王芳','女','物理','讲师','13812345680','博学楼 303','lucy_teacher','true'),('T004','赵强','男','化学','副教授','13812345681','博学楼 304','jack_teacher','false'),('T005','陈静','女','计算机','教授','13812345682','博学楼 305','rose_teacher','true'),('T006','刘伟','男','语文','讲师','13812345683','博学楼 306','mike_teacher','false'),(,,,,,,,,),(,,,,,,,,),(,,,,,,,,),(,,,,,,,,);
INSERT INTO `classes` (`id`,`className`,`grade`,`headTeacherId`,`classroom`,`studentCount`,`remark`) VALUES ('202301','2023 级计算机 1 班',2023,'T005','1 号楼 302',35,'市级优秀班集体'),('202302','2023 级数学 1 班',2023,'T001','1 号楼 303',32,'校级优秀班集体'),('202303','2023 级英语 1 班',2023,'T002','1 号楼 304',30,NULL),('202304','2023 级物理 1 班',2023,'T003','1 号楼 305',34,'校级先进班集体'),('202305','2023 级化学 1 班',2023,'T004','1 号楼 306',31,NULL),('202201','2022 级计算机 1 班',2022,'T005','1 号楼 402',36,'市级优秀班集体'),('202202','2022 级数学 1 班',2022,'T001','1 号楼 403',33,NULL),('202203','2022 级英语 1 班',2022,'T002',,,),(,,,,,,),(,,,,,,);
INSERT INTO `students` (`id`,`name`,`gender`,`birthDate`,`classId`,`phone`,`email`,`emergencyContact`,`address`,`height`,`weight`,`healthStatus`) VALUES ('S20230101','王强','男','2005-01-15 00:00:00','202301','13812345678','[email protected]','13876543210','北京市海淀区中关村大街 1 栋 101 室',175,65,'良好'),('S20230102','李华','女','2005-02-20 00:00:00','202301','13812345679','[email protected]','13876543211','上海市浦东新区张江高科技园区 2 栋 201 室',165,55,'良好'),('S20230201','张明','男','2005-03-10 00:00:00','202302','13812345680','[email protected]','13876543212','广州市天河区珠江新城 3 栋 301 室',180,70,'良好'),('S20230202','刘芳','女','2005-04-05 00:00:00','202302','13812345681','[email protected]','13876543213','深圳市南山区科技园 4 栋 401 室',168,58,'良好'),('S20230301','陈伟',,,,,,,,,,),(,,,,,,,,,,,),(,,,,,,,,,,,),(,,,,,,,,,,,),(,,,,,,,,,,,),(,,,,,,,,,,,);
INSERT INTO `courses` (`id`,`courseName`,`credit`,`teacherId`,`semester`,`type`,`prerequisite`) VALUES ('C001','高等数学',4,'T001','2023-1','必修',NULL),('C002','大学英语',3,'T002','2023-1','必修',NULL),('C003','大学物理',4,'T003','2023-1','必修',NULL),('C004','大学化学',3,'T004','2023-1','必修',NULL),('C005','计算机基础',3,'T005','2023-1','必修',NULL),('C006','数据结构',4,'T005','2023-2','选修','C005'),('C007','线性代数',3,'T001','2023-2','选修','C001'),('C008','概率论与数理统计',4,'T001','2023-2','选修',),(,,,,,,),(,,,,,,);
INSERT INTO `scores` (`id`,`studentId`,`courseId`,`score`,`examDate`,`usualScore`,`finalScore`) VALUES ('S20230101C001','S20230101','C001',85,'2024-05-20',90,80),('S20230101C002','S20230101','C002',90,'2024-05-20',85,95),('S20230101C005','S20230101','C005',95,'2024-05-20',92,98),('S20230201C001','S20230201','C001',88,'2024-05-20',87,90),('S20230201C003','S20230201','C003',82,'2024-05-20',80,85),('S20230301C002','S20230301','C002',87,'2024-05-20',85,90),('S20230301C004','S20230301','C004',80,'2024-05-20',78,82),('S20230401C003','S20230401','C003',86,'2024-05-20',,),(,,,,,,),(,,,,,,);
在 Dify 平台中,要实现通过 MCP 整合 MySQL,首先需要安装两个关键插件:Agent 策略(支持 MCP 工具)和 MCP SSE。
参考仓库:https://github.com/junjiem/dify-plugin-agent-mcp_sse
通过 HTTP with SSE 传输使用 MCP 协议来发现和调用工具。
参考仓库:https://github.com/junjiem/dify-plugin-tools-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 就能够通过 MCP SSE 插件与指定的 MySQL 服务地址进行通信,为后续的数据交互做好准备。
接下来,需要在 Dify 中创建一个工作流,用于实现与 MySQL 的交互逻辑。创建过程如下:
进入 Dify 的工作流创建页面,选择创建工作流类型为 "Chatflow",并为工作流命名,例如 "Dify_MySQL_Integration"。
在工作流设计画布中,默认会有一个 LLM 节点,但在我们的场景中,需要删除该节点,因为我们主要通过 Agent 来调用 MySQL 相关工具。
从节点库中拖拽一个 "Agent" 节点到画布上。这个 Agent 节点将作为与 MySQL 交互的核心组件,负责根据用户的指令调用相应的 MCP 工具,实现对 MySQL 数据库的操作。此时,一个基本的工作流框架就搭建好了,后续还需要对 Agent 进行详细配置。
选择 ReAct (Support MCP Tools) 策略:点击添加的 Agent 节点,在右侧的配置面板中,将 AGENT 策略选择为 "ReAct (Support MCP Tools)"。选择该策略的原因在于它对 MCP 工具的支持较为稳定和有效。例如,在实际测试中,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题,而 ReAct 策略能够避免此类问题,确保 Agent 能够顺利调用 MCP 工具与 MySQL 进行交互。
配置工具列表:在 Agent 配置面板的 "工具列表" 部分,点击右侧的添加按钮,选择 "通过 SSE 发现和调用 MCP 工具"。然后添加与 MySQL 相关的工具列表,假设之前在 MCP SSE 中配置的 MySQL 服务地址对应的名称为 "mysql_mcp_server",则在 MCP 服务器配置中添加。
注:建议选择云端 API 模型以获得更好性能。
通过这样的配置,Agent 就能够识别并调用与该 MySQL 服务相关的工具,实现对数据库的查询、更新等操作。
使用中文回复。当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:
# 学生管理系统数据库表结构说明
## 1. 教师表 (teachers)
| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 教师 ID | 主键 | "T001" |
| name | varchar | 教师姓名 | 必填 | "张建国" |
| gender | enum | 性别 | "男"或"女" | "男" |
| subject | varchar | 教授科目 | 必填 | "数学" |
| title | varchar | 职称 | 必填 | "教授" |
| phone | varchar | 联系电话 | 必填 | "13812345678" |
| office | varchar | 办公室位置 | 必填 | "博学楼 301"
wechat 微信 (可选) 可选 "lily_teacher"
isHeadTeacher enum 是否为班主任,"true"或"false" 可选
## 班级表 (classes)
字段名 类型 描述 约束 示例
id 班级 ID 主键 "202301"
className 班级名称 必填 "2023 级计算机 1 班"
grade 年级 必填
headTeacherId 班主任 ID 外键 (teachers.id) "T003"
classroom 教室位置 必填 "1 号楼 302"
studentCount 学生人数 必填
remark 备注信息 可选 "市级优秀班集体"
## 课程表 (courses)
字段名 类型 描述 约束 示例
id 课程 ID 主键 "C001"
courseName 课程名称 必填 "高等数学"
credit 学分 必填
teacherId 授课教师 ID 外键 (teachers.id) "T001"
semester 学期 格式"YYYY-N" "2023-1"
type enum 课程类型 "必修"或"选修" "必修"
prerequisite 先修课程 ID 可选,外键 (courses.id) "C003"
## 学生表 (students)
字段名 类型 描述 约束 示例
id 学号 主键 "S20230101"
name 学生姓名 必填 "王强"
gender enum 性别 "男"或"女" "男"
birthDate 出生日期 必填 ("2005-01-15")
enrollmentDate 入学日期 必填 ("2023-8-1")
classId 班级 ID 外键 (classes.id) "202301"
phone 联系电话 必填 "13812345678"
email 电子邮箱 必填 "[email protected]"
emergencyContact 紧急联系人电话 必填 "13876543210"
address 家庭住址 必填 "北京市海淀区中关村大街 1 栋 101 室"
height 身高 (cm) 必填
weight 体重 (kg) 必填
healthStatus enum 健康状况 必填,"良好"或"一般"或"较差" "良好"
## 成绩表 (scores)
字段名 类型 描述 约束 示例
id 成绩记录 ID 主键 "S20230101C001"
studentId 学生 ID 外键 (students.id) "S20230101"
courseId 课程 ID 外键 (courses.id) "C001"
score 综合成绩
examDate 考试日期 必填 ("2024-5-20")
usualScore 平时成绩
finalScore 期末成绩
### 补考成绩记录说明
补考记录在_id 后添加"_M"后缀,如"S20230101C001_M"
### 表关系说明
一对多关系:
一个班级 (classes) 对应多个学生 (students)
一个教师 (teachers) 可以教授多门课程 (courses)
一个学生 (students) 有多条成绩记录 (scores)
外键约束:
students.classId → classes.id
courses.teacherId → teachers.id
scores.studentId → students.id
scores.courseId → courses.id
classes.headTeacherId → teachers.id
这里的 "query" 变量将作为用户输入的查询内容,传递给 Agent,Agent 根据这个变量的值调用相应的 MySQL 工具进行查询操作。同时,还需要设置最大迭代次数,该参数用于控制工具调用的深度和复杂性,防止出现无限循环或过度调用工具的情况,避免资源浪费和系统性能问题,默认值通常为 3,可根据实际需求进行调整。最后,在 "连接直接回复" 部分选择变量 "Agent.text",这样 Agent 执行任务后的结果将通过该变量直接回复给用户。完成上述配置后,点击发布预览,一个能够通过 MCP 与 MySQL 进行整合的 Dify 工作流就配置完成了。
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
uv run server.py
完成上述配置后,就可以对创建的 Dify 工作流进行测试,以验证其是否能够正确地与 MySQL 进行整合并实现预期的功能。
测试方式:进入 Dify 的工作流测试界面,在输入框中输入实际的查询问题,例如 "哪个老师学生最多"。这个问题看似简单,却涉及到对数据库中教师与学生关系数据的查询和分析。Dify 工作流接收到这个问题后,会触发之前配置好的 Agent 节点。
工作原理:Agent 节点根据配置的指令和策略,识别出这是一个需要查询 MySQL 数据库的任务,然后通过 MCP 协议调用相应的 MySQL 工具。该工具将问题转化为 SQL 查询语句,并发送到 MySQL 数据库进行执行。假设数据库中存储教师和学生信息的表分别为 teachers 和 students,且 students 表中有一个字段 teacher_id 用于关联 teachers 表,那么生成的 SQL 查询语句可能类似于:
SELECT teachers.teacher_name, COUNT(students.student_id) AS student_count FROM teachers JOIN students ON teachers.teacher_id = students.teacher_id GROUP BY teachers.teacher_name ORDER BY student_count DESC LIMIT 1;
结果查看:MySQL 数据库执行查询后,将结果返回给 Dify 工作流中的 Agent 节点,Agent 节点再将结果按照之前配置的格式和变量,通过 "连接直接回复" 中的 Agent.text 变量返回给用户。用户在 Dify 的工作流测试界面中就能看到查询结果,例如 "教师 [具体教师姓名] 的学生最多,共有 [X] 名学生"。通过这样的测试过程,可以直观地验证 Dify 与 MySQL 的整合是否成功,以及工作流的配置是否正确。如果测试过程中出现问题,如查询结果为空、报错等,就需要仔细检查工作流的配置、SQL 语句的正确性以及数据库的连接和权限设置等方面,逐步排查并解决问题。
原数据如下:符合预期。
符合预期。
符合预期。
符合预期。
在 Dify 通过 MCP 整合 MySQL 的过程中,可能会遇到一些常见问题,下面为大家一一列举并提供相应的解决方案。
错误描述:在配置 MCP SSE 连接 MySQL 服务地址后,Dify 无法成功连接到 MySQL,可能提示 "连接超时" 或 "无法找到服务器" 等错误信息。
可能原因:
网络问题:MySQL 服务器与 Dify 所在的服务器之间网络不通,可能是由于防火墙阻止了连接,或者网络配置错误。例如,MySQL 服务器的防火墙未开放 Dify 连接所需的端口(默认为 3306),导致 Dify 无法建立连接。
地址或端口错误:在配置 MCP SSE 的 MySQL 服务地址和端口时,填写错误。如将 IP 地址写错,或者端口号与 MySQL 实际监听的端口不一致。
MySQL 服务未正常运行:MySQL 服务器端的服务可能未启动,或者在运行过程中出现异常停止,导致无法响应 Dify 的连接请求。
解决方案:
检查网络和防火墙:在 MySQL 服务器上,检查防火墙设置,确保 Dify 所在服务器的 IP 地址能够访问 MySQL 的端口。在 Linux 系统中,若使用的是 ufw 防火墙,可通过 sudo ufw allow 3306 命令开放 3306 端口(假设 MySQL 使用默认端口)。对于 CentOS 系统,使用 firewall-cmd --zone=public --add-port=3306/tcp --permanent 命令添加端口规则,并执行 sudo firewall-cmd --reload 使规则生效。同时,可使用 ping 命令测试两台服务器之间的网络连通性,使用 telnet 命令测试端口是否可访问,如 telnet mysql_server_ip 3306。
确认地址和端口:仔细检查 MCP SSE 配置中填写的 MySQL 服务地址和端口,确保与 MySQL 服务器的实际配置一致。可登录 MySQL 服务器,查看 MySQL 配置文件(通常是 my.cnf 或 my.ini),确认 bind-address 和 port 参数的设置。
检查 MySQL 服务状态:在 MySQL 服务器上,使用 sudo systemctl status mysql 命令检查 MySQL 服务是否正在运行。若服务未运行,可使用 sudo systemctl start mysql 命令启动服务。如果服务启动失败,查看 MySQL 的错误日志(通常位于 /var/log/mysql/error.log),根据日志信息排查具体原因,如数据库文件损坏、配置错误等。
错误描述:在 Dify 工作流中,配置好 Agent 策略和工具列表后,调用 MySQL 相关工具时,提示 "找不到工具" 或 "工具调用失败" 等错误。
可能原因:
插件安装或配置问题:Agent 策略 (支持 MCP 工具) 和 MCP SSE 插件可能未正确安装,或者在插件配置过程中出现错误。例如,MCP SSE 插件的 sse 地址配置错误,导致无法正确发现和调用 MySQL 工具。
策略选择不当:在 Agent 配置中,选择的 AGENT 策略与 MCP 工具不兼容。如前文提到的,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题。
工具列表配置错误:在 Agent 的工具列表中,MCP 服务器地址配置错误,或者未正确添加与 MySQL 相关的工具。
解决方案:
检查插件安装和配置:在 Dify 的插件管理界面,确认 Agent 策略 (支持 MCP 工具) 和 MCP SSE 插件已成功安装。对于 MCP SSE 插件,点击插件进入配置页面,检查添加的 sse 地址是否正确。若有多个 MCP 应用,确保每个应用的地址和配置都准确无误。可参考前文安装插件时的步骤和配置示例,重新核对配置信息。
选择正确的策略:将 Agent 的 AGENT 策略选择为 "ReAct (Support MCP Tools)",该策略对 MCP 工具的支持较为稳定。避免使用可能存在兼容性问题的策略,如 FunctionCalling 策略。
核对工具列表配置:在 Agent 的工具列表配置中,仔细检查 MCP 服务器地址的配置,确保与 MCP SSE 插件中配置的地址一致。同时,确认已正确添加与 MySQL 相关的工具,可参考前文工作流配置中工具列表的添加步骤和示例,重新添加或修改工具列表。
错误描述:在 Dify 工作流测试时,输入查询问题后,返回的结果提示 SQL 执行错误,如 "语法错误""表不存在" 等。
可能原因:
提示词或指令问题:在 Agent 配置的指令(提示词)中,对用户输入的解析和转换为 SQL 语句的逻辑存在问题,导致生成的 SQL 语句语法错误。例如,指令中对变量的引用错误,或者对查询条件的描述不清晰,使得生成的 SQL 语句无法正确执行。
数据库结构变化:MySQL 数据库中的表结构发生了变化,如字段名称修改、表被删除等,但 Dify 工作流中的配置和查询逻辑未及时更新,导致查询时提示 "表不存在" 或 "未知列" 等错误。
解决方案:
优化提示词和指令:仔细检查 Agent 配置中的指令,确保其能够准确地将用户输入转换为正确的 SQL 语句。可参考一些 SQL 生成的示例和规则,对指令进行优化和调试。例如,在指令中明确变量的使用方式和查询条件的表达,如 "使用中文回复。查询学生表中成绩大于变量 score 的学生信息,变量 score 由用户输入"。同时,在工作流测试时,逐步分析用户输入和生成的 SQL 语句之间的转换过程,找出问题所在并进行修正。
同步数据库结构信息:定期检查 MySQL 数据库的结构变化,当数据库结构发生改变时,及时更新 Dify 工作流中的相关配置和查询逻辑。可以建立数据库结构变更的通知机制,确保开发人员能够及时了解数据库的变化情况。在 Dify 工作流中,根据新的数据库结构,修改查询语句中的表名、字段名等信息,以保证查询的正确性。例如,若 "students" 表被重命名为 "student_information",则需要在 Dify 工作流的查询语句中相应地修改表名。通过对这些常见问题的分析和解决,可以帮助开发者在 Dify 通过 MCP 整合 MySQL 的过程中更加顺利地进行开发和调试,确保系统的稳定运行。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online