SQL Server 安全查询服务

提供安全、只读的SQL Server数据库访问,具有多层保护机制和查询分析功能。

  • by shaharwiener
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 shaharwiener/mcp-sql-server

使用说明

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 通过自动注入到每个查询中的查询提示:

  1. CPU控制(MAXDOP) -限制每个查询的CPU并行度:

    • 生产: MAXDOP 1 (单线程,使用1个CPU核)
    • 暂存: MAXDOP 2 (有限的并行性)
    • 发展: MAXDOP 4 (允许并行)
    • 防止:消耗所有CPU核心的单个查询
  2. 内存控制(MAX_GRANT_PERCENT) -限制每个查询的内存分配:

    • 生产: MAX_GRANT_PERCENT = 10 (可用查询内存的10%)
    • 暂存: MAX_GRANT_PERCENT = 25 (25%的可用查询内存)
    • 发展: MAX_GRANT_PERCENT = 50 (可用查询内存的50%)
    • 防止:单个查询消耗了过多的SQL Server内存
  3. 防锁(NOLOCK) -防止生产中的读取阻塞:

    • 自动添加 WITH (NOLOCK) 所有表引用的提示
    • 仅生产:防止查询阻止写入操作
    • 可配置的:可以根据环境启用/禁用
  4. 查询执行超时 -强制最长查询执行时间:

    • 默认值: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应用程序 在查询执行之前和期间:

  1. 并发限制 -限制每个环境和用户的并发查询:

    • 每个环境最多5个并发查询
    • 每个用户最多2个并发查询
    • 防止:太多同时进行的查询导致资源耗尽
  2. AST验证 -使用SQL解析的严格只读强制:

    • 阻止INSERT、UPDATE、DELETE、DDL操作
    • 阻止多语句批处理
    • 防止:意外或恶意写入操作
  3. 查询成本检查 -在执行前阻止昂贵的查询:

    • 分析SQL Server执行计划成本(估计CPU、I/O、内存)
    • 默认阈值:50(Int:100,Stg:50,Prd:10)
    • 防止:CPU密集型查询无法运行
  4. 结果集大小限制 -防止大型结果集:

    • 有效载荷大小限制:每个查询结果默认1MB(可配置)
    • 行限制:默认1000行(整数:10000,标准:5000,标准:500)
    • 批量抓取:用途 fetchmany 而不是 fetchall 控制内存
    • 自动截断:截断大文本值(>1000个字符)
    • 防止:MCP应用程序内存消耗过多
  5. 允许的数据库 -可查询的数据库的可选白名单

    • 防止:访问未经授权的数据库

附加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快速入门

  1. 启动服务:

    docker-compose up -d
    
  2. 配置光标MCP:

    • 打开光标设置→ 特性→ MCP
    • 添加新的MCP服务器:
      • 命令: docker
      • Args: exec -i mcp-sql-server python server.py
  3. 使用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