这是一个用Python实现的MCP(模型上下文协议)服务器,它安全地向LLM客户端暴露SQL Server数据库的功能。
cd mssql-mcp-python
pip install -r requirements.txt
# 或者:
uv sync
创建.env文件:
# 对于本地SQL Server(Linux/Docker)
export MSSQL_CONNECTION_STRING="Driver={ODBC Driver 17 for SQL Server};Server=localhost,1433;Database=master;UID=sa;PWD=YourPassword123"
# 或对于Windows认证
export MSSQL_CONNECTION_STRING="Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=master;Trusted_Connection=yes"
# 使用stdio传输(适用于MCP客户端)
python -m mssql_mcp.cli
# 使用自定义设置
MSSQL_QUERY_TIMEOUT=60 READ_ONLY=true python -m mssql_mcp.cli --log-level DEBUG
# 或使用HTTP传输
python -m mssql_mcp.cli --transport http --bind 0.0.0.0:8080
# 构建并运行
docker build -t mssql-mcp:latest .
docker run -e MSSQL_CONNECTION_STRING="..." mssql-mcp:latest
# 健康检查
curl http://localhost:8080/health
# 准备就绪检查
curl http://localhost:8080/ready
# 服务器信息
curl http://localhost:8080/info
# Prometheus指标
curl http://localhost:8080/metrics
该服务器向MCP客户端提供以下工具:
execute_sql(sql, format="table")执行SELECT查询(或启用写操作)
输入:"SELECT * FROM users LIMIT 10"
输出:ASCII表或JSON
list_schemas()列出所有数据库模式
输入:无
输出:模式名称列表
list_tables(schema, limit=200)列出带有可选模式过滤器的表
输入:schema="dbo", limit=100
输出:带有元数据的表列表
schema_discovery(schema)获取完整的模式元数据(表、列、类型)
输入:schema="dbo"
输出:带有详细列信息的JSON
get_database_info()获取服务器/数据库元数据
输入:无
输出:数据库名称、版本、机器名称
get_policy_info()获取当前的安全策略设置
输入:无
输出:策略详情(允许的操作、限制)
check_db_connection()数据库连接健康检查
输入:无
输出:连接状态
✅ 默认只读
ENABLE_WRITES=true+ADMIN_CONFIRM令牌✅ 防止SQL注入
✅ 敏感数据保护
✅ 资源限制
✅ 审计跟踪
在GET /metrics(HTTP模式)可用:
mssql_queries_executed_total — 按工具和状态的总查询数mssql_queries_blocked_total — 按原因阻止的查询数mssql_query_duration_seconds — 查询延迟直方图mssql_query_rows_returned — 结果集大小直方图mssql_active_queries — 当前正在执行的查询mssql_server_ready — 服务器准备情况(0/1)所有日志以JSON格式(当LOG_FORMAT=json时):
{
"timestamp": "2024-01-15T10:30:00.123456",
"level": "INFO",
"logger": "mssql_mcp.tools",
"message": "查询被允许",
"module": "tools",
"function": "execute_sql",
"line": 42
}
GET /health — 生存探测(总是返回200)GET /ready — 准备就绪探测(如果数据库已连接则返回200)LOG_LEVEL=DEBUG python -m mssql_mcp.cli
ENABLE_WRITES=true ADMIN_CONFIRM=secret python -m mssql_mcp.cli
MSSQL_QUERY_TIMEOUT=120 python -m mssql_mcp.cli
python -m mssql_mcp.cli --transport http --bind 127.0.0.1:8080
python -m mssql_mcp.cli --transport http --bind 127.0.0.1:8081 # 不同端口