Skip to main content
Glama
tkmawarire

io.github.tkmawarire/sql-sentinel

by tkmawarire

SQL Sentinel MCP Server

NuGet Docker License: MIT

Ein produktionsreifer MCP-Server (Model Context Protocol) für SQL Server-Überwachung, Diagnose und Datenbankoperationen. Erstellt mit .NET 9 und Microsoft.Data.SqlClient für native SQL Server-Konnektivität — keine ODBC-Treiber erforderlich.

Features

  • Sitzungsverwaltung — Extended Events-Sitzungen erstellen, starten, stoppen, löschen und auflisten

  • Intelligente Filterung — Nach Anwendung, Datenbank, Benutzer, Dauer, Host und Textmustern filtern

  • Query-Fingerprinting — Ähnliche Abfragen, die sich nur in Literalwerten unterscheiden, normalisieren und gruppieren

  • Sequenzanalyse — Ausführungsreihenfolge mit Zeitlücken und kumulativer Dauer nachverfolgen

  • Deadlock-Erkennung — XML-Deadlock-Berichte mit Opfer-/Prozessdetails erfassen und analysieren

  • Blocking-Analyse — Blockierte Prozessereignisse mit Wartevorgang-Ressource und SQL-Text überwachen

  • Wait Statssys.dm_os_wait_stats direkt abfragen, nach Typ kategorisiert (CPU, I/O, Sperre, Speicher usw.)

  • Health Check — Umfassende Serverdiagnose: langsame Abfragen, Deadlocks, Blocking, Wait Stats und Erkenntnisse

  • Echtzeit-Streaming — Erfasste Ereignisse für eine angegebene Dauer streamen

  • Produktionssicher — Blendet Rauschen automatisch aus (sp_reset_connection, SET-Anweisungen, Abfragen zur Ablaufverfolgung)

  • Datenbankoperationen — Tabellen auflisten, Schemas beschreiben, Daten abfragen, einfügen, aktualisieren und Tabellen löschen

  • KI-optimiert — Strukturierte JSON-Ausgabe mit optionaler Markdown-Formatierung

Related MCP server: mysql-mcp-server

Anforderungen

  • SQL Server 2012+ mit aktivierten Extended Events (Standard)

  • Erforderliche Berechtigungen:

    GRANT ALTER ANY EVENT SESSION TO [your_login];
    GRANT VIEW SERVER STATE TO [your_login];
  • Für die Erkennung blockierter Prozesse:

    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
    EXEC sp_configure 'blocked process threshold', 5;
    RECONFIGURE;

Installation

Option 1: Docker (Empfohlen)

Kein .NET SDK erforderlich. Funktioniert auf jedem System mit installiertem 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

Netzwerkzugriff: Das Flag -i ist für den Stdio-Transport erforderlich. Verwenden Sie --network host, damit der Container SQL Server auf Ihrem Host-Rechner erreichen kann. Für einen entfernten SQL Server lassen Sie --network host weg und verwenden Sie den erreichbaren Hostnamen in Ihrer Verbindungszeichenfolge.

Verbindungszeichenfolge: Setzen Sie SQL_SENTINEL_CONNECTION_STRING über -e. Alle Tools lesen die Verbindungszeichenfolge aus dieser Umgebungsvariable.

Option 2: .NET Global Tool (NuGet)

Erfordert .NET 9 SDK oder höher.

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"
      }
    }
  }
}

Option 3: Aus dem Quellcode erstellen

git clone https://github.com/tkmawarire/sql-sentinel.git
cd sql-sentinel
dotnet build

Direkt ausführen:

dotnet run --project SqlServer.Profiler.Mcp/

Oder eine eigenständige einzelne Binärdatei veröffentlichen:

# 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

Ausgabe befindet sich in bin/Release/net9.0/{runtime}/publish/

Verbindungszeichenfolgen

Alle Tools lesen die Verbindungszeichenfolge aus der Umgebungsvariable SQL_SENTINEL_CONNECTION_STRING. Setzen Sie sie einmal, bevor Sie den Server starten:

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

SQL-Authentifizierung:

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

Windows-Authentifizierung:

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

Hinweis: Verwenden Sie TrustServerCertificate=true nur in Entwicklungsumgebungen mit selbstsignierten Zertifikaten. Verwenden Sie in der Produktion immer TrustServerCertificate=false mit einem gültigen SSL-Zertifikat.

Azure SQL:

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

Referenz der MCP-Tools

Sitzungslebenszyklus

Tool

Beschreibung

sqlsentinel_create_session

Eine Extended Events-Sitzung mit Filtern erstellen (nicht gestartet)

sqlsentinel_start_session

Ereignisse für eine vorhandene Sitzung erfassen starten

sqlsentinel_stop_session

Erfassung stoppen; Ereignisse bleiben erhalten

sqlsentinel_drop_session

Sitzung löschen und alle Ereignisse verwerfen

sqlsentinel_list_sessions

Alle von MCP erstellten Sitzungen mit Status und Puffernutzung auflisten

sqlsentinel_quick_capture

Sitzung in einem Schritt erstellen und starten

Ereignisabruf

Tool

Beschreibung

sqlsentinel_get_events

Erfasste Ereignisse mit Filtern, Sortierung und Deduplizierung abrufen

sqlsentinel_get_stats

Aggregierte Statistiken gruppiert nach Fingerabdruck, Datenbank, App oder Anmeldung

sqlsentinel_analyze_sequence

Ausführungssequenz von Abfragen mit Zeitangaben und Lücken analysieren

sqlsentinel_get_connection_info

Datenbanken, Anwendungen, Anmeldungen, Sitzungen und Blockierungsinformationen auflisten

sqlsentinel_stream_events

Ereigniserfassung in Echtzeit für eine angegebene Dauer (1–300s)

Diagnose

Tool

Beschreibung

sqlsentinel_get_deadlocks

Deadlock-Ereignisse mit Opfer, Prozessen, Sperren und SQL-Text abrufen

sqlsentinel_get_blocking

Ereignisse blockierter Prozesse mit Wartevorgangsressourcen und SQL-Text abrufen

sqlsentinel_get_wait_stats

sys.dm_os_wait_stats nach Typ kategorisiert abfragen (keine Sitzung erforderlich)

sqlsentinel_health_check

Umfassender Bericht: langsame Abfragen, Deadlocks, Blocking, Wait Stats, Erkenntnisse

Berechtigungen

Tool

Beschreibung

sqlsentinel_check_permissions

Aktuelle Anmeldeberechtigungen und Schwellenwertkonfiguration für blockierte Prozesse prüfen

sqlsentinel_grant_permissions

Erforderliche Berechtigungen an eine Anmeldung vergeben (erfordert sysadmin)

Datenbankoperationen

Tool

Beschreibung

sqlsentinel_list_tables

Alle Benutzertabellen in der Datenbank auflisten (schemaqualifiziert)

sqlsentinel_describe_table

Detailliertes Tabellenschema: Spalten, Indizes, Einschränkungen, Fremdschlüssel

sqlsentinel_create_table

Neue Tabelle per CREATE TABLE-Anweisung erstellen

sqlsentinel_insert_data

Daten per INSERT-Anweisung einfügen

sqlsentinel_read_data

SELECT-Abfragen ausführen und Ergebnisse zurückgeben

sqlsentinel_update_data

Daten per UPDATE-Anweisung aktualisieren

sqlsentinel_drop_table

Tabelle per DROP TABLE-Anweisung löschen

Verwendungsbeispiele

Schnelle Debug-Sitzung

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-Abfragen finden

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

Bestimmten Vorgang nachverfolgen

Agent: sqlsentinel_analyze_sequence(
    sessionName: "my_session",
    correlationId: "order-12345",
    responseFormat: "Markdown"
)

Deadlock-Erkennung

Agent: sqlsentinel_quick_capture(
    sessionName: "deadlock_monitor",
    eventTypes: "Deadlock"
)

// Wait for deadlocks to occur

Agent: sqlsentinel_get_deadlocks(
    sessionName: "deadlock_monitor",
    responseFormat: "Markdown"
)

Blocking-Analyse

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"
)

Server-Health-Check

Agent: sqlsentinel_health_check(
    sessionName: "my_session",
    slowQueryThresholdMs: 1000,
    responseFormat: "Markdown"
)

Datenbankoperationen

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"
)

Wait Stats (keine Sitzung erforderlich)

Agent: sqlsentinel_get_wait_stats(
    topN: 20,
    responseFormat: "Markdown"
)

Query-Fingerprinting

Abfragen werden normalisiert, um ähnliche zu gruppieren:

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

Rauschfilterung

Standardmäßig ausgeschlossene Muster (wenn excludeNoise=true):

  • sp_reset_connection — Zurücksetzen des Verbindungspools

  • SET TRANSACTION ISOLATION LEVEL — Sitzungseinrichtung

  • SET NOCOUNT, SET ANSI_* — Clientkonfiguration

  • sp_trace_*, fn_trace_* — Systemabfragen zur Ablaufverfolgung

Unterstützte Ereignistypen

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

Projektstruktur

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

Entwicklung

Voraussetzungen

  • .NET 9 SDK

  • SQL Server 2012+-Instanz (lokal, Docker oder remote)

  • Docker (optional, für Container-Builds)

Klonen und Erstellen

git clone https://github.com/tkmawarire/sql-sentinel.git
cd sql-sentinel
dotnet restore
dotnet build

MCP-Server lokal ausführen

dotnet run --project SqlServer.Profiler.Mcp/

Der Server kommuniziert über stdio mit dem MCP-Protokoll. Verbinden Sie ihn zur interaktiven Nutzung mit einem MCP-Client (Claude Desktop, Claude Code usw.).

Verwenden der Debug-API

Das API-Projekt bietet einen REST-Wrapper um alle MCP-Tools mit Swagger-UI für manuelle Tests.

dotnet run --project SqlServer.Profiler.Mcp.Api/
  • Swagger UI: http://localhost:5100/

  • Konfigurieren Sie die Verbindungszeichenfolge über die Umgebungsvariable SQL_SENTINEL_CONNECTION_STRING

Verwenden der Debug-CLI

Das CLI-Projekt bietet einen interaktiven REPL- und Skriptmodus zum direkten Testen der Tools.

# 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

Setzen Sie die Umgebungsvariable SQL_SENTINEL_CONNECTION_STRING, bevor Sie es ausführen.

Docker-Build

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

Architektur

Wichtige Muster

  • Abhängigkeitsinjektion über Microsoft.Extensions.Hosting

  • Stdio-Transport — stdout ist für das MCP-Protokoll reserviert; die gesamte Protokollierung erfolgt über stderr

  • Automatische Tool-Erkennung — MCP-Tools werden aus der Assembly über WithToolsFromAssembly() ermittelt

  • XE-Sitzungspräfix — Alle erstellten Sitzungen erhalten das Präfix mcp_sentinel_

  • Zwei Ereignisformen — Standardereignisse (Abfrage, Anmeldung, Neukompilierung) mit typisierten Feldern und XML-Payload-Ereignisse (Deadlock, Blocking), die aus Extended Events-XML geparst werden

Hinzufügen eines neuen MCP-Tools

  1. Erstellen Sie eine public static-Methode in der entsprechenden Datei unter Tools/ (oder erstellen Sie eine neue Datei)

  2. Dekorieren Sie sie mit [McpServerTool(Name = "sqlsentinel_your_tool")] und [Description("...")]

  3. Fügen Sie Parameter mit [Description("...")]-Attributen hinzu — sie werden zum Eingabeschema des Tools

  4. Injizieren Sie Dienste über Methodenparameter (z. B. IProfilerService, IWaitStatsService)

  5. Geben Sie einen String zurück (JSON oder Markdown) — das Framework übernimmt die MCP-Antwortumwicklung

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

Fehlerbehebung

„Permission denied" beim Erstellen der Sitzung

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

„Login fehlgeschlagen"

  • Überprüfen Sie die Anmeldedaten in der Verbindungszeichenfolge

  • Stellen Sie bei Windows-Authentifizierung sicher, dass der Prozess unter dem richtigen Benutzer läuft

  • Stellen Sie bei Azure SQL sicher, dass die Firewall Ihre IP-Adresse zulässt

Keine Ereignisse erfasst

  1. Stellen Sie sicher, dass die Sitzung AUSGEFÜHRT wird (sqlsentinel_list_sessions)

  2. Prüfen Sie, ob die Filter nicht zu restriktiv sind

  3. Stellen Sie sicher, dass die Zieldatenbank/-App Abfragen generiert

  4. Prüfen Sie, ob minDurationMs nicht alles herausfiltert

Keine Deadlock-Ereignisse

  • Stellen Sie sicher, dass die Sitzung mit eventTypes: "Deadlock" erstellt wurde

  • Deadlocks müssen tatsächlich auftreten, während die Sitzung läuft

Keine Blocking-Ereignisse

  • Stellen Sie sicher, dass blocked process threshold konfiguriert ist: sp_configure 'blocked process threshold', 5

  • Stellen Sie sicher, dass die Sitzung mit eventTypes: "BlockedProcess" erstellt wurde

  • Blocking muss den konfigurierten Schwellenwert (in Sekunden) überschreiten

Timeout beim Lesen von Ereignissen

Große Ringpuffer mit vielen Ereignissen können beim Parsen langsam sein. Verwenden Sie:

  • Zeitfilter, um den Zeitraum einzugrenzen

  • Erhöhen Sie bei Bedarf das Befehls-Timeout im Code

Sicherheitshinweise

  • Die Umgebungsvariable SQL_SENTINEL_CONNECTION_STRING enthält Anmeldedaten — sichern Sie sie angemessen

  • Lassen Sie Sitzungen in der Produktion nicht unbegrenzt laufen

  • Abfragetexte können sensible Daten enthalten

  • Erteilen Sie nur die mindestens erforderlichen Berechtigungen

Mitwirken

Siehe CONTRIBUTING.md für Richtlinien zum Einreichen von Issues und Pull Requests.

Lizenz

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