一、概述

MCP(Model Context Protocol)是一种让 AI 助手能够与外部工具和服务交互的协议。MySQL MCP Server 是专门用于连接 MySQL 数据库的 MCP 实现,让 AI 能够直接查询和操作数据库。

二、环境要求

2.1 基础环境

  • Python 3.8+

  • uv 或 pip 包管理工具

  • MySQL 5.7+ 或 MySQL 8.0+

2.2 推荐的 Python 环境

建议使用独立的 Python 环境,避免与系统 Python 冲突。

三、安装步骤

3.1 安装 uv(推荐)

# 使用 pip 安装 uv
pip install uv

# 或使用官方安装脚本(Linux/macOS)
curl -LsSf https://astral.sh/uv/install.sh | sh

3.2 安装 MySQL MCP Server

# 使用 pip 安装
pip install mysql-mcp-server

# 或使用 uv 安装
uv pip install --system mysql-mcp-server

# 如需指定版本
uv pip install --system mysql-mcp-server==0.2.2

3.3 推荐版本

mysql-connector-python 8.3.0 兼容性更好:

uv pip install --system mysql-connector-python==8.3.0

四、配置文件详解

4.1 基础配置

mcp.json 中配置 MySQL Server:

{
  "mcpServers": {
    "MySQL Server": {
      "command": "uvx",
      "args": [
        "--from",
        "mysql-mcp-server",
        "mysql_mcp_server"
      ],
      "env": {
        "MYSQL_HOST": "localhost",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "your_username",
        "MYSQL_PASSWORD": "your_password",
        "MYSQL_DATABASE": "your_database",
        "ALLOW_INSERT_OPERATION": "false",
        "ALLOW_UPDATE_OPERATION": "false",
        "ALLOW_DELETE_OPERATION": "false",
        "ALLOW_DDL_OPERATION": "false"
      }
    }
  }
}

4.2 配置参数说明

参数

必需

说明

示例

MYSQL_HOST

MySQL 主机地址

localhost 或 IP 地址

MYSQL_PORT

MySQL 端口号

3306

MYSQL_USER

数据库用户名

root

MYSQL_PASSWORD

数据库密码

password123

MYSQL_DATABASE

默认数据库名

my_database

ALLOW_INSERT_OPERATION

允许 INSERT 操作

true / false

ALLOW_UPDATE_OPERATION

允许 UPDATE 操作

true / false

ALLOW_DELETE_OPERATION

允许 DELETE 操作

true / false

ALLOW_DDL_OPERATION

允许 DDL 操作

true / false

4.3 替代配置方式(Python 方式)

{
  "mcpServers": {
    "MySQL Server": {
      "command": "python",
      "args": [
        "-c",
        "from mysql_mcp_server import main; main()"
      ],
      "env": {
        "MYSQL_HOST": "localhost",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "your_username",
        "MYSQL_PASSWORD": "your_password",
        "MYSQL_DATABASE": "your_database",
        "ALLOW_INSERT_OPERATION": "false",
        "ALLOW_UPDATE_OPERATION": "false",
        "ALLOW_DELETE_OPERATION": "false",
        "ALLOW_DDL_OPERATION": "false"
      }
    }
  }
}

五、核心用法:自然语言 + LLM 配合

5.1 什么是自然语言查询?

MySQL MCP 的核心价值在于让 AI 助手能够理解自然语言需求,自动转换为 SQL 查询并执行。这意味着您不需要写 SQL,只需要用日常语言描述您想要的数据。

5.2 自然语言查询示例

示例 1:基础数据查询

自然语言:

"查询 r_user 表中 company_id=2 且未删除的所有用户"

AI 自动生成的 SQL:

SELECT * FROM r_user WHERE company_id = 2 AND is_delete = 0
示例 2:关联查询

自然语言:

"查询角色为销售代表的人员,显示姓名、邮箱和公司ID"

AI 自动生成的 SQL:

SELECT 
    u.id,
    u.nickname,
    u.email,
    u.company_id
FROM r_user u
INNER JOIN r_rbac_user_role ur ON u.id = ur.user_id
INNER JOIN r_rbac_role r ON ur.role_id = r.id
WHERE r.role_name = '销售代表'
  AND u.is_delete = 0
示例 3:统计查询

自然语言:

"统计每个销售代表的工位数量,显示已审核和未审核的数量"

AI 自动生成的 SQL:

SELECT 
    u.nickname AS 销售代表,
    COUNT(*) AS 工位总数,
    SUM(CASE WHEN wst.status >= 3 THEN 1 ELSE 0 END) AS 已审核,
    SUM(CASE WHEN wst.status < 3 THEN 1 ELSE 0 END) AS 未审核
FROM r_work_station_template wst
INNER JOIN r_user u ON wst.sales_representative_id = u.id
WHERE wst.company_id = 2
GROUP BY u.id, u.nickname
ORDER BY 工位总数 DESC
示例 4:带条件的查询

自然语言:

"查询工位需求表中已审核的需求,显示创建人姓名和工位名称,按创建时间倒序排列"

AI 自动生成的 SQL:

SELECT 
    wst.id,
    wst.work_station_name,
    u.nickname AS 创建人,
    wst.status,
    wst.gmt_create
FROM r_work_station_demand wst
INNER JOIN r_user u ON wst.creator_user_id = u.id
WHERE wst.company_id = 2
  AND wst.status >= 3
  AND wst.is_delete = 0
ORDER BY wst.gmt_create DESC
示例 5:复杂的排序需求

自然语言:

"查询图表列表,如果有迭代开发时间就按迭代时间排序,否则按创建时间排序,两个时间都要倒序"

AI 自动生成的 SQL:

SELECT 
    id,
    name,
    iteration_develop_time,
    gmt_create
FROM r_charts_board
WHERE is_delete = 0
ORDER BY 
    (iteration_develop_time IS NOT NULL) DESC,
    iteration_develop_time DESC,
    gmt_create DESC

5.3 常用查询模板

模板 1:查看表结构

自然语言:

"查看 r_user 表的结构"

SQL:

DESCRIBE r_user
模板 2:查看前 N 条数据

自然语言:

"查看用户表的前 10 条数据"

SQL:

SELECT * FROM r_user LIMIT 10
模板 3:条件筛选

自然语言:

"查询入库数量为 2 的采购明细,计算价税合计之和"

SQL:

SELECT 
    COUNT(*) AS 记录数,
    SUM(price * num) AS 价税合计之和
FROM r_purchase_into_storage_order_detail
WHERE num = 2
模板 4:分组统计

自然语言:

"按状态统计工位需求的数量"

SQL:

SELECT 
    status,
    COUNT(*) AS 数量
FROM r_work_station_demand
WHERE is_delete = 0
GROUP BY status
模板 5:模糊查询

自然语言:

"查询用户名包含'销售'的用户"

SQL:

SELECT * FROM r_user 
WHERE nickname LIKE '%销售%'
  AND is_delete = 0

5.4 与 LLM 对话的技巧

技巧 1:明确指定表名和条件

推荐:

"查询 r_user 表中 company_id=2 且角色为销售代表的人员,显示姓名和邮箱"

模糊:

"查一下销售有哪些人" ❌

技巧 2:说明输出格式

推荐:

"查询销售代表列表,按工位数量降序排列,统计每个人创建的工位总数和已审核数量"

模糊:

"看看销售的情况" ❌

技巧 3:指定排序规则

推荐:

"查询图表列表,先按迭代时间倒序,再按创建时间倒序"

模糊:

"查一下图表" ❌

技巧 4:限定数据范围

推荐:

"查询公司ID=2的采购入库明细,只查入库数量=2的记录,计算价税合计之和"

模糊:

"查一下采购入库" ❌

5.5 常见业务场景对话

场景 1:人员管理

对话:

  • "查询所有销售代表人员"

  • "查看某个销售代表负责的所有工位"

  • "统计每个部门的员工数量"

场景 2:订单管理

对话:

  • "查询今天的采购入库单"

  • "统计每个供应商的订单金额"

  • "查看未审核的采购订单"

场景 3:数据分析

对话:

  • "查询工位需求按状态分布"

  • "统计本月新增客户数量"

  • "分析销售业绩排名"

5.6 自动 SQL 生成示例

用户需求 → AI 理解 → SQL 执行

Step 1: 用户输入自然语言

查询采购入库单表,入库数量为2的数据,并统计价税合计之和

Step 2: AI 自动分析

  • 识别表:r_purchase_into_storage_order_detail

  • 识别条件:num = 2

  • 识别字段:price, num

  • 计算:SUM(price * num)

Step 3: AI 生成并执行 SQL

SELECT 
    COUNT(*) AS 记录数,
    SUM(price * num) AS 价税合计之和
FROM r_purchase_into_storage_order_detail
WHERE num = 2

Step 4: 返回结果

记录数:663
价税合计之和:174537.56

六、SQL 查询方法

6.1 基本查询

查询所有表:

SHOW TABLES

查询表结构:

DESCRIBE table_name

简单查询:

SELECT id, name, email 
FROM users 
WHERE status = 1 
LIMIT 10

6.2 关联查询

SELECT 
    u.id,
    u.nickname,
    u.email,
    r.role_name
FROM r_user u
INNER JOIN r_rbac_user_role ur ON u.id = ur.user_id
INNER JOIN r_rbac_role r ON ur.role_id = r.id
WHERE u.company_id = 2
  AND u.is_delete = 0

6.3 聚合查询

SELECT 
    COUNT(*) as total_count,
    SUM(amount) as total_amount,
    AVG(price) as avg_price
FROM r_purchase_order_detail
WHERE quantity = 2

6.4 高级排序

按多字段排序:

SELECT 
    id,
    name,
    gmt_create,
    iteration_develop_time
FROM r_charts_board
WHERE is_delete = 0
ORDER BY 
    (iteration_develop_time IS NOT NULL) DESC,
    iteration_develop_time DESC,
    gmt_create DESC

七、常见问题与解决方案

7.1 问题:pywin32 安装失败

错误信息:

error: Failed to install: pywin32-311.whl
Missing .dist-info directory

解决方案:

# 清理缓存
uv cache clean --force

# 重新安装 pywin32
pip uninstall pywin32 -y
pip install pywin32==306 --no-cache-dir

7.2 问题:uv pip 需要虚拟环境

错误信息:

error: No virtual environment found

解决方案:

# 添加 --system 参数
uv pip install --system mysql-mcp-server

# 或创建虚拟环境
uv venv
source .venv/bin/activate  # Linux/macOS
.venv\Scripts\activate     # Windows

7.3 问题:mysql-connector-python 版本不兼容

错误信息:

Connection refused 或 连接超时

解决方案:

# 降级到稳定版本
uv pip install --system mysql-connector-python==8.3.0

7.4 问题:环境变量未传递

错误信息:

Missing required database configuration
MYSQL_USER, MYSQL_PASSWORD, and MYSQL_DATABASE are required

解决方案: 确保 mcp.json 配置文件中 env 部分正确配置所有必需参数。

7.5 问题:MCP 连接被关闭

错误信息:

mcp error: MCP tool invocation failed: Connection closed

解决方案:

  1. 重启 MCP 服务

  2. 检查数据库连接是否正常

  3. 重启 IDE

八、安全建议

8.1 生产环境建议

  1. 限制操作权限:

    "ALLOW_INSERT_OPERATION": "false",
    "ALLOW_UPDATE_OPERATION": "false",
    "ALLOW_DELETE_OPERATION": "false",
    "ALLOW_DDL_OPERATION": "false"
  2. 使用专用账号: 创建只读用户用于 MCP 连接:

    CREATE USER 'mcp_readonly'@'%' IDENTIFIED BY 'strong_password';
    GRANT SELECT ON database_name.* TO 'mcp_readonly'@'%';
    FLUSH PRIVILEGES;
  3. 网络隔离:

    • 使用内网连接数据库

    • 配置防火墙规则

    • 使用 VPN 连接

8.2 配置示例(只读权限)

{
  "mcpServers": {
    "MySQL Server ReadOnly": {
      "command": "uvx",
      "args": [
        "--from",
        "mysql-mcp-server",
        "mysql_mcp_server"
      ],
      "env": {
        "MYSQL_HOST": "your-host.internal",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "mcp_readonly",
        "MYSQL_PASSWORD": "strong_password",
        "MYSQL_DATABASE": "production_db",
        "ALLOW_INSERT_OPERATION": "false",
        "ALLOW_UPDATE_OPERATION": "false",
        "ALLOW_DELETE_OPERATION": "false",
        "ALLOW_DDL_OPERATION": "false"
      }
    }
  }
}

九、实战案例

9.1 查询销售代表人员

SELECT 
    u.id AS 用户ID,
    u.nickname AS 用户名,
    u.email AS 邮箱,
    r.role_name AS 角色
FROM r_user u
INNER JOIN r_rbac_user_role ur ON u.id = ur.user_id
INNER JOIN r_rbac_role r ON ur.role_id = r.id
WHERE r.role_name = '销售代表'
  AND u.company_id = 2
  AND u.is_delete = 0

9.2 统计工位需求

SELECT 
    u.nickname AS 销售代表,
    COUNT(*) AS 工位数量,
    SUM(CASE WHEN wst.status >= 3 THEN 1 ELSE 0 END) AS 已审核数量
FROM r_work_station_template wst
INNER JOIN r_user u ON wst.sales_representative_id = u.id
WHERE wst.company_id = 2
GROUP BY u.id, u.nickname
ORDER BY 工位数量 DESC

9.3 图表排序查询

SELECT 
    id,
    name,
    iteration_develop_time,
    gmt_create
FROM r_charts_board
WHERE is_delete = 0
ORDER BY 
    (iteration_develop_time IS NOT NULL) DESC,
    iteration_develop_time DESC,
    gmt_create DESC

十、最佳实践

10.1 与 LLM 配合的最佳实践

  1. 清晰表达需求

    • ✅ 使用具体的表名和字段

    • ✅ 说明筛选条件

    • ✅ 指定排序规则

    • ✅ 说明输出格式

  2. 渐进式查询

    • ✅ 先查看表结构

    • ✅ 再查询少量数据

    • ✅ 最后进行复杂统计

  3. 验证 AI 生成的 SQL

    • ✅ 确认查询条件正确

    • ✅ 检查字段映射

    • ✅ 验证计算逻辑

  4. 迭代优化

    • ✅ 根据结果调整查询

    • ✅ 使用 LIMIT 限制数据量

    • ✅ 添加索引优化性能

10.2 配置文件管理

  • 使用版本控制管理 mcp.json

  • 敏感信息使用环境变量

  • 定期更新密码

10.3 查询优化

  • 始终添加 LIMIT 限制结果集大小

  • 使用适当的索引

  • 避免全表扫描

10.4 错误处理

  • 检查连接状态

  • 验证 SQL 语法

  • 处理 NULL 值

10.5 性能监控

  • 监控慢查询

  • 定期检查数据库性能

  • 优化频繁访问的查询

十一、总结

MySQL MCP 为 AI 助手提供了强大的数据库访问能力,通过合理的配置和安全设置,可以在保证数据安全的前提下大大提高工作效率。

核心优势

  1. 自然语言查询:无需编写 SQL,直接用日常语言描述需求

  2. 自动生成 SQL:AI 自动分析需求并生成优化的 SQL 语句

  3. 即时反馈:实时查询和数据分析

  4. 降低门槛:让非技术人员也能进行数据库查询

关键要点:

  • ✅ 使用 uv 管理 Python 包更方便

  • ✅ 推荐使用 mysql-connector-python==8.3.0

  • ✅ 生产环境建议使用只读权限

  • ✅ 配置文件需正确设置环境变量

  • ✅ 遇到问题先检查数据库连接和包版本

  • ✅ 善用自然语言与 LLM 配合,提高查询效率

  • ✅ 提供清晰的需求描述,帮助 AI 生成准确的 SQL

参考资源


最后更新:2026年4月

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐