解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程_dify mysql mcp
文章目录
- 解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程
-
- 引言:技术融合的奇妙开篇
- 认识主角:Dify、MCP 与 MySQL
-
- (一)Dify:大语言模型应用开发利器
- (二)MCP:连接的桥梁
- (三)MySQL:经典数据库
- 准备工作:搭建融合舞台
-
- (一)环境搭建
- (二)安装与配置 Dify
- (三)安装与配置 MySQL
- 关键步骤:Dify 与 MySQL 的牵手过程
-
- (一)安装必要插件
- (二)配置 MCP SSE
- (三)创建 Dify 工作流
- (四)配置 Agent 策略
- (五)搭建MCP SERVER
-
- 1.下载代码
- 2.配置数据库
- 3.配置依赖
- 4.启动 mcp server
- 测试与优化:让融合更完美
-
- (一)工作流测试
-
- 测试1.列出身高大于等于168cm所有学生
- 测试2. 列出体重大于等于60kg的学生
- 测试3. 哪个学生成绩最好
- 测试4. 总成绩最好的是哪个班级
- 常见问题与解决方案:排忧解难
-
- (一)连接失败
- (二)工具调用错误
- (三)SQL 执行错误
解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程
引言:技术融合的奇妙开篇
在当今数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 MySQL 出色的数据存储和管理能力,实现更复杂、更智能的数据驱动型应用开发,极大地拓展了应用的功能边界和实用性。接下来,就让我们深入探索 Dify 通过 MCP 整合 MySQL 的详细过程与技术细节 。
认识主角:Dify、MCP 与 MySQL
(一)Dify:大语言模型应用开发利器
Dify 是一款极具创新性的开源大语言模型(LLM)应用开发平台 ,它将后端即服务(Backend as Service, BaaS)与 LLMOps 理念巧妙融合,为开发者打造了一个便捷高效的 AI 应用开发环境。其低代码 / 无代码开发模式堪称一大亮点,通过直观的可视化界面,开发者只需简单的拖拽和配置操作,就能轻松定义 Prompt(提示词)、上下文以及插件等关键要素,无需在底层技术细节中耗费过多精力,这使得开发门槛大幅降低,即使是编程经验相对较少的人员也能参与到 AI 应用的开发中来。
Dify 还采用了模块化设计,各个模块功能明确、接口清晰,开发者可以根据具体的项目需求,灵活选择并组合使用这些模块,从而构建出高度个性化的 AI 应用。在功能组件方面,Dify 更是提供了丰富多样的选择,涵盖 AI 工作流、RAG 管道、Agent、模型管理等多个领域,全面支持从应用原型设计到实际生产部署的整个过程。同时,Dify 对多种主流大型语言模型提供了良好的支持,包括 OpenAI 的 GPT 系列、Claude3 等,开发者可以根据应用场景和性能要求,自由选择最契合的模型,进一步提升应用的智能水平和适应性 。
(二)MCP:连接的桥梁
MCP,即模型上下文协议(Model Context Protocol),在 Dify 与 MySQL 的整合中扮演着至关重要的桥梁角色。作为一项新兴的开放协议,MCP 为大语言模型与外部应用之间搭建了一条双向通信通道,宛如 AI 世界里的 “USB-C” 接口,让模型能够便捷地发现、理解并安全调用各种外部工具或 API。
在 Dify 通过 MCP 整合 MySQL 的场景中,MCP 主要发挥了两方面关键作用。一方面,它提供了统一的协议支持,使得 Dify 中的大语言模型能够以标准化的方式与 MySQL 进行交互,避免了因不同数据库接口差异而带来的复杂适配工作。另一方面,MCP 还具备强大的工具调用能力,允许 Dify 根据用户的需求和指令,动态地调用 MySQL 相关的工具和功能,实现对数据库中数据的查询、更新、插入等操作,从而将大语言模型的智能处理能力与 MySQL 的数据存储和管理能力紧密结合起来,为开发者创造出更多的应用可能性 。
(三)MySQL:经典数据库
MySQL 作为一款开源的关系型数据库管理系统,在数据存储和管理领域拥有着广泛的应用和卓越的声誉。它具备众多显著的优势,使其成为了众多企业和开发者的首选数据库之一。
MySQL 以其高度的可靠性和稳定性著称,经过长时间的发展和大规模应用的验证,它能够在各种复杂的环境下稳定运行,确保数据的安全存储和可靠访问,无论是面对小规模的个人项目,还是大规模的企业级应用,MySQL 都能从容应对。在性能方面,MySQL 表现出色,采用了高效的索引和查询优化技术,能够快速处理大规模数据和高并发的访问请求,迅速响应用户的查询和操作指令,为应用提供流畅的运行体验。此外,MySQL 还具备出色的可扩展性,支持水平和垂直扩展,能够根据业务的发展和数据量的增长,灵活地进行部署和配置调整,满足不断变化的业务需求 。同时,MySQL 丰富的生态系统也为开发者提供了便利,大量的开源工具、第三方插件和扩展可供选择,进一步增强了其功能和应用场景。
准备工作:搭建融合舞台
(一)环境搭建
在开始整合 Dify 与 MySQL 之前,需要确保开发环境准备就绪。主要涉及 Python 环境以及相关插件的安装,建议使用 Python 3.8 及以上版本,以确保与后续安装的库和工具具有良好的兼容性。同时,为了实现 Dify 与 MySQL 之间基于 MCP 的通信和数据交互,还需要安装一些关键的插件和依赖库 。例如,用于支持 MCP 协议的相关插件,以及能够实现 Dify 与 MySQL 进行连接和数据操作的数据库驱动插件等,具体版本可根据官方文档和实际测试来确定,以保障系统的稳定性和功能的完整性。
(二)安装与配置 Dify
安装步骤:
首先,通过官方 GitHub 仓库获取 Dify 的源代码。打开终端,执行以下命令进行克隆:
git clone https://github.com/langgenius/dify.git --branch 1.1.0
安装过程需要依赖 Docker 和 Docker Compose,若尚未安装,需先完成这两个工具的安装。在 rocky 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 composesudo 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-reloadsystemctl restart dockersystemctl status docker
这样在下载镜像时就会很快。
在 Dify 项目目录下,通过 Docker Compose 来启动 Dify 服务。在终端中执行:
cp .env.example .env docker compose up -d# 验证安装是否成功(base) [root@localhost docker]# pwd/root/dify/docker(base) [root@localhost docker]# docker compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTSdocker-api-1 langgenius/dify-api:1.2.0 \"/bin/bash /entrypoi…\" api 25 hours ago Up 25 hours 5001/tcpdocker-db-1 postgres:15-alpine \"docker-entrypoint.s…\" db 25 hours ago Up 25 hours (healthy) 5432/tcpdocker-nginx-1 nginx:latest \"sh -c \'cp /docker-e…\" nginx 25 hours ago Up 25 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcpdocker-plugin_daemon-1 langgenius/dify-plugin-daemon:0.0.7-local \"/bin/bash -c /app/e…\" plugin_daemon 25 hours ago Up 25 hours 0.0.0.0:5003->5003/tcp, :::5003->5003/tcpdocker-redis-1 redis:6-alpine \"docker-entrypoint.s…\" redis 25 hours ago Up 25 hours (healthy) 6379/tcpdocker-sandbox-1 langgenius/dify-sandbox:0.2.11 \"/main\" sandbox 25 hours ago Up 25 hours (healthy) docker-ssrf_proxy-1 ubuntu/squid:latest \"sh -c \'cp /docker-e…\" ssrf_proxy 25 hours ago Up 25 hours 3128/tcpdocker-weaviate-1 semitechnologies/weaviate:1.19.0 \"/bin/weaviate --hos…\" weaviate 25 hours ago Up 25 hours docker-web-1 langgenius/dify-web:1.2.0 \"/bin/sh ./entrypoin…\" web 25 hours ago Up 25 hours 3000/tcpdocker-worker-1 langgenius/dify-api:1.2.0 \"/bin/bash /entrypoi…\" worker 25 hours ago Up 25 hours 5001/tcp(base) [root@localhost docker]#
此命令会在后台启动 Dify 的所有相关服务,包括前端、后端以及必要的中间件服务 。
基础配置:
启动完成后,通过浏览器访问 Dify 的前端界面,默认地址为http://localhost:3000
。首次访问时,需要进行一些基础配置,如设置管理员账号和密码等信息 。
接着,配置 Dify 的服务器地址和端口。若采用默认配置,服务器地址即为localhost
,端口为5000
。若需修改,可在 Dify 项目目录下的相关配置文件中进行调整,通常是在.env
文件中修改API_SERVER_HOST
和API_SERVER_PORT
等环境变量,以满足实际的部署需求 。
(三)安装与配置 MySQL
安装流程:略
准备表结构和数据:
新建数据库test
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
1.班级表
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 CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=\'班级表\';
2.课程表
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 DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=\'课程表\';
3.成绩表
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) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=\'成绩表\';
4.学生表
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 \'电子邮箱,示例:20230101@school.edu.cn\', `emergencyContact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT \'紧急联系人电话,示例:13876543210\', `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT \'家庭住址,示例:北京市海淀区中关村大街1栋101室\', `height` int NOT NULL COMMENT \'身高(cm),示例:175\', `weight` int NOT NULL COMMENT \'体重(kg),示例:65\', `healthStatus` enum(\'良好\',\'一般\',\'较差\') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT \'良好\' COMMENT \'健康状况,示例:良好\', PRIMARY KEY (`id`), KEY `classId` (`classId`), CONSTRAINT `classId` FOREIGN KEY (`classId`) REFERENCES `classes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=\'学生表\';
5.教师表
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 DEFAULT NULL COMMENT \'微信,示例:lily_teacher\', `isHeadTeacher` enum(\'true\',\'false\') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT \'false\' COMMENT \'是否为班主任,示例:true\', PRIMARY KEY (`id`,`office`) USING BTREE, KEY `id` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=\'教师表\';
录入数据
- 插入 teachers 表数据
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\'),(\'T007\', \'黄丽\', \'女\', \'历史\', \'副教授\', \'13812345684\', \'博学楼307\', \'jane_teacher\', \'true\'),(\'T008\', \'周明\', \'男\', \'地理\', \'讲师\', \'13812345685\', \'博学楼308\', \'ben_teacher\', \'false\'),(\'T009\', \'吴芳\', \'女\', \'生物\', \'教授\', \'13812345686\', \'博学楼309\', \'susan_teacher\', \'true\'),(\'T010\', \'郑强\', \'男\', \'政治\', \'副教授\', \'13812345687\', \'博学楼310\', \'david_teacher\', \'false\');
- 插入 classes 表数据
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\', \'1号楼404\', 32, \'校级优秀班集体\'),(\'202204\', \'2022级物理1班\', 2022, \'T003\', \'1号楼405\', 30, NULL),(\'202205\', \'2022级化学1班\', 2022, \'T004\', \'1号楼406\', 35, \'市级先进班集体\');
- 插入 students 表数据
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\', \'20230101@school.edu.cn\', \'13876543210\', \'北京市海淀区中关村大街1栋101室\', 175, 65, \'良好\'),(\'S20230102\', \'李华\', \'女\', \'2005-02-20 00:00:00\', \'202301\', \'13812345679\', \'20230102@school.edu.cn\', \'13876543211\', \'上海市浦东新区张江高科技园区2栋201室\', 165, 55, \'良好\'),(\'S20230201\', \'张明\', \'男\', \'2005-03-10 00:00:00\', \'202302\', \'13812345680\', \'20230201@school.edu.cn\', \'13876543212\', \'广州市天河区珠江新城3栋301室\', 180, 70, \'良好\'),(\'S20230202\', \'刘芳\', \'女\', \'2005-04-05 00:00:00\', \'202302\', \'13812345681\', \'20230202@school.edu.cn\', \'13876543213\', \'深圳市南山区科技园4栋401室\', 168, 58, \'良好\'),(\'S20230301\', \'陈伟\', \'男\', \'2005-05-15 00:00:00\', \'202303\', \'13812345682\', \'20230301@school.edu.cn\', \'13876543214\', \'南京市玄武区珠江路5栋501室\', 178, 68, \'良好\'),(\'S20230302\', \'赵丽\', \'女\', \'2005-06-20 00:00:00\', \'202303\', \'13812345683\', \'20230302@school.edu.cn\', \'13876543215\', \'杭州市西湖区文三路6栋601室\', 162, 52, \'良好\'),(\'S20230401\', \'黄强\', \'男\', \'2005-07-10 00:00:00\', \'202304\', \'13812345684\', \'20230401@school.edu.cn\', \'13876543216\', \'成都市高新区天府软件园7栋701室\', 176, 66, \'良好\'),(\'S20230402\', \'周静\', \'女\', \'2005-08-05 00:00:00\', \'202304\', \'13812345685\', \'20230402@school.edu.cn\', \'13876543217\', \'武汉市洪山区光谷广场8栋801室\', 167, 57, \'良好\'),(\'S20230501\', \'吴伟\', \'男\', \'2005-09-15 00:00:00\', \'202305\', \'13812345686\', \'20230501@school.edu.cn\', \'13876543218\', \'西安市雁塔区科技路9栋901室\', 177, 67, \'良好\'),(\'S20230502\', \'郑芳\', \'女\', \'2005-10-20 00:00:00\', \'202305\', \'13812345687\', \'20230502@school.edu.cn\', \'13876543219\', \'长沙市岳麓区麓谷大道10栋1001室\', 163, 53, \'良好\');
- 插入 courses 表数据
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\', \'选修\', \'C001\'),(\'C009\', \'英语口语\', 2, \'T002\', \'2023-2\', \'选修\', \'C002\'),(\'C010\', \'物理实验\', 2, \'T003\', \'2023-2\', \'选修\', \'C003\');
- 插入 scores 表数据
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\', 84, 88),(\'S20230401C005\', \'S20230401\', \'C005\', 92, \'2024-05-20\', 90, 94),(\'S20230501C004\', \'S20230501\', \'C004\', 84, \'2024-05-20\', 82, 86);
关键步骤:Dify 与 MySQL 的牵手过程
(一)安装必要插件
在 Dify 平台中,要实现通过 MCP 整合 MySQL,首先需要安装两个关键插件:Agent 策略(支持 MCP 工具) 和 MCP SSE 。
Agent 策略集合(支持 MCP SSE 发现和调用工具)
github地址:https://github.com/junjiem/dify-plugin-agent-mcp_sse
通过 HTTP with SSE 传输使用 MCP 协议来发现和调用工具。
github地址:https://github.com/junjiem/dify-plugin-tools-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 就能够通过 MCP SSE 插件与指定的 MySQL 服务地址进行通信,为后续的数据交互做好准备 。
(三)创建 Dify 工作流
接下来,需要在 Dify 中创建一个工作流,用于实现与 MySQL 的交互逻辑 。创建过程如下:
进入 Dify 的工作流创建页面,选择创建工作流类型为 “Chatflow”,并为工作流命名,例如 “Dify_MySQL_Integration” 。
在工作流设计画布中,默认会有一个 LLM 节点,但在我们的场景中,需要删除该节点,因为我们主要通过 Agent 来调用 MySQL 相关工具 。
从节点库中拖拽一个 “Agent” 节点到画布上 。这个 Agent 节点将作为与 MySQL 交互的核心组件,负责根据用户的指令调用相应的 MCP 工具,实现对 MySQL 数据库的操作 。此时,一个基本的工作流框架就搭建好了,后续还需要对 Agent 进行详细配置 。
(四)配置 Agent 策略
1.选择 ReAct (Support MCP Tools) 策略:点击添加的 Agent 节点,在右侧的配置面板中,将 AGENT 策略选择为 “ReAct (Support MCP Tools)” 。选择该策略的原因在于它对 MCP 工具的支持较为稳定和有效 。例如,在实际测试中,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题,而 ReAct 策略能够避免此类问题,确保 Agent 能够顺利调用 MCP 工具与 MySQL 进行交互 。
2.配置工具列表:在 Agent 配置面板的 “工具列表” 部分,点击右侧的添加按钮,选择 “通过 SSE 发现和调用 MCP 工具” 。然后添加与 MySQL 相关的工具列表,假设之前在 MCP SSE 中配置的 MySQL 服务地址对应的名称为 “mysql_mcp_server”,则在 MCP 服务器配置中添加:
注:要选择对应模型:
我原来选择我本地部署的deepseek:14B ,非常慢,导致达不到预想的结果,后面改成用阿里百炼云的API 模型,效果杆杆的。
通过这样的配置,Agent 就能够识别并调用与该 MySQL 服务相关的工具,实现对数据库的查询、更新等操作 。
3. 配置指令:指令部分也就是提示词,它是引导 Agent 正确执行任务的关键 。例如,可以设置如下指令:
使用中文回复。当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:# 学生管理系统数据库表结构说明## 1. 教师表 (teachers)| 字段名 | 类型 | 描述 | 约束 | 示例 ||--------|------|------|------|------|| id | varchar | 教师ID | 主键 | \"T001\" || name | varchar | 教师姓名 | 必填 | \"张建国\" || gender | enum | 性别 | \"男\"或\"女\" | \"男\" || subject | varchar | 教授科目 | 必填 | \"数学\" || title | varchar | 职称 | 必填 | \"教授\" || phone | varchar | 联系电话 | 必填 | \"13812345678\" || office | varchar | 办公室位置 | 必填 | \"博学楼301\" || wechat | varchar | 微信(可选) | 可选 | \"lily_teacher\" || isHeadTeacher | enum | 是否为班主任,\"true\"或\"false\" | 可选 | true |## 2. 班级表 (classes)| 字段名 | 类型 | 描述 | 约束 | 示例 ||--------|------|------|------|------|| id | varchar | 班级ID | 主键 | \"202301\" || className | varchar | 班级名称 | 必填 | \"2023级计算机1班\" || grade | int | 年级 | 必填 | 2023 || headTeacherId | varchar | 班主任ID | 外键(teachers.id) | \"T003\" || classroom | varchar | 教室位置 | 必填 | \"1号楼302\" || studentCount | int | 学生人数 | 必填 | 35 || remark | varchar | 备注信息 | 可选 | \"市级优秀班集体\" |## 3. 课程表 (courses)| 字段名 | 类型 | 描述 | 约束 | 示例 ||--------|------|------|------|------|| id | varchar | 课程ID | 主键 | \"C001\" || courseName | varchar | 课程名称 | 必填 | \"高等数学\" || credit | int | 学分 | 必填 | 4 || teacherId | varchar | 授课教师ID | 外键(teachers.id) | \"T001\" || semester | varchar | 学期 | 格式\"YYYY-N\" | \"2023-1\" || type | enum | 课程类型 | \"必修\"或\"选修\" | \"必修\" || prerequisite | varchar | 先修课程ID | 可选,外键(courses.id) | \"C003\" |## 4. 学生表 (students)| 字段名 | 类型 | 描述 | 约束 | 示例 ||--------|------|------|------|------|| id | varchar | 学号 | 主键 | \"S20230101\" || name | varchar | 学生姓名 | 必填 | \"王强\" || gender | enum | 性别 | \"男\"或\"女\" | \"男\" || birthDate | date | 出生日期 | 必填 | date(\"2005-01-15\") || enrollmentDate | date | 入学日期 | 必填 | date(\"2023-8-1\") || classId | varchar | 班级ID | 外键(classes.id) | \"202301\" || phone | varchar | 联系电话 | 必填 | \"13812345678\" || email | varchar | 电子邮箱 | 必填 | \"20230101@school.edu.cn\" || emergencyContact | varchar | 紧急联系人电话 | 必填 | \"13876543210\" || address | varchar | 家庭住址 | 必填 | \"北京市海淀区中关村大街1栋101室\" || height | int | 身高(cm) | 必填 | 175 || weight | int | 体重(kg) | 必填 | 65 || healthStatus | enum | 健康状况 | 必填,\"良好\"或\"一般\"或\"较差\" | \"良好\" |## 5. 成绩表 (scores)| 字段名 | 类型 | 描述 | 约束 | 示例 ||--------|------|------|------|------|| id | varchar | 成绩记录ID | 主键 | \"S20230101C001\" || studentId | varchar | 学生ID | 外键(students.id) | \"S20230101\" || courseId | varchar | 课程ID | 外键(courses.id) | \"C001\" || score | int | 综合成绩 | 0-100 | 85 || examDate | date | 考试日期 | 必填 | date(\"2024-5-20\") || usualScore | int | 平时成绩 | 0-100 | 90 || finalScore | int | 期末成绩 | 0-100 | 80 |### 补考成绩记录说明补考记录在_id后添加\"_M\"后缀,如\"S20230101C001_M\"## 表关系说明1. **一对多关系**: - 一个班级(classes)对应多个学生(students) - 一个教师(teachers)可以教授多门课程(courses) - 一个学生(students)有多条成绩记录(scores)2. **外键约束**: - 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 工作流就配置完成了 。
(五)搭建MCP SERVER
1.下载代码
git clone https://github.com/wenb1n-dev/mysql_mcp_server_pro.git
2.配置数据库
vi .envcd mysql_mcp_server_pro/src/config
3.配置依赖
pip install mcppip install mysql-connector-pythonpip install uvicornpip install python-dotenvpip install starlette
4.启动 mcp server
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_countFROM teachersJOIN students ON teachers.teacher_id = students.teacher_idGROUP BY teachers.teacher_nameORDER BY student_count DESCLIMIT 1;
结果查看:MySQL 数据库执行查询后,将结果返回给 Dify 工作流中的 Agent 节点,Agent 节点再将结果按照之前配置的格式和变量,通过 “连接直接回复” 中的Agent.text
变量返回给用户 。用户在 Dify 的工作流测试界面中就能看到查询结果,例如 “教师 [具体教师姓名] 的学生最多,共有 [X] 名学生” 。通过这样的测试过程,可以直观地验证 Dify 与 MySQL 的整合是否成功,以及工作流的配置是否正确 。如果测试过程中出现问题,如查询结果为空、报错等,就需要仔细检查工作流的配置、SQL 语句的正确性以及数据库的连接和权限设置等方面,逐步排查并解决问题 。
测试1.列出身高大于等于168cm所有学生
原数据如下:
大模型回答的结果:
符合预期。
测试2. 列出体重大于等于60kg的学生
符合预期。
测试3. 哪个学生成绩最好
符合预期。
测试4. 总成绩最好的是哪个班级
符合预期。
常见问题与解决方案:排忧解难
在 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 相关的工具,可参考前文工作流配置中工具列表的添加步骤和示例,重新添加或修改工具列表 。
(三)SQL 执行错误
错误描述:在 Dify 工作流测试时,输入查询问题后,返回的结果提示 SQL 执行错误,如 “语法错误”“表不存在” 等 。
可能原因:
提示词或指令问题:在 Agent 配置的指令(提示词)中,对用户输入的解析和转换为 SQL 语句的逻辑存在问题,导致生成的 SQL 语句语法错误 。例如,指令中对变量的引用错误,或者对查询条件的描述不清晰,使得生成的 SQL 语句无法正确执行 。
数据库结构变化:MySQL 数据库中的表结构发生了变化,如字段名称修改、表被删除等,但 Dify 工作流中的配置和查询逻辑未及时更新,导致查询时提示 “表不存在” 或 “未知列” 等错误 。
解决方案:
优化提示词和指令:仔细检查 Agent 配置中的指令,确保其能够准确地将用户输入转换为正确的 SQL 语句 。可参考一些 SQL 生成的示例和规则,对指令进行优化和调试 。例如,在指令中明确变量的使用方式和查询条件的表达,如 “使用中文回复。查询学生表中成绩大于变量 score 的学生信息,变量 score 由用户输入” 。同时,在工作流测试时,逐步分析用户输入和生成的 SQL 语句之间的转换过程,找出问题所在并进行修正 。
同步数据库结构信息:定期检查 MySQL 数据库的结构变化,当数据库结构发生改变时,及时更新 Dify 工作流中的相关配置和查询逻辑 。可以建立数据库结构变更的通知机制,确保开发人员能够及时了解数据库的变化情况 。在 Dify 工作流中,根据新的数据库结构,修改查询语句中的表名、字段名等信息,以保证查询的正确性 。例如,若 “students” 表被重命名为 “student_information”,则需要在 Dify 工作流的查询语句中相应地修改表名 。通过对这些常见问题的分析和解决,可以帮助开发者在 Dify 通过 MCP 整合 MySQL 的过程中更加顺利地进行开发和调试,确保系统的稳定运行 。