安全MySQL MCP服务器
English | 中文
一个安全的MySQL模型上下文协议(MCP)服务器,具有可配置的AI数据库操作权限控制。
✨ 特性
- 🔒 权限控制:可配置的SQL类型分配列表、表模式分配列表和数据库限制
- 🎯 基于模式的表访问:支持glob模式,如
open_*对于表权限 - 👁️ 只读模式:默认只读,带有启用写入操作的选项
- 🛡️ 多语句保护:默认情况下不允许危险的多语句查询
- 🧩 多源支持:配置多个MySQL源(不同的主机/用户/默认数据库/权限),并通过以下方式进行选择
source - 🔧 标准MCP工具:查询执行、数据库列表、带模式的表列表、表结构
🚀 快速开始
先决条件
- Node.js>=18.0.0
- MySQL>=8.0
安装
# Clone the repository
git clone https://github.com/lmaonewhow/mysql-mcp-server-secure.git
cd mysql-mcp-server-secure
# Install dependencies
npm install
# Build project
npm run build配置
环境变量
数据库连接
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
DB_HOST | MySQL服务器主机 | 127.0.0.1 | 没有 |
DB_PORT | MySQL服务器端口 | 3306 | 没有 |
DB_USER | MySQL用户名 | root | 没有 |
DB_PASSWORD | MySQL密码 | - | 是 |
DB_NAME | 默认数据库名称 | - | 否 |
多源(可选)
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
MYSQL_SOURCES | JSON对象映射 sourceName -> sourceConfig | - | 没有 |
DEFAULT_SOURCE | 默认源名称 source 未提供 | 已配置源的第一个密钥或 default | 没有 |
TEST_ALL_SOURCES | 启动时测试所有来源 | false | 没有 |
权限配置
| 变量 | 描述 | 默认值 |
|---|---|---|
READ_ONLY | 只允许SELECT查询 | true |
ALLOWED_SQL_TYPES | 允许使用逗号分隔的SQL类型 | SELECT |
TABLE_PATTERNS | 逗号分隔的表名模式 | * (所有表格) |
ALLOWED_DATABASES | 逗号分隔的数据库名称 | * (所有数据库) |
ALLOW_MULTI_STATEMENT | 允许在一个查询中使用多个语句 | false |
如果 MYSQL_SOURCES 如果提供,每个源都可以独立覆盖权限。配置文件(建议用于多源)
创建 ./.mysql-mcp-server-secure/config.json (相对于MCP服务器进程工作目录)。您还可以设置 MYSQL_MCP_CONFIG_PATH 一条明确的路径。
支持的格式:
- 明确的
sources对象:
{
"defaultSource": "prod",
"sources": {
"prod": {
"connection": {
"host": "127.0.0.1",
"port": 3306,
"user": "readonly",
"password": "***",
"database": "production_db"
},
"permissions": {
"readOnly": true,
"allowedSqlTypes": ["SELECT"],
"allowedDatabases": ["production_db"],
"tablePatterns": ["open_*"],
"allowMultiStatement": false
}
}
}
}- 顶级来源(更简洁):
{
"defaultSource": "prod",
"prod": {
"host": "127.0.0.1",
"port": 3306,
"user": "readonly",
"password": "***",
"database": "production_db",
"permissions": {
"readOnly": true,
"allowedSqlTypes": ["SELECT"],
"allowedDatabases": ["production_db"],
"tablePatterns": ["open_*"],
"allowMultiStatement": false
}
}
}当两者都提供时,合并/覆盖顺序:
- 首先加载配置文件源
MYSQL_SOURCES(env)覆盖同名源
与Windsurf一起使用
增添 .windsurf/mcp.json:
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["/path/to/mysql-mcp-server-secure/dist/index.js"],
"env": {
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_USER": "your_username",
"DB_PASSWORD": "your_secure_password",
"DB_NAME": "your_database",
"READ_ONLY": "true",
"TABLE_PATTERNS": "table_prefix_*,another_table_*",
"ALLOWED_DATABASES": "your_database"
}
}
}
}⚠️ 安全通知:用实际配置替换所有占位符值。切勿提交包含真实凭据的文件。
多源示例(Windsurf)
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["/path/to/mysql-mcp-server-secure/dist/index.js"],
"env": {
"DEFAULT_SOURCE": "prod",
"MYSQL_SOURCES": "{\"prod\":{\"host\":\"127.0.0.1\",\"port\":3306,\"user\":\"readonly\",\"password\":\"***\",\"database\":\"production_db\",\"permissions\":{\"readOnly\":true,\"allowedSqlTypes\":[\"SELECT\"],\"allowedDatabases\":[\"production_db\"],\"tablePatterns\":[\"open_*\"],\"allowMultiStatement\":false}},\"analytics\":{\"host\":\"127.0.0.1\",\"port\":3306,\"user\":\"analyst\",\"password\":\"***\",\"database\":\"analytics_db\",\"permissions\":{\"readOnly\":true,\"allowedSqlTypes\":[\"SELECT\",\"SHOW\"],\"allowedDatabases\":[\"analytics_db\"],\"tablePatterns\":[\"*\"],\"allowMultiStatement\":false}}}"
}
}
}
}🛠️ 可用工具
mysql_query
使用权限验证执行MySQL查询。
参数:
source(可选):源名称(使用DEFAULT_SOURCE/config.jsondefaultSource如果未指定)sql(必填):要执行的SQL查询database(可选):目标数据库
mysql_databases
列出所有可访问的数据库(按筛选 ALLOWED_DATABASES).
参数:
source(可选):源名称
mysql_tables
列出数据库中具有可选模式筛选的表。
参数:
source(可选):源名称database(可选):数据库名称(使用DB_NAME如果未指定)pattern(可选):用于过滤表的Glob模式(例如。,open_*)
mysql_describe
描述带有权限检查的表结构。
参数:
source(可选):源名称table(必填):表名database(可选):数据库名称
mysql_sources
列出已配置的源和默认源。
mysql_get_permissions
获取当前权限配置。
参数:
source(可选):源名称
📋 配置示例
对特定表的只读访问
READ_ONLY=true
TABLE_PATTERNS=open_*,user_*
ALLOWED_DATABASES=production_db选择性写入权限
READ_ONLY=false
ALLOWED_SQL_TYPES=SELECT,INSERT,UPDATE,DELETE
TABLE_PATTERNS=open_*,log_*
ALLOWED_DATABASES=production_db,analytics_db🔒 安全最佳实践
- 始终使用READ_ONLY=true 用于生产AI访问
- 限制表位 仅限所需表格
- 设置允许的数据库 限制数据库访问
- 保持ALLOW_MULTI_STATE=false 防止注射攻击
- 使用强数据库密码 并限制MySQL用户权限
- 定期审计 这
ALLOWED_SQL_TYPES配置
📝 许可证
MIT许可证-请参阅 许可证 文件以获取详细信息。
______________________________________________________________________
安全MySQL MCP服务器
中文 | English
一个安全的 MySQL Model Context Protocol (MCP) 服务器,为 AI 数据库操作提供可配置的权限控制。
✨ 特性
- 🔒 权限控制: 可配置的 SQL 类型白名单、表名模式白名单和数据库限制
- 🎯 基于模式的表访问: 支持
open_*等 glob 模式进行表权限控制 - 👁️ 只读模式: 默认只读,可选启用写入操作
- 🛡️ 多语句保护: 默认禁止危险的多语句查询
- 🧩 多数据源支持: 支持配置多个 MySQL 数据源(不同 host/user/默认库/权限),并通过
source选择 - 🔧 标准 MCP 工具: 查询执行、数据库列表、带模式的表列表、表结构查询
🚀 快速开始
环境要求
- Node.js>=18.0.0
- MySQL>=8.0
安装
# 克隆仓库
git clone https://github.com/lmaonewhow/mysql-mcp-server-secure.git
cd mysql-mcp-server-secure
# 安装依赖
npm install
# 构建项目
npm run build配置
环境变量
数据库连接
| 变量 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
DB_HOST | MySQL 服务器地址 | 127.0.0.1 | 否 |
DB_PORT | MySQL 服务器端口 | 3306 | 否 |
DB_USER | MySQL 用户名 | root | 否 |
DB_PASSWORD | MySQL 密码 | - | 是 |
DB_NAME | 默认数据库名 | - | 否 |
多数据源(可选)
| 变量 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
MYSQL_SOURCES | JSON 对象:sourceName -> sourceConfig | - | 否 |
DEFAULT_SOURCE | 未提供 source 时使用的数据源名 | 已配置 sources 的第一个 key 或 default | 否 |
TEST_ALL_SOURCES | 启动时测试所有数据源连接 | false | 否 |
权限配置
| 变量 | 描述 | 默认值 |
|---|---|---|
READ_ONLY | 仅允许 SELECT 查询 | true |
ALLOWED_SQL_TYPES | 逗号分隔的允许 SQL 类型 | SELECT |
TABLE_PATTERNS | 逗号分隔的表名模式 | * (所有表) |
ALLOWED_DATABASES | 逗号分隔的数据库名 | * (所有数据库) |
ALLOW_MULTI_STATEMENT | 允许单个查询中包含多语句 | false |
如果提供了 MYSQL_SOURCES,每个 source 都可以单独覆盖权限配置。配置文件(推荐用于多数据源)
在工作目录下创建 ./.mysql-mcp-server-secure/config.json(相对于 MCP server 进程的 working directory)。也可以通过环境变量 MYSQL_MCP_CONFIG_PATH 指定绝对路径。
支持两种格式:
1)显式 sources:
{
"defaultSource": "prod",
"sources": {
"prod": {
"connection": {
"host": "127.0.0.1",
"port": 3306,
"user": "readonly",
"password": "***",
"database": "production_db"
},
"permissions": {
"readOnly": true,
"allowedSqlTypes": ["SELECT"],
"allowedDatabases": ["production_db"],
"tablePatterns": ["open_*"],
"allowMultiStatement": false
}
}
}
}2)顶层直接写 sources(更简洁):
{
"defaultSource": "prod",
"prod": {
"host": "127.0.0.1",
"port": 3306,
"user": "readonly",
"password": "***",
"database": "production_db",
"permissions": {
"readOnly": true,
"allowedSqlTypes": ["SELECT"],
"allowedDatabases": ["production_db"],
"tablePatterns": ["open_*"],
"allowMultiStatement": false
}
}
}当同时提供配置文件与 MYSQL_SOURCES(env)时,合并/覆盖顺序:
- 先加载配置文件 sources
MYSQL_SOURCES(env)对同名 source 覆盖
Windsurf 集成
在 .windsurf/mcp.json 中添加配置:
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["/path/to/mysql-mcp-server-secure/dist/index.js"],
"env": {
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_USER": "your_username",
"DB_PASSWORD": "your_secure_password",
"DB_NAME": "your_database",
"READ_ONLY": "true",
"TABLE_PATTERNS": "table_prefix_*,another_table_*",
"ALLOWED_DATABASES": "your_database"
}
}
}
}⚠️ 安全提示: 请将所有占位符值替换为实际配置。切勿提交包含真实凭证的文件。
多数据源示例(Windsurf)
{
"mcpServers": {
"mysql": {
"command": "node",
"args": ["/path/to/mysql-mcp-server-secure/dist/index.js"],
"env": {
"DEFAULT_SOURCE": "prod",
"MYSQL_SOURCES": "{\"prod\":{\"host\":\"127.0.0.1\",\"port\":3306,\"user\":\"readonly\",\"password\":\"***\",\"database\":\"production_db\",\"permissions\":{\"readOnly\":true,\"allowedSqlTypes\":[\"SELECT\"],\"allowedDatabases\":[\"production_db\"],\"tablePatterns\":[\"open_*\"],\"allowMultiStatement\":false}},\"analytics\":{\"host\":\"127.0.0.1\",\"port\":3306,\"user\":\"analyst\",\"password\":\"***\",\"database\":\"analytics_db\",\"permissions\":{\"readOnly\":true,\"allowedSqlTypes\":[\"SELECT\",\"SHOW\"],\"allowedDatabases\":[\"analytics_db\"],\"tablePatterns\":[\"*\"],\"allowMultiStatement\":false}}}"
}
}
}
}🛠️ 可用工具
mysql_query
执行带权限验证的 MySQL 查询。
参数:
source(可选): 数据源名(未指定时使用DEFAULT_SOURCE/ config.json 的defaultSource)sql(必填): 要执行的 SQL 查询database(可选): 目标数据库
mysql_databases
列出所有可访问的数据库(受 ALLOWED_DATABASES 过滤)。
参数:
source(可选): 数据源名
mysql_tables
列出数据库中的表,支持可选的模式过滤。
参数:
source(可选): 数据源名database(可选): 数据库名(未指定时使用DB_NAME)pattern(可选): 用于过滤表的 glob 模式(如open_*)
mysql_describe
描述表结构并进行权限检查。
参数:
source(可选): 数据源名table(必填): 表名database(可选): 数据库名
mysql_get_permissions
获取当前权限配置。
参数:
source(可选): 数据源名
mysql_sources
列出已配置的数据源以及默认 source。
📋 配置示例
特定表的只读访问
READ_ONLY=true
TABLE_PATTERNS=open_*,user_*
ALLOWED_DATABASES=production_db选择性写入权限
READ_ONLY=false
ALLOWED_SQL_TYPES=SELECT,INSERT,UPDATE,DELETE
TABLE_PATTERNS=open_*,log_*
ALLOWED_DATABASES=production_db,analytics_db🔒 安全最佳实践
- 始终在生产环境使用 READ_ONLY=true 用于 AI 访问
- 限制 TABLE_PATTERNS 仅包含必需的表
- 设置 ALLOWED_DATABASES 限制数据库访问范围
- 保持 ALLOW_MULTI_STATEMENT=false 防止注入攻击
- 使用强数据库密码 并限制 MySQL 用户权限
- 定期审计
ALLOWED_SQL_TYPES配置
📝 许可证
MIT 许可证 - 详见 许可证 文件。
