我开发了一个 MySQL MCP 服务,AI 直接连数据库查询,开发效率提升 10 倍!
让 AI 助手直接操作 MySQL 数据库,告别复制粘贴 SQL 结果的低效工作流。
一、为什么我开发了它?
作为后端开发,我每天要和 MySQL 打交道数十次:
- 🔍 查询线上日志排查 Bug
- 📊 统计业务数据给产品汇报
- 🧹 清理测试环境的数据
- 🔧 检查表结构、索引是否合理
以前的工作流:
- 打开 Navicat / DataGrip
- 输入连接信息
- 写 SQL 查询
- 复制结果
- 粘贴给 AI 分析
- AI 看不懂,再解释一遍表结构...
现在的工作流:
我:最近 7 天订单量趋势如何?
AI:[直接执行查询] → 自动生成趋势分析报告
效率提升的不是一星半点!
二、什么是 MCP?
MCP(Model Context Protocol)是 Anthropic 推出的开放协议,可以理解为 AI 的 USB-C 接口:
| 特性 | 说明 |
|---|---|
| 标准化 | 统一的数据交换格式 |
| 即插即用 | 一次开发,Claude、Kimi、GPT 都能用 |
| 双向通信 | AI 能读数据,也能执行操作 |
简单说,MCP 让 AI 不再只是"聊天",而是能真正"动手"操作你的工具。
三、14 个工具全覆盖
我开发了 14 个实用工具,覆盖日常开发的全部场景:
🔍 查询类
| 工具 | 用途 |
|---|---|
select | 执行 SELECT 查询(带安全检查) |
query | 通用查询(SELECT/SHOW/DESCRIBE) |
batch_query | 批量只读查询,一次查多个 |
✏️ 写入类
| 工具 | 用途 |
|---|---|
insert | 单条插入 |
update | 单条更新 |
delete | 单条删除 |
execute | 通用执行(包含上面三个) |
📦 批量类
| 工具 | 用途 |
|---|---|
batch_insert | 批量插入,自带事务 |
batch_execute | 批量执行 SQL,事务保障 |
📋 元数据类
| 工具 | 用途 |
|---|---|
show_databases | 查看所有库 |
list_tables | 查看所有表 |
describe_table | 查看表结构 |
show_indexes | 查看索引 |
show_create_table | 查看建表 SQL |
四、核心代码实现
4.1 项目结构
mysql-mcp-server/
├── src/
│ ├── index.ts # 服务入口
│ ├── db.ts # 连接池配置
│ └── tools/
│ ├── query.ts # 查询工具
│ ├── execute.ts # 执行工具
│ ├── batch.ts # 批量工具
│ └── schema.ts # 元数据工具
├── package.json
└── tsconfig.json
4.2 数据库连接池
// src/db.ts
import mysql from 'mysql2/promise';
export const db = mysql.createPool({
host: process.env.MYSQL_HOST || 'localhost',
port: parseInt(process.env.MYSQL_PORT || '3306'),
user: process.env.MYSQL_USER || 'root',
password: process.env.MYSQL_PASSWORD || '',
database: process.env.MYSQL_DATABASE,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
4.3 查询工具(带安全检查)
// src/tools/query.ts
import { db } from '../db';
export const selectTool = {
name: 'select',
description: '执行 SELECT 查询语句,支持参数化查询防止 SQL 注入',
inputSchema: {
type: 'object',
properties: {
sql: {
type: 'string',
description: 'SELECT SQL 语句'
},
params: {
type: 'array',
description: '查询参数(用于参数化查询)',
items: { type: 'any' }
}
},
required: ['sql']
},
async handler(args: { sql: string; params?: any[] }) {
// 安全检查:确保只能是 SELECT/SHOW
const trimmedSql = args.sql.trim().toLowerCase();
if (!trimmedSql.startsWith('select') && !trimmedSql.startsWith('show')) {
throw new Error('此工具仅支持 SELECT/SHOW 查询');
}
const [rows] = await db.execute(args.sql, args.params || []);
return {
content: [{
type: 'text',
text: JSON.stringify(rows, null, 2)
}]
};
}
};
4.4 批量插入(事务支持)
这是我最常用的功能之一,开发环境造数据神器:
// src/tools/batch.ts
export const batchInsertTool = {
name: 'batch_insert',
description: '批量插入多条记录(自动使用事务)。最多支持 50 条记录。',
inputSchema: {
type: 'object',
properties: {
table: { type: 'string', description: '表名' },
records: {
type: 'array',
description: '要插入的记录对象数组',
items: { type: 'object' }
}
},
required: ['table', 'records']
},
async handler(args: { table: string; records: Record<string, any>[] }) {
if (args.records.length > 50) {
throw new Error('最多支持 50 条记录');
}
const connection = await db.getConnection();
try {
await connection.beginTransaction();
const results = [];
for (const record of args.records) {
const fields = Object.keys(record);
const placeholders = fields.map(() => '?').join(',');
const sql = `INSERT INTO \`${args.table}\` (\`${fields.join('`,`')}\`) VALUES (${placeholders})`;
const [result] = await connection.execute(sql, Object.values(record));
results.push(result);
}
await connection.commit();
const affectedRows = results.reduce((sum, r) => sum + (r.affectedRows || 0), 0);
return {
content: [{
type: 'text',
text: `成功插入 ${affectedRows} 条记录`
}]
};
} catch (error) {
await connection.rollback();
throw error;
} finally {
connection.release();
}
}
};
4.5 查看表结构
// src/tools/schema.ts
export const describeTableTool = {
name: 'describe_table',
description: '获取指定表的详细结构信息,包括字段、类型、主键等',
inputSchema: {
type: 'object',
properties: {
table: { type: 'string', description: '表名' }
},
required: ['table']
},
async handler(args: { table: string }) {
const [rows] = await db.query(`DESCRIBE \`${args.table}\``);
return {
content: [{
type: 'text',
text: JSON.stringify(rows, null, 2)
}]
};
}
};
五、真实使用场景
场景 1:排查线上问题
我:用户 ID 10086 最近 3 天的订单状态
AI:[调用 select]
查询到 5 条记录:
- 2024-03-10: 已支付,待发货
- 2024-03-11: 已发货,运输中
- 2024-03-12: 已签收
分析:该用户订单流程正常,无异常状态。
场景 2:数据统计汇报
我:统计本月每天的 GMV 和订单量
AI:[调用 select]
┌─────────────┬──────────┬──────────┐
│ date │ orders │ gmv │
├─────────────┼──────────┼──────────┤
│ 2024-03-01 │ 1,256 │ ¥89,430 │
│ 2024-03-02 │ 1,389 │ ¥102,580 │
│ ... │ ... │ ... │
└─────────────┴──────────┴──────────┘
趋势:本月日均 GMV 约 9.5 万,周末有明显提升。
场景 3:批量造测试数据
我:给 users 表插入 20 条测试用户数据
AI:[调用 batch_insert]
→ 成功插入 20 条记录
场景 4:查看表结构优化
我:orders 表的索引情况
AI:[调用 show_indexes]
┌─────────┬──────────┬────────────┐
│ Key_name│ Column │ Cardinality│
├─────────┼──────────┼────────────┤
│ PRIMARY │ id │ 1,000,000 │
│ idx_user│ user_id │ 500,000 │
│ idx_time│ created │ 100,000 │
└─────────┴──────────┴────────────┘
建议:created 字段的区分度较低,考虑改为联合索引 (user_id, created)。
六、安装配置
6.1 Kimi Code CLI
在项目 .kimi/mcp.json 中添加:
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["./mysql-mcp-server/dist/index.js"],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}
6.2 Claude Desktop
在 claude_desktop_config.json 中:
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["/absolute/path/to/mysql-mcp-server/dist/index.js"],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}
6.3 启动
git clone https://github.com/wenit/redis-mcp-server.git
cd mysql-mcp-server
npm install
npm run build
npm start
七、技术亮点
7.1 安全第一
- ✅ 参数化查询,防 SQL 注入
- ✅
select工具仅允许 SELECT/SHOW - ✅ 批量操作自带事务回滚
7.2 生产就绪
- ✅ 连接池管理,避免连接泄露
- ✅ 错误处理完善,返回友好提示
- ✅ 支持批量操作,性能优化
7.3 开发者友好
- ✅ 元数据工具齐全,AI 能看懂表结构
- ✅ JSON 输出,便于 AI 解析
- ✅ 清晰的错误信息
八、踩坑记录
8.1 Token 开销问题
14 个工具的 Schema 约占用 2,200 tokens,一开始担心上下文压力。
但实际使用下来:
- 128K 上下文模型占比仅 1.7%
- 工具语义清晰,AI 调用准确率高
- 比让 AI "猜测" 表结构省多了
8.2 最大收获
最大的收获不是技术,而是 工作流的改变:
- 以前查数据要切窗口、复制、粘贴
- 现在一句话 AI 自动搞定
- 分析 + 执行一体化
九、后续规划
- SQL 执行计划分析(EXPLAIN)
- 慢查询自动发现
- 数据变更审计日志
- 支持 PostgreSQL
如果对你有帮助,欢迎 Star ⭐ 和 PR!
有问题可以在 Issues 留言,我会尽快回复。