Skip to main content
Glama
tkmawarire

io.github.tkmawarire/sql-sentinel

by tkmawarire

SQL Sentinel MCP Server

NuGet Docker License: MIT

一个生产级 MCP(模型上下文协议)服务器,用于 SQL Server 监控、诊断和数据库操作。基于 .NET 9 和 Microsoft.Data.SqlClient 构建,实现原生 SQL Server 连接——无需 ODBC 驱动

功能

  • 会话管理 — 创建、启动、停止、删除和列出扩展事件会话

  • 智能过滤 — 按应用程序、数据库、用户、持续时间、主机和文本模式过滤

  • 查询指纹识别 — 规范化并分组仅因字面值不同而相似的查询

  • 序列分析 — 跟踪执行顺序,包括时间间隔和累计持续时间

  • 死锁检测 — 捕获并分析包含受害者/进程详细信息的 XML 死锁报告

  • 阻塞分析 — 监控带有等待资源和 SQL 文本的被阻塞进程事件

  • 等待统计 — 直接查询 sys.dm_os_wait_stats,按类型(CPU、I/O、锁、内存等)分类

  • 健康检查 — 全面的服务器诊断:慢查询、死锁、阻塞、等待统计和洞察

  • 实时流式传输 — 在指定持续时间内流式传输捕获的事件

  • 生产安全 — 自动排除干扰(sp_reset_connectionSET 语句、跟踪查询)

  • 数据库操作 — 列出表、描述架构、查询数据、插入、更新和删除表

  • 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: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。所有工具都从这个环境变量读取连接字符串。

选项二:.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=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 工具参考

会话生命周期

Tool

描述

sqlsentinel_create_session

创建带有过滤器的扩展事件会话(未启动)

sqlsentinel_start_session

为现有会话开始捕获事件

sqlsentinel_stop_session

停止捕获;事件将被保留

sqlsentinel_drop_session

删除会话并丢弃所有事件

sqlsentinel_list_sessions

列出所有由 MCP 创建的会话及其状态和缓冲区使用情况

sqlsentinel_quick_capture

一步创建并启动会话

事件检索

Tool

描述

sqlsentinel_get_events

检索捕获的事件,支持过滤、排序和去重

sqlsentinel_get_stats

按指纹、数据库、应用或登录名聚合统计数据

sqlsentinel_analyze_sequence

分析查询执行序列,包含时间和间隔

sqlsentinel_get_connection_info

列出数据库、应用程序、登录名、会话和阻塞信息

sqlsentinel_stream_events

在指定持续时间(1–300 秒)内进行实时事件捕获

诊断

Tool

描述

sqlsentinel_get_deadlocks

检索包含受害者、进程、锁和 SQL 文本的死锁事件

sqlsentinel_get_blocking

检索带有等待资源和 SQL 文本的被阻塞进程事件

sqlsentinel_get_wait_stats

按类型查询 sys.dm_os_wait_stats(无需会话)

sqlsentinel_health_check

综合报告:慢查询、死锁、阻塞、等待统计、洞察

权限

Tool

描述

sqlsentinel_check_permissions

检查当前登录权限和阻塞进程阈值配置

sqlsentinel_grant_permissions

向登录名授予所需权限(需要 sysadmin)

数据库操作

Tool

描述

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 NOCOUNTSET 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/

服务器通过 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.Hosting

  • stdio 传输 — stdout 保留给 MCP 协议;所有日志都写入 stderr

  • 工具自动发现 — 通过 WithToolsFromAssembly() 从程序集发现 MCP 工具

  • XE 会话前缀 — 所有创建的会话都以 mcp_sentinel_ 为前缀

  • 两种事件形态 — 具有类型化字段的标准事件(查询、登录、重新编译),以及从扩展事件 XML 解析的 XML 负载事件(死锁、阻塞)

添加新的 MCP 工具

  1. Tools/ 下的相应文件中创建一个 public static 方法(或创建新文件)

  2. 使用 [McpServerTool(Name = "sqlsentinel_your_tool")][Description("...")] 进行修饰

  3. 添加带有 [Description("...")] 属性的参数 —— 它们将成为工具的输入模式

  4. 通过方法参数注入服务(例如 IProfilerServiceIWaitStatsService

  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);
}

故障排除

创建会话时提示“权限被拒绝”

GRANT ALTER ANY EVENT SESSION TO [your_login];
GRANT VIEW SERVER STATE TO [your_login];

“登录失败”

  • 检查连接字符串的凭据

  • 对于 Windows 身份验证,确保进程以正确的用户身份运行

  • 对于 Azure SQL,确保防火墙允许你的 IP

未捕获到事件

  1. 验证会话正在运行(sqlsentinel_list_sessions

  2. 检查过滤器是否过于严格

  3. 验证目标数据库/应用是否正在生成查询

  4. 检查 minDurationMs 是否过滤掉了所有内容

没有死锁事件

  • 确保会话是使用 eventTypes: "Deadlock" 创建的

  • 死锁必须在会话运行期间实际发生

没有阻塞事件

  • 确保已配置 blocked process thresholdsp_configure 'blocked process threshold', 5

  • 确保会话是使用 eventTypes: "BlockedProcess" 创建的

  • 阻塞必须超过配置的阈值(秒)

读取事件超时

包含大量事件的大型环形缓冲区解析起来可能很慢。请使用:

  • 使用时间过滤器缩小窗口

  • 如有需要,在代码中增加命令超时

安全说明

  • 环境变量 SQL_SENTINEL_CONNECTION_STRING 包含凭据 —— 请妥善保护

  • 不要在生产环境无限期地让会话保持运行

  • 查询文本可能包含敏感数据

  • 授予最低必要权限

贡献

有关提交 issue 和 pull request 的指南,请参阅 CONTRIBUTING.md

许可证

MIT

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
5Releases (12mo)
Commit activity

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

  • F
    license
    A
    quality
    D
    maintenance
    An 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
  • A
    license
    -
    quality
    C
    maintenance
    A production-ready MCP server for MySQL database operations, providing secure HTTP endpoints for read-only queries, performance analysis, and server monitoring.
    45
    9
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    MCP server for SQL Server database inspection and querying, with connection pooling, security features, and a web manager UI.
    4
    MIT
  • F
    license
    -
    quality
    A
    maintenance
    Provides 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.

View all related MCP servers

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

View all MCP Connectors

Latest Blog Posts

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