# MySQL MCP Server
一个基于 Model Context Protocol (MCP) 的MySQL数据库服务器,具备**企业级版本控制**和**安全权限管理**功能。
## 🎯 功能特性
### 📊 核心数据库功能
- 🔍 **执行自定义SQL查询** - 支持任意MySQL查询语句
- 📋 **数据库管理** - 显示数据库、表、索引等信息
- 🔧 **表结构查看** - 获取表的详细结构和统计信息
- 📈 **性能分析** - 查询执行计划分析和数据库大小统计
- 🛠️ **数据操作** - 支持创建表、插入数据等操作
### 🛡️ 安全与权限控制
- 🔐 **三级权限控制** - 精确控制INSERT/UPDATE/DELETE权限
- 🔒 **默认只读模式** - 防止意外数据修改和删除
- 🎨 **美观的表格输出** - 查询结果以表格形式展示
- 🔐 **安全连接** - 支持SSL连接和完整的认证配置
### ⚡ Git风格版本控制系统
- 📚 **智能备份策略** - 自动备份所有增删改操作
- 🔄 **精确回滚功能** - 可回滚到任意历史版本
- 🕐 **微秒级时间戳** - 精确的操作时间记录
- 🎭 **会话隔离** - 每个对话的版本历史独立管理
- 💾 **持久化存储** - 使用SQLite存储版本历史
- 📝 **完整SQL记录** - 记录每个操作的完整SQL语句
### 🔧 开发友好
- 🔑 **环境变量支持** - 通过环境变量预设数据库连接信息
- 🎛️ **灵活配置** - 支持多种连接和权限配置方式
## 安装
### 本地安装
0. clone到本地:
```bash
git clone https://github.com/csrts/MySQL_MCP_Server
cd MySQL_MCP_Server
```
1. 安装依赖:
```bash
npm install
```
2. 添加到你使用的MCP Clients:
#### 例:Cursor
```json
"mysql": {
"command": "node",
"args": [
"path_your_mcp_server/src/index.js"
],
"env": {
"MYSQL_HOST": "your_mysql_host",
"MYSQL_PORT": "3306",
"MYSQL_USER": "mysql_username",
"MYSQL_PASSWORD": "mysql_password",
"MYSQL_DATABASE": "mysql_database",
"MYSQL_SSL": "false",
"ALLOW_INSERT_OPERATION": "false",
"ALLOW_UPDATE_OPERATION": "false",
"ALLOW_DELETE_OPERATION": "false"
}
}
```
## 配置
### MCP客户端配置
在您的MCP客户端配置文件中添加以下配置:
```json
"mysql": {
"command": "node",
"args": [
"path_your_mcp_server/src/index.js"
],
"env": {
"MYSQL_HOST": "your_mysql_host",
"MYSQL_PORT": "3306",
"MYSQL_USER": "mysql_username",
"MYSQL_PASSWORD": "mysql_password",
"MYSQL_DATABASE": "mysql_database",
"MYSQL_SSL": "false",
"ALLOW_INSERT_OPERATION": "false",
"ALLOW_UPDATE_OPERATION": "false",
"ALLOW_DELETE_OPERATION": "false"
}
}
```
#### Claude Desktop配置示例
如果您使用Claude Desktop,请在以下位置创建或编辑配置文件:
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"mysql": {
"command": "node",
"args": [
"path_your_mcp_server/src/index.js"
],
"env": {
"MYSQL_HOST": "your_mysql_host",
"MYSQL_PORT": "3306",
"MYSQL_USER": "mysql_username",
"MYSQL_PASSWORD": "mysql_password",
"MYSQL_DATABASE": "mysql_database",
"MYSQL_SSL": "false",
"ALLOW_INSERT_OPERATION": "false",
"ALLOW_UPDATE_OPERATION": "false",
"ALLOW_DELETE_OPERATION": "false"
}
}
}
}
```
### 配置字段说明
- **`command`**: 要执行的命令(npx、node等)
- **`args`**: 命令参数数组
- **`"path_your_mcp_server/src/index.js"`**: 替换为实际MCP Server的绝对路径
- **`env`** (可选): 环境变量对象
- **`cwd`** (可选): 当前工作目录,仅在本地开发时需要
#### **环境变量说明:**
**数据库连接:**
- `MYSQL_HOST`: 数据库主机地址
- `MYSQL_PORT`: 数据库端口
- `MYSQL_USER`: 数据库用户名(必需)
- `MYSQL_PASSWORD`: 数据库密码(必需)
- `MYSQL_DATABASE`: 数据库名称(必需)
- `MYSQL_SSL`: 是否使用SSL连接
**权限控制变量(安全):**
- `ALLOW_INSERT_OPERATION`: 允许INSERT、CREATE TABLE等操作(默认:false)
- `ALLOW_UPDATE_OPERATION`: 允许UPDATE、ALTER TABLE等操作(默认:false)
- `ALLOW_DELETE_OPERATION`: 允许DELETE、DROP TABLE等操作(默认:false)
## 🛠️ 可用工具 (14个)
### 📊 基础查询工具
#### 1. mysql_query
执行自定义MySQL查询
**参数:**
- `query` (必需): SQL查询语句
- `host`, `port`, `user`, `password`, `database`, `ssl` (可选): 数据库连接参数
**示例:**
```sql
SELECT * FROM users WHERE age > 18 LIMIT 10
```
#### 2. mysql_show_tables
显示数据库中的所有表
**参数:** 连接参数(如果配置了环境变量则无需传递)
#### 3. mysql_describe_table
查看表的结构信息
**参数:**
- `table` (必需): 表名
- 其他连接参数(可选)
### 🗄️ 数据库管理工具
#### 4. mysql_show_databases
显示所有可用的数据库
**参数:** 连接参数(可选)
#### 5. mysql_table_info
获取表的详细统计信息
**参数:**
- `table` (必需): 表名
- 其他连接参数(可选)
**功能:** 显示表引擎、行数、数据大小、索引大小、创建时间等
#### 6. mysql_show_indexes
显示表的索引信息
**参数:**
- `table` (必需): 表名
- 其他连接参数(可选)
#### 7. mysql_show_processes
显示当前MySQL进程列表
**参数:** 连接参数(可选)
#### 8. mysql_database_size
获取数据库大小统计
**参数:** 连接参数(可选)
**功能:** 显示数据库总大小、表数量及各表大小排序
### 🔧 数据操作工具
#### 9. mysql_create_table
创建新表
**参数:**
- `table_name` (必需): 表名
- `schema` (必需): 表结构定义
- 其他连接参数(可选)
**权限要求:** `ALLOW_INSERT_OPERATION=true`
#### 10. mysql_insert_data
插入数据到表中
**参数:**
- `table` (必需): 表名
- `data` (必需): 数据对象(键值对)
- 其他连接参数(可选)
**权限要求:** `ALLOW_INSERT_OPERATION=true`
### 📈 性能分析工具
#### 11. mysql_explain_query
分析查询执行计划
**参数:**
- `query` (必需): 要分析的SQL查询
- `format` (可选): 输出格式 (`TRADITIONAL`, `JSON`, `TREE`)
- 其他连接参数(可选)
### 🕐 版本控制工具
#### 12. mysql_list_versions
列出版本历史记录
**参数:**
- `limit` (可选): 显示记录数量(默认:50)
- `session_only` (可选): 是否只显示当前会话(默认:true)
- `operation_type` (可选): 按操作类型过滤
- `target_table` (可选): 按目标表过滤
**示例输出:**
```
Version ID: 1
Timestamp: 2025-07-10 16:32:07.469221707
Operation: INSERT
Table: users
Affected Rows: 1
Description: INSERT operation: 1 row(s) inserted into users
```
#### 13. mysql_rollback_to_version
回滚到指定版本
**参数:**
- `version_id` (必需): 要回滚到的版本ID
- 其他连接参数(可选)
**支持的回滚操作:**
- **INSERT回滚**: 自动删除插入的数据
- **UPDATE回滚**: 恢复到修改前的原始状态
- **DELETE回滚**: 重新插入被删除的数据
- **CREATE_TABLE回滚**: 删除创建的表
- **DROP_TABLE回滚**: 重新创建表和数据
#### 14. mysql_clear_version_history
清理版本历史记录
**参数:**
- `confirm` (必需): 确认删除(必须为true)
- `session_only` (可选): 是否只清理当前会话(默认:true)
## 🛡️ 版本控制系统详解
### 自动备份策略
系统会根据操作类型智能创建备份:
- **DELETE操作**: 在删除前备份即将被删除的数据
- **UPDATE操作**: 在修改前备份原始数据
- **INSERT操作**: 记录插入的详细信息(ID范围等)
- **CREATE_TABLE操作**: 记录表创建信息
- **DROP_TABLE操作**: 备份完整的表结构和数据
### 版本历史存储
使用SQLite数据库存储版本历史:
```sql
CREATE TABLE version_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL, -- 会话隔离
timestamp TEXT NOT NULL, -- 微秒级时间戳
operation_type TEXT NOT NULL, -- 操作类型
target_table TEXT, -- 目标表
sql_query TEXT, -- 完整的SQL语句
backup_data TEXT, -- 备份数据(JSON格式)
affected_rows INTEGER, -- 影响行数
description TEXT -- 操作描述
);
```
### 精确回滚机制
- **DELETE回滚**: 使用INSERT语句重新插入被删除的数据
- **UPDATE回滚**: 使用UPDATE语句恢复到修改前的原始值
- **INSERT回滚**: 使用DELETE语句删除插入的数据
- **表操作回滚**: 重新创建或删除相应的表结构
## 使用示例
### 基础查询
```
使用mysql_query工具执行:
query: SELECT id, name, email FROM users WHERE status = 'active'
```
### 表管理
```
使用mysql_show_tables工具查看所有表
使用mysql_describe_table工具查看'users'表结构
使用mysql_table_info工具获取'users'表的详细统计
```
### 数据操作(需要权限)
```
使用mysql_insert_data工具插入数据:
table: users
data: {"name": "John Doe", "email": "john@example.com"}
```
### 版本控制
```
使用mysql_list_versions工具查看版本历史
使用mysql_rollback_to_version工具回滚:
version_id: 5
```
### 性能分析
```
使用mysql_explain_query工具分析查询:
query: SELECT * FROM users WHERE email = 'test@example.com'
format: JSON
```
## 输出格式
查询结果将以美观的ASCII表格格式显示:
```
┌────┬──────────┬─────────────────────┐
│ id │ name │ email │
├────┼──────────┼─────────────────────┤
│ 1 │ John Doe │ john@example.com │
│ 2 │ Jane Doe │ jane@example.com │
└────┴──────────┴─────────────────────┘
```
## 🔐 安全注意事项
### 权限控制
- 🔒 **默认只读模式**:所有写操作默认禁用
- ⚠️ **三级权限控制**:
- `ALLOW_INSERT_OPERATION=false`: 禁用INSERT、CREATE TABLE、CREATE DATABASE操作
- `ALLOW_UPDATE_OPERATION=false`: 禁用UPDATE、ALTER TABLE操作
- `ALLOW_DELETE_OPERATION=false`: 禁用DELETE、DROP TABLE、DROP DATABASE、TRUNCATE操作
### 数据安全
- 🔐 **数据库凭据安全**:数据库凭据通过环境变量管理,不会被持久化存储
- 🔒 **连接管理**:每次查询都会创建新的连接并在完成后关闭
- 🛡️ **版本控制保护**:所有增删改操作自动备份,支持精确回滚
- 📚 **操作记录**:完整记录所有SQL操作和时间戳
### 生产环境建议
- 🛡️ **保持权限控制为false**,或使用只读数据库用户
- 🚨 **谨慎开启写权限**:如需开启写权限,请谨慎设置对应环境变量为true
- 💾 **定期清理版本历史**:使用`mysql_clear_version_history`工具管理存储空间
- 🔍 **监控操作日志**:定期检查版本历史记录
## 系统要求
- Node.js >= 18.0.0
- MySQL 5.7+ 或 8.0+
- npm 或 yarn
## 依赖包
```json
{
"dependencies": {
"@modelcontextprotocol/sdk": "^0.6.0",
"mysql2": "^3.11.0",
"better-sqlite3": "^11.8.0"
}
}
```
## 故障排除
### 连接失败
- 检查MySQL服务是否运行
- 验证用户名、密码和数据库名称
- 确认主机和端口配置正确
- 检查防火墙设置
### 权限错误
- 确保MySQL用户具有访问指定数据库的权限
- 对于修改操作,确保用户具有相应的写权限
- 检查环境变量中的权限控制设置
### SSL连接问题
- 如果MySQL服务器要求SSL,请将`ssl`参数设置为`true`
- 检查MySQL服务器的SSL配置
### 版本控制问题
- 检查SQLite数据库文件`mysql_versions.db`是否可写
- 确保有足够的磁盘空间存储版本历史
- 如需重置版本历史,可删除`mysql_versions.db`文件
## 开发
### 本地开发
```bash
# 克隆项目
git clone https://github.com/csrts/MySQL_MCP_Server
cd MySQL_MCP_Server
# 安装依赖
npm install
```
### 版本控制数据库
版本控制系统使用SQLite数据库`mysql_versions.db`存储历史记录。该文件会在首次运行时自动创建。
## 许可证
MIT License
## 贡献
欢迎提交问题和PR!请确保您的代码符合项目的编码规范。
---
## 🎯 更新日志
### v2.0.0 - 企业级版本控制系统
- ✅ 新增 8个扩展MySQL工具
- ✅ 实现Git风格版本控制系统
- ✅ 新增 3个版本控制工具
- ✅ 智能备份与精确回滚功能
- ✅ 会话隔离和微秒级时间戳
- ✅ 完整SQL语句记录
- ✅ 企业级数据安全保障
### v1.0.0 - 基础功能
- ✅ 基础MySQL查询功能
- ✅ 权限控制系统
- ✅ 环境变量支持