前言
在当前大语言模型(LLM)应用开发的浪潮中,MCP(Model Context Protocol)协议正在成为连接 AI 模型与本地数据设施的关键桥梁。本文将以 MySQL 数据库为例,详细拆解如何通过 MCP 协议让 AI 模型直接操作关系型数据库,涵盖从服务器发现、数据库架构设计、数据初始化、MCP 配置文件编写到复杂自然语言查询与写入的全过程。
第一部分:MCP 服务器的发现与配置获取
在进行任何数据交互之前,首要任务是确立连接协议与服务源。通过 MCP 服务市场,开发者可以快速检索并获取所需的 MCP 服务器配置。
在搜索栏输入 mysql 关键字,系统会立即检索出相关的 MCP 服务器资源。搜索结果中清晰展示了 MySQL 对应的 MCP 服务卡片。
[图片]
点击选中该 MCP 服务器后,界面会跳转至详细的配置详情页。此页面至关重要,它提供了后续在客户端(如编辑器插件)中配置连接所需的 JSON 结构与参数说明,包括环境依赖和启动命令。
[图片]
第二部分:数据库基础设施构建
在配置 MCP 连接之前,必须确保底层的 MySQL 数据库环境已经就绪,并且存在可供操作的数据实体。以下操作展示了如何从零开始构建一个名为 lanyun 的数据库实例。
2.1 创建数据库
首先,通过数据库管理工具连接到 MySQL 实例,并执行基础的 DDL(数据定义语言)命令来创建数据库。
CREATE DATABASE lanyun;
USE lanyun;
CREATE DATABASE lanyun; 语句用于并在存储系统中初始化一个新的命名空间,随后 USE lanyun; 命令将当前的会话上下文切换至该数据库,确保后续的建表与数据插入操作均作用于正确的范围内。
下图展示了该命令执行前的界面状态,此时尚未建立数据库连接。
[图片]
执行上述 SQL 语句后,控制台反馈执行成功。此时,一个名为 lanyun 的数据库已经存在于 MySQL 实例中。
[图片]
本次演示环境的基础配置参数如下:
- 用户:root(拥有最高权限,适合测试环境)
- 数据库名:lanyun
- 服务端口:3306(MySQL 默认标准端口)
2.2 数据表结构设计(Schema Design)
为了验证 MCP 的复杂查询能力,需要构建一个包含关联关系的业务数据模型。这里设计了三张核心表:users(用户)、products(商品)和 orders(订单),它们之间通过外键构成典型的电商业务模型。
请执行以下 SQL 语句来创建表结构:
-- 用户表
CREATE TABLE IF NOT EXISTS `users` (
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID',
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
`email` VARCHAR(100) UNIQUE COMMENT '邮箱',
`phone` VARCHAR(20) UNIQUE COMMENT '手机号',
`age` TINYINT UNSIGNED COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
-- 商品表
CREATE TABLE IF NOT EXISTS `products` (
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品 ID',
`name` VARCHAR(100) NOT NULL COMMENT '商品名称',
`price` DECIMAL(10,2) NOT NULL COMMENT '商品价格',
`stock` INT NOT NULL DEFAULT 0 COMMENT '库存',
`category` VARCHAR(50) COMMENT '商品分类',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品信息表';
-- 订单表
CREATE TABLE IF NOT EXISTS `orders` (
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单 ID',
`user_id` INT NOT NULL COMMENT '用户 ID',
`product_id` INT NOT NULL COMMENT '商品 ID',
`quantity` INT NOT NULL DEFAULT 1 COMMENT '购买数量',
`total_price` DECIMAL(10,2) NOT NULL COMMENT '订单总价',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1-待付款,2-已付款,3-已发货,4-已完成,5-已取消',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单信息表';
技术细节解析:
- 引擎选择:所有表均指定
ENGINE=InnoDB,这是为了支持事务处理(ACID)和行级锁定,对于订单系统至关重要。 - 字符集:使用
utf8mb4字符集,能够兼容包括 Emoji 在内的所有 Unicode 字符。 - 约束设计:
users表中,username、email、phone均设置了UNIQUE唯一约束,防止重复注册。orders表通过FOREIGN KEY严格定义了引用完整性,确保订单必须归属于存在的用户和存在的商品。
- 数据类型:
- 价格字段使用
DECIMAL(10,2)而非FLOAT,以避免浮点数计算时的精度丢失问题。 - 状态字段使用
TINYINT,节省存储空间。
- 价格字段使用
执行上述 DDL 语句后,数据库表结构初始化完成。
[图片]
2.3 初始化测试数据
为了让 MCP 能够检索到有意义的内容,需要向表中预置一定量的模拟数据。
2.3.1 插入用户数据
插入 10 条典型的用户记录,涵盖不同的年龄段和联系方式。
INSERT INTO `users` (`username`, `email`, `phone`, `age`) VALUES
('zhangsan', '[email protected]', '13800138000', 25),
('lisi', '[email protected]', '13800138001', 30),
('wangwu', '[email protected]', '13800138002', 22),
('zhaoliu', '[email protected]', '13800138003', 28),
('sunqi', '[email protected]', '13800138004', 35),
('zhouba', '[email protected]', '13800138005', 26),
('wujian', '[email protected]', '13800138006', 29),
('chenshi', '[email protected]', '13800138007', 32),
('yangjiu', '[email protected]', '13800138008', 24),
('huangshi', '[email protected]', '13800138009', 31);
执行结果如下图所示,显示 10 行数据受影响,且无重复键错误。
[图片]
2.3.2 插入商品数据
插入 8 条商品数据,涵盖手机、电脑、家电等不同分类,并设置不同的价格梯队。
INSERT INTO `products` (`name`, `price`, `stock`, `category`) VALUES
('小米 14 Pro', 4999.00, 200, '手机'),
('华为 Mate 60 Pro', 5999.00, 150, '手机'),
('苹果 MacBook Pro', 12999.00, 80, '笔记本电脑'),
('联想拯救者 Y9000P', 8999.00, 100, '笔记本电脑'),
('大疆 Mini 4 Pro', 3799.00, 60, '无人机'),
('索尼 WH-1000XM5', 2499.00, 120, '耳机'),
('小米空气净化器 4 Pro', 899.00, 180, '智能家居'),
('美的电饭煲 5L', 399.00, 250, '家电');
执行状态如下,商品信息已成功存入数据库。
[图片]
2.3.3 插入订单数据
这是最关键的一步,因为它建立了用户与商品之间的联系。插入 15 条订单记录,覆盖各种订单状态(待付款、已完成、已取消等)。
INSERT INTO `orders` (`user_id`, `product_id`, `quantity`, `total_price`, `status`) VALUES
(1, 1, 1, 4999.00, 4), -- 张三购买小米 14 Pro,已完成
(1, 6, 1, 2499.00, 2), -- 张三购买索尼耳机,已付款
(2, 2, 1, 5999.00, 3), -- 李四购买华为 Mate 60 Pro,已发货
(3, 3, 1, 12999.00, 1), -- 王五购买苹果 MacBook Pro,待付款
(4, 4, 1, 8999.00, 4), -- 赵六购买联想拯救者,已完成
(5, 5, 1, 3799.00, 2), -- 孙七购买大疆无人机,已付款
(6, 7, 2, 1798.00, 3), -- 周八购买 2 台小米净化器,已发货
(7, 8, 1, 399.00, 1), -- 吴九购买美的电饭煲,待付款
(8, 1, 2, 9998.00, 4), -- 陈十购买 2 台小米 14 Pro,已完成
(9, 2, 1, 5999.00, 5), -- 杨九购买华为 Mate 60 Pro,已取消
(10, 3, 1, 12999.00, 2), -- 黄十购买苹果 MacBook Pro,已付款
(2, 6, 1, 2499.00, 4), -- 李四购买索尼耳机,已完成
(3, 7, 1, 899.00, 3), -- 王五购买小米净化器,已发货
(4, 8, 3, 1197.00, 1), -- 赵六购买 3 个美的电饭煲,待付款
(5, 5, 2, 7598.00, 2); -- 孙七购买 2 台大疆无人机,已付款
该操作不仅填充了数据,还隐式验证了外键约束的正确性(即 user_id 和 product_id 必须存在于前两张表中)。
[图片]
2.4 数据验证
在接入 MCP 之前,手动执行一条查询语句以确保数据落盘无误。
SELECT * FROM `users` LIMIT 10;
查询结果如下,可以清晰地看到之前插入的 10 位用户信息,包含 ID、用户名、邮箱等字段。
[图片]
至此,数据库层面的准备工作全部完成,数据状态健康且结构完整。
第三部分:MCP 连接配置与环境启动
接下来的核心步骤是在编辑器中配置 MCP 客户端,使其能够通过标准协议与 MySQL 数据库通信。
3.1 JSON 配置详解
在配置文件中,输入以下 JSON 代码。这段代码定义了一个名为 mysql 的 MCP 服务器实例。
{
"mcpServers": {
"mysql": {
"command": "npx",
"args": ["-y", "@kevinwatt/mysql-mcp"],
"env": {
"MYSQL_HOST": "host",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root",
"MYSQL_PASS": "passwd",
"MYSQL_DB": "lanyun"
}
}
}
}
参数深入解析:
command: 'npx':表示使用 Node.js 的包执行器来运行 MCP 服务器。args: 指定了要执行的具体包名@kevinwatt/mysql-mcp,-y参数用于自动确认安装提示。这个包本身就是一个实现了 MCP 协议的中间件,负责将 AI 的自然语言指令或函数调用转化为 MySQL 协议包。env(环境变量):这是最关键的部分,定义了连接数据库所需的凭证。MYSQL_HOST: 数据库主机地址(此处需替换为实际 IP 或 hostname)。MYSQL_PORT: 端口,与前文配置的 3306 一致。MYSQL_USER/MYSQL_PASS: 认证信息。MYSQL_DB: 指定连接lanyun数据库。
下图展示了将代码填入配置文件时的界面状态。
[图片]
3.2 服务连接确认
配置保存后,插件会自动尝试启动 MCP 服务器。当连接成功建立时,界面会给予明确的反馈。
[图片]
MCP 架构的优势在于其透明性。在下图中,系统清晰地展示了 MCP 服务器的运行状态和可用工具列表,表明 AI 现在已经具备了'看到'并'操作'该数据库的能力。
[图片]
第四部分:AI 驱动的复杂数据查询
环境搭建完毕后,现在进入实际应用阶段。我们将演示如何通过自然语言让 AI 执行复杂的多表关联查询,并进行数据导出。
4.1 自然语言指令
向 MCP 客户端发送以下包含复杂逻辑的自然语言请求:
1. 查询目标:用户姓名、手机号、购买的商品名称、订单状态、订单创建时间
2. 筛选条件:
- 用户年龄大于 28 岁
- 商品价格大于 3000 元
- 订单创建时间在 2025 年 1 月 1 日之后
- 订单状态不是'已取消'(status≠5)
3. 排序需求:先按用户年龄降序,再按订单创建时间升序
这个请求涉及到了 users、products、orders 三张表的连接(JOIN),以及多重 WHERE 子句和复合 ORDER BY 排序。
4.2 执行过程与工具调用
AI 接收到指令后,首先通过 MCP 协议获取数据库 Schema,然后构建查询逻辑。下图展示了 AI 正在调用 MCP 工具获取数据,并生成 Python 代码以处理数据导出。
[图片]
4.3 结果产出
AI 不仅执行了查询,还利用 Python 环境将结果生成为 Excel 文件。下图展示了生成的 Excel 表格内容,数据结构清晰,完全符合查询要求。
[图片]
4.4 SQL 逻辑反查
为了验证 AI 操作的准确性,我们可以查看其生成的底层 SQL 代码。AI 构建的 SQL 如下:
SELECT u.username AS 用户姓名,u.phone AS 手机号,p.name AS 商品名称,o.status AS 订单状态,o.create_time AS 订单创建时间,u.age AS 用户年龄
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN products p ON o.product_id = p.id
WHERE u.age > 28 -- 用户年龄大于 28 岁
AND p.price > 3000 -- 商品价格大于 3000 元
AND o.create_time >= '2025-01-01 00:00:00' -- 订单创建时间在 2025 年 1 月 1 日之后
AND o.status != 5 -- 订单状态不是已取消
ORDER BY u.age DESC, -- 先按用户年龄降序
o.create_time ASC; -- 再按订单创建时间升序
这段 SQL 逻辑严密:
- 使用了
JOIN正确关联了三张表。 WHERE子句精准对应了所有自然语言中的筛选条件。ORDER BY正确实现了复合排序逻辑。
将此 SQL 语句直接在 MySQL 客户端中执行,结果如下图所示。对比可以发现,数据库直接查询的结果与 MCP 导出的 Excel 数据完全一致,证明了 MCP 在处理复杂业务逻辑时的可靠性。
[图片]
第五部分:AI 驱动的数据写入操作
除了查询(Read),MCP 同样支持数据写入(Write)操作。以下演示如何通过自然语言批量插入新用户。
5.1 插入指令
发送如下指令:
请基于 MySQL 数据库执行以下数据插入操作:
1. 目标表:`users`(用户表)
2. 插入字段:`username`(用户名)、`email`(邮箱)、`phone`(手机号)、`age`(年龄)
3. 插入数据:
- ('qianer', '[email protected]', '13800138010', 33)
- ('songsan', '[email protected]', '13800138011', 38)
- ('lixsi', '[email protected]', '13800138012', 29)
- ('wangwu_new', '[email protected]', '13800138013', 40)
- ('chenliu', '[email protected]', '13800138014', 35)
4. 执行要求:
- 确保 SQL 语法符合 MySQL 规范,字段和值匹配无误
- 执行插入操作后,返回插入结果(如受影响行数、是否成功)
- 若存在重复数据(如用户名/手机号/邮箱重复),给出错误处理建议
5.2 执行反馈
MCP 服务器接收指令并将其转换为 INSERT 语句执行。界面反馈显示操作成功完成。
[图片]
5.3 写入验证
最后,回到 MySQL 数据库进行验证。由于之前的测试数据 ID 到 10,新插入的数据 ID 应从 11 开始。
执行验证 SQL:
-- 查询新增的 5 个用户(ID 从 11 开始,对应本次插入)
SELECT * FROM `users` WHERE id >= 11;
结果如下图所示,5 条新用户数据已精确无误地存入数据库中,且字段对应关系完全正确。
[图片]
总结
通过上述流程,本文详细展示了如何利用 MCP 服务器,实现从数据库搭建、配置编写到 AI 自然语言交互的完整闭环。MCP 协议极大地降低了 AI 接入传统数据设施的门槛,使得复杂的 SQL 编写和数据处理工作可以通过自然语言指令高效完成。
对于希望探索更多 MCP 应用场景的开发者,可以访问相关控制台体验更多服务。

