使用说明
SQL Server MCP
用于Microsoft SQL server的安全模型上下文协议(MCP)服务器,提供具有全面保护层的安全只读数据库访问。
特性
- 只读查询执行 -使用自动分页支持执行SELECT查询
- SQL脚本审查 -通过42个自动最佳实践检查和风险评分进行全面分析
- 架构发现 -以令牌高效格式获取数据库元数据(表、列、类型)
- 执行计划分析 -检索和分析SQL Server查询执行计划
- 多环境支持 -在Int、Stg和Prd环境之间切换
- 最佳实践引擎 -访问50条DBA定义的SQL Server最佳实践规则
MCP如何保护数据库
MCP实施 多层保护 在这两个 SQL Server(数据库)级别 和那个 MCP(应用程序)级别:
数据库级保护(SQL Server查询提示)
这些保护措施得到了执行 直接通过SQL Server 通过自动注入到每个查询中的查询提示:
-
CPU控制(MAXDOP) -限制每个查询的CPU并行度:
- 生产:
MAXDOP 1(单线程,使用1个CPU核) - 暂存:
MAXDOP 2(有限的并行性) - 发展:
MAXDOP 4(允许并行) - 防止:消耗所有CPU核心的单个查询
- 生产:
-
内存控制(MAX_GRANT_PERCENT) -限制每个查询的内存分配:
- 生产:
MAX_GRANT_PERCENT = 10(可用查询内存的10%) - 暂存:
MAX_GRANT_PERCENT = 25(25%的可用查询内存) - 发展:
MAX_GRANT_PERCENT = 50(可用查询内存的50%) - 防止:单个查询消耗了过多的SQL Server内存
- 生产:
-
防锁(NOLOCK) -防止生产中的读取阻塞:
- 自动添加
WITH (NOLOCK)所有表引用的提示 - 仅生产:防止查询阻止写入操作
- 可配置的:可以根据环境启用/禁用
- 自动添加
-
查询执行超时 -强制最长查询执行时间:
- 默认值:60秒(Int:120秒,Stg:90秒,Prd:30秒,最大值:300秒)
- 通过ODBC连接超时设置(MCP设置该值)
- SQL Server会自动取消超过超时的查询
- 防止:长时间运行的查询会无限期地消耗资源
它是如何工作的:
- 查询提示(MAXDOP、MAX_GRANT_PERCENT、NOLOCK):MCP会自动附加
OPTION (MAXDOP n, MAX_GRANT_PERCENT = x)或WITH (NOLOCK)查询。SQL Server在查询执行期间强制执行这些限制。 - 查询超时:MCP通过ODBC连接属性设置超时值。SQL Server通过自动取消超过超时的查询来强制执行它。
MCP级别保护(应用级别限制)
这些保护措施得到了执行 通过MCP应用程序 在查询执行之前和期间:
-
并发限制 -限制每个环境和用户的并发查询:
- 每个环境最多5个并发查询
- 每个用户最多2个并发查询
- 防止:太多同时进行的查询导致资源耗尽
-
AST验证 -使用SQL解析的严格只读强制:
- 阻止INSERT、UPDATE、DELETE、DDL操作
- 阻止多语句批处理
- 防止:意外或恶意写入操作
-
查询成本检查 -在执行前阻止昂贵的查询:
- 分析SQL Server执行计划成本(估计CPU、I/O、内存)
- 默认阈值:50(Int:100,Stg:50,Prd:10)
- 防止:CPU密集型查询无法运行
-
结果集大小限制 -防止大型结果集:
- 有效载荷大小限制:每个查询结果默认1MB(可配置)
- 行限制:默认1000行(整数:10000,标准:5000,标准:500)
- 批量抓取:用途
fetchmany而不是fetchall控制内存 - 自动截断:截断大文本值(>1000个字符)
- 防止:MCP应用程序内存消耗过多
-
允许的数据库 -可查询的数据库的可选白名单
- 防止:访问未经授权的数据库
附加MCP保护:
- 链接服务器阻止 -使用OPENQUERY、OPENDATASOURCE、OPENROWSET和四个部分名称检测和阻止查询
- 连接池 -具有可配置池大小的高效连接管理
- 结构化日志记录 -所有操作均以JSON格式记录,以供审计和监控
保护摘要
| 保护类型 | 级别 | 控制内容 | 工作原理 |
|---|---|---|---|
| MAXDOP | 数据库 | 每个查询的CPU核心数 | SQL Server查询提示(OPTION (MAXDOP n)) |
| MAX_GRANT_PERCENT | 数据库 | 每个查询的内存 | SQL Server查询提示(OPTION (MAX_GRANT_PERCENT = x)) |
| 诺洛克 | 数据库 | 读取锁 | SQL Server表提示(WITH (NOLOCK)) |
| 查询超时 | 数据库 | 查询执行时间 | ODBC超时(MCP设置值,SQL Server强制取消) |
| 并发限制 | MCP | 并发查询 | 应用程序级信号量 |
| 查询成本检查 | MCP | 查询复杂性 | 执行前计划分析 |
| 结果大小限制 | MCP | 结果集大小 | 应用程序级验证 |
| AST验证 | MCP | 查询类型(只读) | 预执行SQL解析 |
如何使用
Docker快速入门
-
启动服务:
docker-compose up -d -
配置光标MCP:
- 打开光标设置→ 特性→ MCP
- 添加新的MCP服务器:
- 命令:
docker - Args:
exec -i mcp-sql-server python server.py
- 命令:
-
使用MCP工具:
- 查询数据:“数据库中存在哪些表?”
- 查看SQL:“查看此查询:SELECT*FROM Users”
- 获取模式:“显示数据库模式”
MCP工具
query_readonly -执行安全查询
query_readonly(
query="SELECT id, username FROM dbo.Users WHERE is_active = 1",
env="Int", # Optional: Int, Stg, or Prd
database="MyAppDB", # Optional
page_size=10, # Optional: pagination
page=1 # Optional: page number
)
review_sql_script -分析SQL脚本
review_sql_script(
script="SELECT * FROM Users WHERE YEAR(created_date) = 2024",
env="Int"
)
# Returns: risk_score, findings, best_practice_warnings
schema_summary -获取数据库架构
schema_summary(
env="Int",
search_term="user" # Optional: filter tables
)
explain -获取执行计划
explain(
query="SELECT * FROM dbo.Users WHERE id = 1",
env="Int"
)
get_best_practices -列出所有规则
get_best_practices()
# Returns: Complete list of 50 best practice rules
config_info -获取服务器配置
config_info()
# Returns: Current MCP server settings
配置
环境变量(必填):
DB_CONNECTION_STRING_INT="Driver={ODBC Driver 18...};Server=...;Database=...;Uid=...;Pwd=..."
DB_CONNECTION_STRING_STG="..." # Optional
DB_CONNECTION_STRING_PRD="..." # Optional
配置文件: config/config.yaml -定义限制、超时和特定于环境的设置。
数据库用户权限
数据库用户应该具有 仅:
db_datareader目标数据库VIEW SERVER STATE用于执行计划分析
切勿授予: db_datawriter, db_ddladmin,或 sysadmin 角色。
要求: Python 3.11+、Docker(用于本地测试)、用于SQL Server的ODBC驱动程序18