io.github.tkmawarire/sql-sentinel
SQL Sentinel MCP Server
一个生产级 MCP(模型上下文协议)服务器,用于 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 格式
Related MCP server: mysql-mcp-server
要求
启用扩展事件(默认)的 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;
安装
选项一:Docker(推荐)
无需 .NET SDK。可在任何安装了 Docker 的系统上运行。
docker pull ghcr.io/tkmawarire/sql-sentinel-mcp:latestClaude 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。所有工具都从这个环境变量读取连接字符串。
选项二:.NET 全局工具(NuGet)
需要 .NET 9 SDK 或更高版本。
dotnet tool install -g Neofenyx.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"
}
}
}
}选项三:从源代码构建
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=trueWindows 身份验证:
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=trueMCP 工具参考
会话生命周期
Tool | 描述 |
| 创建带有过滤器的扩展事件会话(未启动) |
| 为现有会话开始捕获事件 |
| 停止捕获;事件将被保留 |
| 删除会话并丢弃所有事件 |
| 列出所有由 MCP 创建的会话及其状态和缓冲区使用情况 |
| 一步创建并启动会话 |
事件检索
Tool | 描述 |
| 检索捕获的事件,支持过滤、排序和去重 |
| 按指纹、数据库、应用或登录名聚合统计数据 |
| 分析查询执行序列,包含时间和间隔 |
| 列出数据库、应用程序、登录名、会话和阻塞信息 |
| 在指定持续时间(1–300 秒)内进行实时事件捕获 |
诊断
Tool | 描述 |
| 检索包含受害者、进程、锁和 SQL 文本的死锁事件 |
| 检索带有等待资源和 SQL 文本的被阻塞进程事件 |
| 按类型查询 |
| 综合报告:慢查询、死锁、阻塞、等待统计、洞察 |
权限
Tool | 描述 |
| 检查当前登录权限和阻塞进程阈值配置 |
| 向登录名授予所需权限(需要 sysadmin) |
数据库操作
Tool | 描述 |
| 列出数据库中所有用户表(带架构限定) |
| 详细的表架构:列、索引、约束、外键 |
| 通过 CREATE TABLE 语句创建新表 |
| 通过 INSERT 语句插入数据 |
| 执行 SELECT 查询并返回结果 |
| 通过 UPDATE 语句更新数据 |
| 通过 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开发
先决条件
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/服务器通过 stdio 使用 MCP 协议进行通信。将其连接到 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.Hostingstdio 传输 — stdout 保留给 MCP 协议;所有日志都写入 stderr
工具自动发现 — 通过
WithToolsFromAssembly()从程序集发现 MCP 工具XE 会话前缀 — 所有创建的会话都以
mcp_sentinel_为前缀两种事件形态 — 具有类型化字段的标准事件(查询、登录、重新编译),以及从扩展事件 XML 解析的 XML 负载事件(死锁、阻塞)
添加新的 MCP 工具
在
Tools/下的相应文件中创建一个public static方法(或创建新文件)使用
[McpServerTool(Name = "sqlsentinel_your_tool")]和[Description("...")]进行修饰添加带有
[Description("...")]属性的参数 —— 它们将成为工具的输入模式通过方法参数注入服务(例如
IProfilerService、IWaitStatsService)返回字符串(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);
}故障排除
创建会话时提示“权限被拒绝”
GRANT ALTER ANY EVENT SESSION TO [your_login];
GRANT VIEW SERVER STATE TO [your_login];“登录失败”
检查连接字符串的凭据
对于 Windows 身份验证,确保进程以正确的用户身份运行
对于 Azure SQL,确保防火墙允许你的 IP
未捕获到事件
验证会话正在运行(
sqlsentinel_list_sessions)检查过滤器是否过于严格
验证目标数据库/应用是否正在生成查询
检查
minDurationMs是否过滤掉了所有内容
没有死锁事件
确保会话是使用
eventTypes: "Deadlock"创建的死锁必须在会话运行期间实际发生
没有阻塞事件
确保已配置
blocked process threshold:sp_configure 'blocked process threshold', 5确保会话是使用
eventTypes: "BlockedProcess"创建的阻塞必须超过配置的阈值(秒)
读取事件超时
包含大量事件的大型环形缓冲区解析起来可能很慢。请使用:
使用时间过滤器缩小窗口
如有需要,在代码中增加命令超时
安全说明
环境变量
SQL_SENTINEL_CONNECTION_STRING包含凭据 —— 请妥善保护不要在生产环境无限期地让会话保持运行
查询文本可能包含敏感数据
授予最低必要权限
贡献
有关提交 issue 和 pull request 的指南,请参阅 CONTRIBUTING.md。
许可证
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server for Microsoft SQL Server that enables executing read-only queries, listing tables, and describing database schemas. It offers specialized support for custom ports and multiple authentication methods including SQL credentials, NTLM, and Windows Integrated Auth.3
- Alicense-qualityCmaintenanceA production-ready MCP server for MySQL database operations, providing secure HTTP endpoints for read-only queries, performance analysis, and server monitoring.459MIT
- Alicense-qualityBmaintenanceMCP server for SQL Server database inspection and querying, with connection pooling, security features, and a web manager UI.4MIT

dmc-sql-saglikofficial
Flicense-qualityAmaintenanceProvides read-only SQL Server health diagnostics (server health, blocking queries, missing indexes) via MCP, with a GUI installer that automatically configures AI clients like Claude Desktop.
Related MCP Connectors
MCP server for managing Prisma Postgres.
The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.
MCP server for interacting with the Supabase platform
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tkmawarire/sql-sentinel'
If you have feedback or need assistance with the MCP directory API, please join our Discord server