io.github.tkmawarire/sql-sentinel
SQL Sentinel MCP Server
Готовый к продакшену MCP-сервер (Model Context Protocol) для мониторинга SQL Server, диагностики и операций с базами данных. Создан на .NET 9 и Microsoft.Data.SqlClient для нативного подключения к SQL Server — не требуются драйверы ODBC.
Возможности
Управление сеансами — создание, запуск, остановка, удаление и вывод списка сеансов расширенных событий
Умная фильтрация — фильтрация по приложению, базе данных, пользователю, длительности, узлу и текстовым шаблонам
Фингерпринтинг запросов — нормализация и группировка похожих запросов, различающихся только литеральными значениями
Анализ последовательности — трассировка порядка выполнения с временными интервалами и совокупной длительностью
Обнаружение взаимоблокировок — сбор и анализ XML-отчетов о взаимоблокировках с деталями о жертве и процессах
Анализ блокировок — мониторинг событий заблокированных процессов с ресурсом ожидания и текстом SQL
Статистика ожиданий — прямой запрос к
sys.dm_os_wait_stats, классифицированный по типу (CPU, I/O, Lock, Memory и т.д.)Проверка работоспособности — комплексная диагностика сервера: медленные запросы, взаимоблокировки, блокировки, статистика ожиданий и аналитика
Потоковая передача в реальном времени — трансляция захваченных событий в течение заданного времени
Безопасен для продакшена — автоматическое исключение шума (
sp_reset_connection, операторыSET, трассировочные запросы)Операции с базами данных — список таблиц, описание схем, запросы данных, вставка, обновление и удаление таблиц
Оптимизировано для ИИ — структурированный вывод 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;
Установка
Вариант 1: 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Сетевой доступ: флаг
-iобязателен для stdio-транспорта. Используйте--network host, чтобы контейнер мог подключиться к SQL Server на вашей хост-машине. Для удаленного SQL Server опустите--network hostи используйте доступное имя узла в строке подключения.Строка подключения: задайте
SQL_SENTINEL_CONNECTION_STRINGчерез-e. Все инструменты читают строку подключения из этой переменной окружения.
Вариант 2: глобальный инструмент .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"
}
}
}
}Вариант 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
Жизненный цикл сеанса
Инструмент | Описание |
| Создать сеанс расширенных событий с фильтрами (не запущен) |
| Начать захват событий для существующего сеанса |
| Остановить захват; события сохраняются |
| Удалить сеанс и отбросить все события |
| Вывести список всех сеансов, созданных MCP, с состоянием и использованием буфера |
| Создать и запустить сеанс за один шаг |
Получение событий
Инструмент | Описание |
| Получить захваченные события с фильтрацией, сортировкой и дедупликацией |
| Агрегировать статистику, сгруппированную по отпечатку, базе данных, приложению или логину |
| Проанализировать последовательность выполнения запросов с таймингами и промежутками |
| Вывести список баз данных, приложений, логинов, сеансов и информацию о блокировках |
| Захватывать события в реальном времени в течение заданного времени (1–300 с) |
Диагностика
Инструмент | Описание |
| Получить события взаимоблокировок с жертвой, процессами, блокировками и текстом SQL |
| Получить события заблокированных процессов с ресурсами ожидания и текстом SQL |
| Запросить |
| Комплексный отчет: медленные запросы, взаимоблокировки, блокировки, статистика ожиданий, аналитика |
Разрешения
Инструмент | Описание |
| Проверить разрешения текущего логина и конфигурацию порога заблокированных процессов |
| Предоставить необходимые разрешения логину (требуется sysadmin) |
Операции с базами данных
Инструмент | Описание |
| Вывести список всех пользовательских таблиц в базе данных (с указанием схемы) |
| Подробная схема таблицы: столбцы, индексы, ограничения, внешние ключи |
| Создать новую таблицу с помощью оператора 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 предоставляет REST-обертку для всех инструментов MCP с 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
Автоматическое обнаружение инструментов — инструменты MCP обнаруживаются в сборке через
WithToolsFromAssembly()Префикс сеансов XE — всем созданным сеансам присваивается префикс
mcp_sentinel_Две формы событий — стандартные события (query, login, recompile) с типизированными полями и события с XML-нагрузкой (deadlock, blocking), разбираемые из XML расширенных событий
Добавление нового инструмента MCP
Создайте метод
public staticв соответствующем файле вTools/(или создайте новый файл)Добавьте атрибуты
[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);
}Устранение неполадок
"Permission denied" при создании сеанса
GRANT ALTER ANY EVENT SESSION TO [your_login];
GRANT VIEW SERVER STATE TO [your_login];"Login failed"
Проверьте учетные данные строки подключения
Для проверки подлинности 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содержит учетные данные — обеспечьте соответствующую защитуНе оставляйте сеансы работающими бессрочно в продакшене
Текст запросов может содержать конфиденциальные данные
Предоставляйте минимально необходимые разрешения
Участие в разработке
См. 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