多数据库查询服务

一个基于MCP协议的HTTP服务器,提供MySQL和MSSQL数据库的查询工具,支持连接池、认证和速率限制。

  • by MdwebbSE
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 MdwebbSE/multi-db-mcp

使用说明

多数据库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)

  1. 创建systemd服务文件:

    sudo nano /etc/systemd/system/multi-db-mcp.service
    
  2. 添加以下内容:

    [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
    
  3. 安装并启用该服务:

    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
    
  4. 检查服务状态:

    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许可证-有关详细信息,请参阅许可证文件。