我开发了一个 MySQL MCP 服务,AI 直接连数据库查询,开发效率提升 10 倍!

8 阅读5分钟

我开发了一个 MySQL MCP 服务,AI 直接连数据库查询,开发效率提升 10 倍!

项目地址github.com/wenit/redis…

让 AI 助手直接操作 MySQL 数据库,告别复制粘贴 SQL 结果的低效工作流。

一、为什么我开发了它?

作为后端开发,我每天要和 MySQL 打交道数十次:

  • 🔍 查询线上日志排查 Bug
  • 📊 统计业务数据给产品汇报
  • 🧹 清理测试环境的数据
  • 🔧 检查表结构、索引是否合理

以前的工作流

  1. 打开 Navicat / DataGrip
  2. 输入连接信息
  3. 写 SQL 查询
  4. 复制结果
  5. 粘贴给 AI 分析
  6. 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-011,256    │ ¥89,430  │
│ 2024-03-021,389    │ ¥102,580 │
│ ...         │ ...      │ ...      │
└─────────────┴──────────┴──────────┘

趋势:本月日均 GMV 约 9.5 万,周末有明显提升。

场景 3:批量造测试数据

我:给 users 表插入 20 条测试用户数据

AI:[调用 batch_insert]
→ 成功插入 20 条记录

场景 4:查看表结构优化

我:orders 表的索引情况

AI:[调用 show_indexes]
┌─────────┬──────────┬────────────┐
│ Key_name│ ColumnCardinality│
├─────────┼──────────┼────────────┤
│ 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

项目地址github.com/wenit/redis…

如果对你有帮助,欢迎 Star ⭐PR

有问题可以在 Issues 留言,我会尽快回复。