最近在折腾 Dify 的时候,试着通过 MCP 协议把 MySQL 接了起来。原先我以为又要写一堆中间件,结果发现用现成的 MCP server 就能让 Agent 直接跑 SQL,过程比想象中简单。下面是我踩过一遍的记录,给有类似需求的同学参考。
环境准备
Python 版本至少 3.8。后边还会用到 Docker,所以也先装好。
Dify 我用的是 1.1.0,从 GitHub 直接拉:
git clone https://github.com/langgenius/dify.git --branch 1.1.0
然后进目录改一下 .env.example 复制成 .env,用 Docker Compose 启动:
cp .env.example .env
docker compose up -d
如果环境比较干净,装 Docker 可以照这个来(CentOS/RHEL 系):
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
需要走代理的话,在 /etc/systemd/system/docker.service.d/http-proxy.conf 加上:
[Service]
Environment="HTTP_PROXY=http://proxy_ip:port"
Environment="HTTPS_PROXY=http://proxy_ip:port"
Environment="NO_PROXY=localhost,127.0.0.1"
然后 systemctl daemon-reload 和 restart docker。
Dify 启动后访问 http://localhost:3000,第一次会引导设置管理员账号。默认 API 端口是 5000,需要改的话在 .env 里调。
MySQL 建表
我新建了一个数据库 test,字符集 utf8mb4。
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
下面这几张表模拟了一个简易的学校管理系统:
-- 教师表
CREATE TABLE `teachers` (
`id` varchar(255) NOT NULL COMMENT ,
`name` () COMMENT ,
`gender` enum(,) COMMENT ,
`subject` () COMMENT ,
`title` () COMMENT ,
`phone` () COMMENT ,
`office` () COMMENT ,
`wechat` () COMMENT ,
`isHeadTeacher` enum(,) COMMENT ,
(`id`)
) ENGINEInnoDB CHARSETutf8mb4 COMMENT;
`classes` (
`id` () COMMENT ,
`className` () COMMENT ,
`grade` COMMENT ,
`headTeacherId` () COMMENT ,
`classroom` () COMMENT ,
`studentCount` COMMENT ,
`remark` () COMMENT ,
(`id`),
`headTeacherId` (`headTeacherId`) `teachers` (`id`) CASCADE CASCADE
) ENGINEInnoDB CHARSETutf8mb4 COMMENT;
`students` (
`id` () COMMENT ,
`name` () COMMENT ,
`gender` enum(,) COMMENT ,
`birthDate` datetime COMMENT ,
`classId` () COMMENT ,
`phone` () COMMENT ,
`email` () COMMENT ,
`height` COMMENT ,
`weight` COMMENT ,
`healthStatus` enum(,,) COMMENT ,
(`id`),
`classId` (`classId`) `classes` (`id`) CASCADE
) ENGINEInnoDB CHARSETutf8mb4 COMMENT;
`courses` (
`id` () COMMENT ,
`courseName` () COMMENT ,
`credit` COMMENT ,
`teacherId` () COMMENT ,
`semester` () COMMENT ,
`type` enum(,) COMMENT ,
(`id`)
) ENGINEInnoDB CHARSETutf8mb4 COMMENT;
`scores` (
`id` () COMMENT ,
`studentId` () COMMENT ,
`courseId` () COMMENT ,
`score` COMMENT ,
`examDate` COMMENT ,
`usualScore` COMMENT ,
`finalScore` COMMENT ,
(`id`),
`studentId` (`studentId`) `students` (`id`) CASCADE,
`courseId` (`courseId`) `courses` (`id`) CASCADE
) ENGINEInnoDB CHARSETutf8mb4 COMMENT;


