该项目是一个基于MCP框架的MySQL查询服务器,通过SSE协议支持实时数据库操作,并具有全面的安全性、日志记录、配置以及敏感信息保护机制。适用于开发、测试和生产环境中的安全MySQL数据访问。
该项目是一个基于MCP框架的MySQL查询服务器,通过SSE协议支持实时数据库操作。它具备全面的安全性、日志记录、配置以及敏感信息保护机制,适用于开发、测试和生产环境中的安全MySQL数据访问。
# 拉取镜像
docker pull mangooer/mysql-mcp-server-sse:latest
# 运行容器
docker run -d \
--name mysql-mcp-server-sse \
-e HOST=0.0.0.0 \
-e PORT=3000 \
-e MYSQL_HOST=your_mysql_host \
-e MYSQL_PORT=3306 \
-e MYSQL_USER=your_mysql_user \
-e MYSQL_PASSWORD=your_mysql_password \
-e MYSQL_DATABASE=your_database \
-p 3000:3000 \
mangooer/mysql-mcp-server-sse:latest
Windows PowerShell 格式:
docker run -d `
--name mysql-mcp-server-sse `
-e HOST=0.0.0.0 `
-e PORT= 3000 `
-e MYSQL_HOST=your_mysql_host `
-e MYSQL_PORT=3306 `
-e MYSQL_USER=your_mysql_user `
-e MYSQL_PASSWORD=your_mysql_password `
-e MYSQL_DATABASE=your_database `
-p 3000:3000 `
mangooer/mysql-mcp-server-sse:latest
pip install -r requirements.txt
复制 .env.example 为 .env 并根据实际情况进行修改。
复制 .env.example 到 .env 并按需修改。
python -m src.server
默认监听:http://127.0.0.1:3000/sse 默认端点:http://127.0.0.1:3000/sse
.
├── src/
│ ├── server.py # 主服务器入口 / 主服务器入口
│ ├── config.py # 配置项定义 / 配置项定义
│ ├── validators.py # 参数校验 / 参数校验
│ ├── db/
│ │ └── mysql_operations.py # 数据库操作 / 数据库操作
│ ├── security/
│ │ ├── interceptor.py # SQL拦截 / SQL拦截
│ │ ├── query_limiter.py # 风险控制 / 风险控制
│ │ └── sql_analyzer.py # SQL分析 / SQL分析
│ └── tools/
│ ├── mysql_tool.py # 基础查询 / 基础查询
│ ├── mysql_metadata_tool.py # 元数据查询 / 元数据查询
│ ├── mysql_info_tool.py # 信息查询 / 信息查询
│ ├── mysql_schema_tool.py # 结构查询 / 结构查询
│ └── metadata_base_tool.py # 工具基类 / 工具基类
├── tests/ # 测试 / 测试
├── .env.example # 环境变量示例 / 环境变量示例
└── requirements.txt # 依赖 / 依赖
| 变量名称 | 描述 | 默认值/默认值 |
|---|---|---|
| HOST | 服务器监听地址/服务器监听地址 | 127.0.0.1 |
| PORT | 服务器监听端口/服务器监听端口 | 3000 |
| MYSQL_HOST | MySQL 服务器地址/MySQL 服务器主机 | localhost |
| MYSQL_PORT | MySQL 服务器端口/MySQL 服务器端口 | 3306 |
| MYSQL_USER | MySQL 用户名/MySQL 用户名 | root |
| MYSQL_PASSWORD | MySQL 密码/MySQL 密码 | (空/空) |
| MYSQL_DATABASE | 要连接的数据库名/数据库名 | (空/空) |
| DB_TIMEOUT | 连接超时时间(秒)/连接超时时间(秒) | 5 |
| DB_AUTH_PLUGIN | 认证插件类型/认证插件类型 | mysql_native_password |
| DB_POOL_ENABLED | 是否启用连接池/是否启用连接池(真/假) | true |
| DB_POOL_MIN_SIZE | 连接池中最小连接数/池最小大小 | 5 |
| DB_POOL_MAX_SIZE | 连接池中最大连接数/池最大大小 | 20 |
| DB_POOL_RECYCLE | 连接回收时间(秒)/池回收时间(秒) | 300 |
| DB_POOL_MAX_LIFETIME | 最大连接生命周期(秒,0=不限)/最大生命周期(秒) | 0 |
| DB_POOL_ACQUIRE_TIMEOUT | 获取连接超时时间(秒)/获取超时时间(秒) | 10.0 |
| ENV_TYPE | 环境类型(开发/生产)/环境类型 | 开发 |
| ALLOWED_RISK_LEVELS | 允许的风险级别(逗号分隔)/允许的风险级别 | LOW, MEDIUM |
| ALLOW_SENSITIVE_INFO | 允许查询敏感字段/允许敏感信息(真/假) | false |
| SENSITIVE_INFO_FIELDS | 自定义敏感字段模式(逗号分隔)/自定义敏感字段 | (空/空) |
| MAX_SQL_LENGTH | 最大SQL语句长度/最大SQL长度 | 5000 |
| BLOCKED_PATTERNS | 被阻止的SQL模式(逗号分隔)/被阻止的SQL模式 | (空/空) |
| ENABLE_QUERY_CHECK | 启用查询安全检查/启用查询检查(真/假) | true |
| ENABLE_DATABASE_ISOLATION | 启用数据库隔离(真/假) | false |
| DATABASE_ACCESS_LEVEL | 数据库访问级别(严格/受限/许可) | 许可 |
| LOG_LEVEL | 日志级别(调试/信息/...)/日志级别 | 调试 |
注意:某些MySQL云服务需要指定
DB_AUTH_PLUGIN为mysql_native_password。
本系统完全支持MySQL 8.0的认证机制。默认使用caching_sha2_password认证插件以提供更高的安全性。
本系统完全支持MySQL 8.0的认证机制。默认使用caching_sha2_password认证插件以增强安全性。
| 认证插件/插件 | 安全性 | 兼容性 | 依赖需求/依赖 |
|---|---|---|---|
mysql_native_password | 中等 | 高/高 | 无/无 |
caching_sha2_password | 高 | 中等 | 加密 |
生产环境/生产(推荐):
DB_AUTH_PLUGIN=caching_sha2_password
开发环境/开发(简化配置):
DB_AUTH_PLUGIN=mysql_native_password
使用caching_sha2_password需要安装cryptography包(已包含在requirements.txt中):
当使用caching_sha2_password时,需要cryptography包(已包含在requirements.txt中):
pip install cryptography
本系统提供了强大的数据库隔离功能,防止跨数据库访问并确保数据安全。
本系统提供了强大的数据库隔离功能,防止跨数据库访问并确保数据安全。
| 级别 | 允许访问 | 适用场景/使用案例 |
|---|---|---|
| 严格 | 仅指定数据库 | 生产环境/生产 |
| 受限 | 指定数据库+系统库/指定+系统数据库 | 开发环境/开发 |
| 许可 | 所有数据库 | 测试环境/测试 |
# Docker 启用严格模式 / Docker 使用严格模式
docker run -d \
-e MYSQL_DATABASE=your_database \
-e ENABLE_DATABASE_ISOLATION=true \
-e DATABASE_ACCESS_LEVEL=strict \
mangooer/mysql-mcp-server-sse:latest
# 生产环境自动启用 / 生产环境自动启用
docker run -d \
-e ENV_TYPE=production \
-e MYSQL_DATABASE=your_database \
mangooer/mysql-mcp-server-sse:latest
安全效果:
SHOW DATABASES / 阻止 SHOW DATABASESSELECT * FROM mysql.user / 阻止 SELECT * FROM mysql.userSHOW TABLES FROM other_db / 阻止 SHOW TABLES FROM other_db🔒 重要:生产环境(
ENV_TYPE=production)自动启用数据库隔离,使用受限模式。🔒 重要:生产环境(
ENV_TYPE=production)自动启用数据库隔离,使用受限模式。
src/tools/目录下实现register_xxx_tool(s)函数即可。src/tools/目录下实现一个register_xxx_tool(s)函数。多级SQL风险等级(低/中/高/严重)
SQL注入和危险操作拦截
WHERE子句强制检查
数据库隔离安全:三级访问控制(严格/受限/许可)
跨数据库访问保护:阻止未经授权的数据库访问
敏感信息自动隐藏(支持自定义字段)
生产环境默认只允许低风险操作
生产环境自动启用数据库隔离
多级SQL风险等级(低/中/高/严重)
SQL注入及危险操作拦截
强制WHERE子句检查
数据库隔离安全:三级访问控制(严格/受限/许可)
跨数据库访问保护:阻止未经授权的数据库访问
自动敏感信息屏蔽(自定义字段)
生产环境默认只允许低风险操作
生产环境自动启用数据库隔离
可配置的日志级别(LOG_LEVEL)
控制台和文件日志输出
详细的操作状态和错误记录
全面的异常捕获和事务回滚
可配置的日志级别(LOG_LEVEL)
控制台及文件日志输出
详细运行状态及错误日志
强大的异常捕获及事务回滚
A: 检查是否有WHERE条件。如果没有WHERE,被认为是高风险且需要在ALLOWED_RISK_LEVELS中允许CRITICAL。
Q: 为什么DELETE不起作用? A: 检查WHERE子句。没有WHERE的DELETE是高风险(严重),必须在ALLOWED_RISK_LEVELS中允许。
A: 设置 SENSITIVE_INFO_FIELDS,如 SENSITIVE_INFO_FIELDS=password,token
Q: 如何自定义敏感字段? A: 设置 SENSITIVE_INFO_FIELDS,例如 SENSITIVE_INFO_FIELDS=password,token
A: 设置 ENABLE_DATABASE_ISOLATION=true 和 DATABASE_ACCESS_LEVEL=strict,或者使用 ENV_TYPE=production 自动启用。
Q: 如何启用数据库隔离? A: 设置 ENABLE_DATABASE_ISOLATION=true 和 DATABASE_ACCESS_LEVEL=strict,或者使用 ENV_TYPE=production 自动启用。
A: 严格模式禁止系统表访问,可以改为受限模式或确认是否确实需要访问系统表。
Q: 启用数据库隔离后无法查询系统表? A: 严格模式阻止系统表访问。使用受限模式或验证是否确实需要访问系统表。
A: limit 必须是非负整数。
Q: limit 参数错误? A: limit 必须是非负整数。
欢迎通过Issue和Pull Request参与改进。 欢迎通过Issue和Pull Request贡献。
MIT 许可证
本软件“按原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有者均不对因本软件、或与本软件的使用或其他交易有关的任何索赔、损害或其他责任负责,无论是合同诉讼、侵权还是其他。 软件“按原样”提供,没有任何形式的保证,无论是明示的还是默示的,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有者均不对因本软件或与本软件的使用或其他交易有关的任何索赔、损害或其他责任负责,无论是合同诉讼、侵权还是其他。