多数据库MCP服务器
一种模型上下文协议(MCP)HTTP服务器,为MySQL和MSSQL数据库提供数据库查询工具,具有连接池、身份验证和速率限制。
特性
- 多数据库支持:连接MySQL和MSSQL数据库
- MCP协议:通过模型上下文协议公开数据库工具
- 连接池:高效的连接重用,以获得更好的性能
- 认证:承载令牌身份验证(可配置)
- 速率限制:内置速率限制以防止滥用
- 只读模式:可选只读模式以确保安全
- 行限制:每个查询可配置的最大行数
- 运输安全:DNS重新绑定保护和CORS支持
Python环境设置
先决条件
- python:3.9或更高版本
设置虚拟环境
创建虚拟环境(推荐):
# Navigate to the project directory
cd /path/to/multi-db-mcp
# Create virtual environment
python -m venv venv
# Activate
source venv/bin/activate验证激活:
# Should show (venv) prefix
python --version安装依赖项
# Upgrade pip first (recommended)
pip install --upgrade pip
# Install required packages
pip install -r requirements.txt
# Verify installation
pip list | grep -E "pymysql|mssql|starlette|mcp|uvicorn"______________________________________________________________________
运行服务器
uvicorn server:app --host 0.0.0.0 --port 8001服务安装
作为Linux服务运行(systemd)
- 创建systemd服务文件:
sudo nano /etc/systemd/system/multi-db-mcp.service- 添加以下内容:
[Unit]
Description=Multi-Database MCP Server
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/multi-db-mcp
Environment="PATH=/path/to/multi-db-mcp/venv/bin"
Environment="DB_SERVERS_CONFIG=/path/to/multi-db-mcp/db_servers.json"
Environment="DB_READ_ONLY=true"
ExecStart=/path/to/multi-db-mcp/venv/bin/uvicorn server:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target- 安装并启用该服务:
sudo chown -R www-data:www-data /path/to/multi-db-mcp
sudo systemctl daemon-reload
sudo systemctl enable multi-db-mcp
sudo systemctl start multi-db-mcp- 检查服务状态:
sudo systemctl status multi-db-mcp
sudo journalctl -u multi-db-mcp -f快速开始
1.配置数据库服务器
编辑 db_servers.json 要配置数据库连接,请执行以下操作:
{
"transport_security": {
"enable_dns_rebinding_protection": true,
"allowed_hosts": ["localhost:*", "127.0.0.1:*"],
"allowed_origins": ["http://localhost:*", "http://127.0.0.1:*"]
},
"servers": {
"main-mysql": {
"engine": "mysql",
"host": "your-mysql-host",
"port": 3306,
"user": "username",
"password": "password",
"allowed_databases": ["mydb"],
"allowed_tables": {
"mydb": ["users", "orders"]
},
"connect_timeout": 10
},
"main-mssql": {
"engine": "mssql",
"host": "your-mssql-host",
"port": 1433,
"user": "username",
"password": "password",
"allowed_databases": ["mydb"],
"encrypt": true,
"trust_server_certificate": false,
"connect_timeout": 10
}
}
}配置选项
| 选项 | 必填 | 说明 |
|---|---|---|
engine | 是 | 数据库引擎: mysql 或 mssql |
host | 是 | 数据库服务器主机名 |
port | 是 | 数据库服务器端口 |
user | 是 | 身份验证用户名 |
password | 是 | 身份验证密码 |
allowed_databases | 否 | 此服务器可以访问的数据库列表 |
allowed_tables | 否 | 将数据库名称映射到允许的表列表的对象。限制 preview_table 和 select_where 工具到特定表格。 |
connect_timeout | 否 | 连接超时(秒)(默认值:10) |
encrypt | 否 | 启用加密(仅限MSSQL) |
trust_server_certificate | 否 | 信任服务器证书(仅MSSQL) |
2.环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
DB_SERVERS_CONFIG | ./db_servers.json | 配置文件的路径 |
DB_READ_ONLY | true | 启用只读模式 |
DB_MAX_ROWS | 200 | 每个查询返回的最大行数 |
DB_POOL_MAX_CONNECTIONS | 10 | 每个池的最大连接数 |
DB_POOL_MIN_CONNECTIONS | 2 | 每个池的最小连接数 |
DB_POOL_RECYCLE_SECONDS | 3600 | 连接回收时间 |
MCP_BEARER_TOKEN | (无) | 用于身份验证的承载令牌 |
RATE_LIMIT_REQUESTS | 100 | 每个费率限制窗口的请求 |
RATE_LIMIT_WINDOW | 60 | 速率限制窗口(秒) |
可用的MCP工具
list_tables
列出数据库中的所有表。
参数:
db_server(可选):配置中的数据库服务器名称database(可选):数据库名称schema(可选):架构名称(对于MSSQL,默认为“dbo”)
describe_table
获取表的列信息。
参数:
table_name:表的名称db_server(可选):数据库服务器名称database(可选):数据库名称schema(可选):架构名称
run_query
执行SQL查询。
参数:
sql:要执行的SQL查询db_server(可选):数据库服务器名称database(可选):数据库名称
注: 在只读模式下,只允许SELECT/SHOW/DESCRIBE/EXPLAIN/WITH查询。
preview_table
预览表中的行。
参数:
table_name:表的名称limit(可选):行数(默认值:50,最大值:200)db_server(可选):数据库服务器名称database(可选):数据库名称
select_where
选择带有过滤器的行。
参数:
table_name:表的名称filters:列字典=值过滤器limit(可选):行数(默认值:50,最大值:200)db_server(可选):数据库服务器名称database(可选):数据库名称
list_columns
列出表的列。
参数:
table_name:表的名称db_server(可选):数据库服务器名称database(可选):数据库名称schema(可选):架构名称
get_current_database
从请求标头中获取默认的db_server和数据库。
API终点
| 端点 | 描述 |
|---|---|
GET / | 健康检查-返回服务器状态 |
GET /health | 使用服务器配置进行详细的健康检查 |
POST / | MCP协议端点 |
认证
当 MCP_BEARER_TOKEN 已设置,除外的所有端点 / 和 /health 需要一个Bearer令牌:
curl -H "Authorization: Bearer your-token" http://localhost:8001/health安全考虑
- 始终使用强承载令牌(至少10个字符)
- 确保凭据安全,永远不要承诺版本控制
- 对数据库连接使用SSL/TLS加密
- 考虑在生产环境中使用只读模式
- 为您的用例配置适当的速率限制
数据库用户安全
专用数据库用户
强烈建议专门为MCP服务器创建专用数据库用户,而不是使用现有的应用程序或管理帐户。这些专用用户应该具有服务器功能所需的最小权限。
MySQL权限
对于MySQL数据库,建议使用以下最低权限:
-- Grant only necessary permissions
GRANT SELECT, SHOW VIEW, EXECUTE ON your_database.* TO 'mcp_user'@'host';所需权限:
SELECT-从表中读取数据所需SHOW VIEW-必需的list_tables工具正常工作EXECUTE-如果使用存储过程,则需要
MSSQL权限
对于MSSQL数据库,建议使用以下最低权限:
-- Create a user with only necessary permissions
USE your_database;
CREATE USER 'mcp_user' FOR LOGIN 'mcp_login';
GRANT SELECT ON SCHEMA::dbo TO 'mcp_user';所需权限:
SELECT关于相关模式-从表中读取数据时需要
附加安全措施
- 如果可能,为每个数据库创建单独的用户
- 限制主机访问(
'mcp_user'@'localhost'或特定IP) - 为每个数据库用户使用强而唯一的密码
- 定期审核用户权限
- 考虑使用数据库角色进行权限管理
输入安全免责声明
MCP服务器包括试图防止恶意代码执行的措施,包括:
- 查询清理
- 只读模式强制
- 速率限制
然而, 最终,用户有责任确保提供给数据库查询的所有输入都是安全的并经过适当验证。服务器无法保证对所有形式的SQL注入或可能由复杂攻击者精心设计的恶意输入提供保护。在通过MCP服务器发送查询之前,始终在客户端验证和净化输入,特别是在接受用户生成的内容时。
项目结构
multi-db-mcp/
├── server.py # Main HTTP server entry point
├── tools.py # MCP tool definitions
├── db.py # Database connections and helpers
├── config.py # Configuration loading
├── middleware.py # Auth and rate limiting
├── db_servers.json # Database configuration
└── README.md # This file许可证
MIT许可证-有关详细信息,请参阅许可证文件。
