mcpField
S
SQL Sentinel MCP Server

SQL Sentinel MCP Server

本地服务
github.com数据库64 周前更新

关于 SQL Sentinel MCP Server

SQL Sentinel MCP Server 为 AI Agent 提供 SQL Server 监控、诊断和数据库操作能力。它通过 Extended Events 捕获事件,并使用原生连接,无需 ODBC 驱动。

主要功能

  1. 01管理 Extended Events 会话
  2. 02筛选并实时传输捕获事件
  3. 03识别查询指纹并分析执行序列
  4. 04检查死锁、阻塞和等待统计
  5. 05执行数据库结构与数据操作
  6. 06生成综合健康报告

适用场景

  1. 01调试时捕获慢查询
  2. 02查找 N+1 等重复查询模式
  3. 03排查死锁与阻塞
  4. 04检查服务器健康状况和等待统计

MCP 相关

通过 stdio 向 MCP 客户端提供 SQL Server 监控、诊断和数据库操作工具。连接信息从 SQL_SENTINEL_CONNECTION_STRING 环境变量读取。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
nugetNeofenyx.SqlSentinel.Mcp2.3.1
ocighcr.io/tkmawarire/sql-sentinel-mcp

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

SQL Sentinel MCP Server

NuGet Docker License: MIT

一个可用于生产环境的 MCP(Model Context Protocol)服务,用于 SQL Server 监控、诊断和数据库操作。基于 .NET 9 和 Microsoft.Data.SqlClient 构建,支持原生 SQL Server 连接,无需 ODBC 驱动。

功能

  • 会话管理 — 创建、启动、停止、删除和列出扩展事件会话
  • 智能筛选 — 按应用程序、数据库、用户、持续时间、主机和文本模式筛选
  • 查询指纹 — 规范化查询,并将仅字面值不同的相似查询分组
  • 序列分析 — 跟踪执行顺序、时间间隔和累计持续时间
  • 死锁检测 — 捕获并分析 XML 死锁报告,包含受害者和进程详情
  • 阻塞分析 — 监控阻塞进程事件,包含等待资源和 SQL 文本
  • 等待统计信息 — 直接查询 sys.dm_os_wait_stats,并按类型分类(CPU、I/O、锁、内存等)
  • 健康检查 — 全面的服务器诊断:慢查询、死锁、阻塞、等待统计信息和洞察
  • 实时流式传输 — 在指定时长内流式传输捕获的事件
  • 生产环境安全 — 自动排除噪声(sp_reset_connection、SET 语句、跟踪查询)
  • 数据库操作 — 列出表、描述架构、查询数据、插入、更新和删除表
  • 针对 AI 优化 — 结构化 JSON 输出,并支持可选的 Markdown 格式

要求

  • SQL Server 2012+,并启用扩展事件(默认启用)
  • 所需权限:
    GRANT ALTER ANY EVENT SESSION TO [your_login];
    GRANT VIEW SERVER STATE TO [your_login];
    
  • 如需检测被阻塞进程:
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
    EXEC sp_configure 'blocked process threshold', 5;
    RECONFIGURE;
    

安装

选项 1:Docker(推荐)

无需 .NET SDK。适用于安装了 Docker 的任何系统。

docker pull ghcr.io/tkmawarire/sql-sentinel-mcp:latest
Claude Desktop(claude_desktop_config.json)
{
  "mcpServers": {
    "sql-sentinel": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "--network", "host",
               "-e", "SQL_SENTINEL_CONNECTION_STRING=Server=localhost;Database=master;User Id=sa;Password=YourPassword;TrustServerCertificate=true",
               "ghcr.io/tkmawarire/sql-sentinel-mcp:latest"]
    }
  }
}
Claude Code
claude mcp add sql-sentinel \
  -e SQL_SENTINEL_CONNECTION_STRING="Server=localhost;Database=master;User Id=sa;Password=YourPassword;TrustServerCertificate=true" \
  -- docker run -i --rm --network host \
  -e SQL_SENTINEL_CONNECTION_STRING \
  ghcr.io/tkmawarire/sql-sentinel-mcp:latest

网络访问:stdio 传输需要 -i 标志。使用 --network host,让容器能够连接主机上的 SQL Server。对于远程 SQL Server,请省略 --network host,并在连接字符串中使用可访问的主机名。

连接字符串:通过 -e 设置 SQL_SENTINEL_CONNECTION_STRING。所有工具均从此环境变量读取连接字符串。

选项 2:.NET 全局工具(NuGet)

需要 .NET 9 SDK 或更高版本。

dotnet tool install -g SQLSentinel.Mcp
{
  "mcpServers": {
    "sql-sentinel": {
      "command": "sql-sentinel-mcp",
      "env": {
        "SQL_SENTINEL_CONNECTION_STRING": "Server=localhost;Database=master;User Id=sa;Password=YourPassword;TrustServerCertificate=true"
      }
    }
  }
}
选项 3:从源代码构建
git clone https://github.com/tkmawarire/sql-sentinel.git
cd sql-sentinel
dotnet build

直接运行:

dotnet run --project SqlServer.Profiler.Mcp/

或发布为独立的单文件二进制:

# Windows
dotnet publish SqlServer.Profiler.Mcp/ -c Release -r win-x64 --self-contained

# Linux
dotnet publish SqlServer.Profiler.Mcp/ -c Release -r linux-x64 --self-contained

# macOS (Apple Silicon)
dotnet publish SqlServer.Profiler.Mcp/ -c Release -r osx-arm64 --self-contained

# macOS (Intel)
dotnet publish SqlServer.Profiler.Mcp/ -c Release -r osx-x64 --self-contained

输出将位于 bin/Release/net9.0/{runtime}/publish/

连接字符串

所有工具均从 SQL_SENTINEL_CONNECTION_STRING 环境变量读取连接字符串。在启动服务前设置一次:

export SQL_SENTINEL_CONNECTION_STRING="Server=localhost;Database=master;User Id=sa;Password=YourPassword;TrustServerCertificate=false;Encrypt=true"

SQL 身份验证:

Server=localhost;Database=master;User Id=sa;Password=YourPassword;TrustServerCertificate=false;Encrypt=true

Windows 身份验证:

Server=localhost;Database=master;Integrated Security=true;TrustServerCertificate=false;Encrypt=true

**注意:**仅在使用自签名证书的开发环境中使用 TrustServerCertificate=true。 在生产环境中,始终使用 TrustServerCertificate=false 和有效的 SSL 证书。

Azure SQL:

Server=yourserver.database.windows.net;Database=yourdb;User Id=user;Password=password;Encrypt=true

MCP 工具参考

会话生命周期
工具描述
sqlsentinel_create_session创建带筛选条件的扩展事件会话(未启动)
sqlsentinel_start_session启动现有会话的事件捕获
sqlsentinel_stop_session停止捕获;保留事件
sqlsentinel_drop_session删除会话并丢弃所有事件
sqlsentinel_list_sessions列出所有由 MCP 创建的会话及其状态和缓冲区用量
sqlsentinel_quick_capture一步创建并启动会话
事件检索
工具描述
sqlsentinel_get_events检索捕获的事件,支持筛选、排序和去重
sqlsentinel_get_stats按指纹、数据库、应用或登录名分组汇总统计数据
sqlsentinel_analyze_sequence分析查询执行序列及其耗时和间隔
sqlsentinel_get_connection_info列出数据库、应用、登录名、会话和阻塞信息
sqlsentinel_stream_events在指定时长内实时捕获事件(1–300s)
诊断
工具描述
sqlsentinel_get_deadlocks检索死锁事件,包括受害者、进程、锁和 SQL 文本
sqlsentinel_get_blocking检索被阻塞的进程事件,包括等待资源和 SQL 文本
sqlsentinel_get_wait_stats按类型查询 sys.dm_os_wait_stats(无需会话)
sqlsentinel_health_check综合报告:慢查询、死锁、阻塞、等待统计信息和洞察
权限
工具描述
sqlsentinel_check_permissions检查当前登录名的权限和阻塞进程阈值配置
sqlsentinel_grant_permissions向登录名授予所需权限(需要 sysadmin)
数据库操作
工具描述
sqlsentinel_list_tables列出数据库中的所有用户表(包含架构名)
sqlsentinel_describe_table详细的表架构:列、索引、约束和外键
sqlsentinel_create_table通过 CREATE TABLE 语句创建新表
sqlsentinel_insert_data通过 INSERT 语句插入数据
sqlsentinel_read_data执行 SELECT 查询并返回结果
sqlsentinel_update_data通过 UPDATE 语句更新数据
sqlsentinel_drop_table通过 DROP TABLE 语句删除表

使用示例

快速调试会话
Agent: sqlsentinel_quick_capture(
    sessionName: "debug_api",
    applications: "MyWebApp",
    minDurationMs: 100
)

// User triggers the slow operation

Agent: sqlsentinel_get_events(
    sessionName: "debug_api",
    sortBy: "DurationDesc",
    limit: 20
)

Agent: sqlsentinel_drop_session(sessionName: "debug_api")
查找 N+1 查询
Agent: sqlsentinel_quick_capture(
    sessionName: "n_plus_one_check",
    databases: "OrdersDB"
)

// User loads a page

Agent: sqlsentinel_get_stats(
    sessionName: "n_plus_one_check",
    groupBy: "QueryFingerprint"
)

// Look for queries with high execution counts
跟踪特定操作
Agent: sqlsentinel_analyze_sequence(
    sessionName: "my_session",
    correlationId: "order-12345",
    responseFormat: "Markdown"
)
死锁检测
Agent: sqlsentinel_quick_capture(
    sessionName: "deadlock_monitor",
    eventTypes: "Deadlock"
)

// Wait for deadlocks to occur

Agent: sqlsentinel_get_deadlocks(
    sessionName: "deadlock_monitor",
    responseFormat: "Markdown"
)
阻塞分析
Agent: sqlsentinel_quick_capture(
    sessionName: "blocking_check",
    eventTypes: "BlockedProcess"
)

// Requires: sp_configure 'blocked process threshold', 5

Agent: sqlsentinel_get_blocking(
    sessionName: "blocking_check",
    responseFormat: "Markdown"
)
服务健康检查
Agent: sqlsentinel_health_check(
    sessionName: "my_session",
    slowQueryThresholdMs: 1000,
    responseFormat: "Markdown"
)
数据库操作
Agent: sqlsentinel_list_tables()

Agent: sqlsentinel_describe_table(
    name: "dbo.Products"
)

Agent: sqlsentinel_read_data(
    sql: "SELECT TOP 10 * FROM dbo.Products ORDER BY CreatedDate DESC"
)
等待统计信息(无需会话)
Agent: sqlsentinel_get_wait_stats(
    topN: 20,
    responseFormat: "Markdown"
)

查询指纹

查询会经过规范化,以便将相似查询归为一组:

-- These become one fingerprint:
SELECT * FROM Users WHERE id = 123
SELECT * FROM Users WHERE id = 456

-- Fingerprint: abc123:SELECT * FROM Users WHERE id = ?
-- Execution count: 2

噪声过滤

默认排除的模式(当 excludeNoise=true 时):

  • sp_reset_connection — 连接池重置
  • SET TRANSACTION ISOLATION LEVEL — 会话设置
  • SET NOCOUNT、SET ANSI_* — 客户端配置
  • sp_trace_*、fn_trace_* — 跟踪系统查询

支持的事件类型

SqlBatchCompleted、RpcCompleted、SqlStatementCompleted、SpStatementCompleted、Attention、ErrorReported、Deadlock、BlockedProcess、LoginEvent、SchemaChange、Recompile、AutoStats

项目结构

sql-profiler-mcp/
├── .github/
│   └── workflows/
│       ├── docker.yml                     # Build & push multi-arch Docker images
│       └── publish-mcp-registry.yml       # Publish NuGet + MCP registry
├── .mcp/
│   └── server.json                        # MCP manifest (NuGet + OCI packages)
├── SqlServer.Profiler.Mcp/                # Main MCP server (stdio transport)
│   ├── SqlServer.Profiler.Mcp.csproj
│   ├── Program.cs                         # Entry point, DI setup, MCP config
│   ├── Models/
│   │   ├── ProfilerModels.cs              # Records, enums, data models
│   │   └── DbOperationResult.cs           # Result model for CRUD operations
│   ├── Services/
│   │   ├── ProfilerService.cs             # Core Extended Events logic
│   │   ├── QueryFingerprintService.cs     # SQL normalization & fingerprinting
│   │   ├── WaitStatsService.cs            # DMV-based wait stats analysis
│   │   ├── SessionConfigStore.cs          # In-memory session config storage
│   │   └── EventStreamingService.cs       # Real-time event streaming
│   ├── Utilities/
│   │   └── SqlInputValidator.cs           # SQL input validation & escaping
│   └── Tools/
│       ├── SessionManagementTools.cs      # Session lifecycle tools (6)
│       ├── EventRetrievalTools.cs         # Event retrieval tools (5)
│       ├── DiagnosticTools.cs             # Diagnostic tools (4)
│       ├── PermissionTools.cs             # Permission tools (2)
│       └── DatabaseTools.cs               # Database CRUD tools (7)
├── SqlServer.Profiler.Mcp.Api/            # Debug REST API (Swagger on port 5100)
│   ├── SqlServer.Profiler.Mcp.Api.csproj
│   ├── Program.cs
│   ├── Controllers/
│   │   └── ProfilerController.cs
│   ├── Models/
│   │   └── RequestModels.cs
│   └── appsettings.json
├── SqlServer.Profiler.Mcp.Cli/            # Debug CLI (REPL + script mode)
│   ├── SqlServer.Profiler.Mcp.Cli.csproj
│   └── Program.cs
├── SqlServer.Profiler.Mcp.Tests/          # xUnit tests for core MCP library (228 tests)
│   └── ...
├── SqlServer.Profiler.Mcp.Api.Tests/      # xUnit tests for API project (29 tests)
│   └── ...
├── Dockerfile                             # Multi-stage build (bookworm-slim)
├── .dockerignore
├── SqlServer.Profiler.Mcp.slnx           # Solution file
├── CLAUDE.md
├── CONTRIBUTING.md
└── README.md

开发

先决条件
  • .NET 9 SDK
  • SQL Server 2012+ 实例(本地、Docker 或远程)
  • Docker(可选,用于容器构建)
克隆并构建
git clone https://github.com/tkmawarire/sql-sentinel.git
cd sql-sentinel
dotnet restore
dotnet build
在本地运行 MCP 服务
dotnet run --project SqlServer.Profiler.Mcp/

服务使用 MCP 协议通过 stdio 通信。将其连接到 MCP 客户端(Claude Desktop、Claude Code 等)即可进行交互式使用。

使用调试 API

API 项目为所有 MCP 工具提供 REST 封装,并提供 Swagger UI 以便手动测试。

dotnet run --project SqlServer.Profiler.Mcp.Api/
  • Swagger UI:http://localhost:5100/
  • 通过环境变量 SQL_SENTINEL_CONNECTION_STRING 配置连接字符串
使用调试 CLI

CLI 项目提供交互式 REPL 和脚本模式,可直接测试工具。

# Interactive REPL mode
dotnet run --project SqlServer.Profiler.Mcp.Cli/

# List all available tools
dotnet run --project SqlServer.Profiler.Mcp.Cli/ list

# Get help for a specific tool
dotnet run --project SqlServer.Profiler.Mcp.Cli/ help sqlsentinel_quick_capture

# Execute a single tool
dotnet run --project SqlServer.Profiler.Mcp.Cli/ call sqlsentinel_list_sessions

运行前设置 SQL_SENTINEL_CONNECTION_STRING 环境变量。

Docker 构建
docker build -t sql-sentinel-mcp:test .
docker run -i --rm --network host sql-sentinel-mcp:test

架构

关键模式
  • 通过 Microsoft.Extensions.Hosting 实现依赖注入
  • stdio 传输 — stdout 专用于 MCP 协议;所有日志都写入 stderr
  • 工具自动发现 — 通过 WithToolsFromAssembly() 从程序集发现 MCP 工具
  • XE 会话前缀 — 所有创建的会话都以 mcp_sentinel_ 为前缀
  • 两种事件形态 — 标准事件(查询、登录、重新编译)包含类型化字段;XML 负载事件(死锁、阻塞)则从 Extended Events XML 中解析
添加新的 MCP 工具
  1. 在 Tools/ 下的适当文件中创建一个 public static 方法(或创建新文件)
  2. 使用 [McpServerTool(Name = "sqlsentinel_your_tool")] 和 [Description("...")] 修饰该方法
  3. 使用 [Description("...")] 属性添加参数——这些参数会成为工具的输入架构
  4. 通过方法参数注入服务(例如 IProfilerService、IWaitStatsService)
  5. 返回字符串(JSON 或 Markdown)——框架会处理 MCP 响应封装
[McpServerTool(Name = "sqlsentinel_example")]
[Description("Description shown to AI agents")]
public static async Task<string> Example(
    IProfilerService profilerService,
    [Description("Optional filter")] string? filter = null)
{
    var connectionString = ConnectionStringResolver.Resolve();
    // Implementation
    return JsonSerializer.Serialize(result);
}

故障排除

创建会话时出现“Permission denied”
GRANT ALTER ANY EVENT SESSION TO [your_login];
GRANT VIEW SERVER STATE TO [your_login];
“Login failed”
  • 检查连接字符串凭据
  • 对于 Windows 身份验证,确保进程以正确的用户身份运行
  • 对于 Azure SQL,确保防火墙允许你的 IP
未捕获到事件
  1. 确认会话处于 RUNNING 状态(sqlsentinel_list_sessions)
  2. 检查筛选条件是否过于严格
  3. 确认目标数据库/应用正在生成查询
  4. 检查 minDurationMs 是否筛掉了所有内容
没有死锁事件
  • 确保会话创建时设置了 eventTypes: "Deadlock"
  • 会话运行期间必须实际发生死锁
没有阻塞事件
  • 确保已配置 blocked process threshold:sp_configure 'blocked process threshold', 5
  • 确保会话创建时设置了 eventTypes: "BlockedProcess"
  • 阻塞必须超过配置的阈值(秒)
读取事件超时

包含大量事件的大型环形缓冲区可能需要较长时间解析。可以使用:

  • 时间筛选器缩小时间范围
  • 如有需要,在代码中增加命令超时时间

安全说明

  • SQL_SENTINEL_CONNECTION_STRING 环境变量包含凭据——请妥善保护
  • 不要让会话在生产环境中无限期运行
  • 查询文本可能包含敏感数据
  • 仅授予所需的最低权限

贡献

请参阅 CONTRIBUTING.md,了解提交问题和拉取请求的指南。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。