mcp-sqlserv
mcp-sqlserv
MCP-сервер для безопасного чтения базы данных SQL Server — защита от SQL-инъекций по построению, управляется через Web Admin UI.
Zero raw SQL · Default deny · Bind parameter 100% · Полный аудит
О проекте
mcp-sqlserv позволяет AI-агентам (Claude, Cursor, Claude Code, любой MCP-клиент) читать базы данных SQL Server безопасно и под полным контролем:
Все запросы формируются на сервере структурно — AI никогда не пишет сырой SQL.
Идентификаторы (таблицы/колонки) проверяются по реальным метаданным базы данных (
sys.tables,sys.columns).Значения всегда передаются как bind parameter → SQL-инъекции исключены по построению.
Разрешения на таблицы работают по принципу default deny: без явного разрешения таблица недоступна.
Каждый запрос фиксируется в журнале аудита с ключом, инструментом, фильтром, количеством строк и длительностью.
Related MCP server: SQL Server MCP
Возможности
Возможность | Описание |
MCP Streamable HTTP | Эндпоинт |
Multi-project | Отдельный URL для каждого проекта |
API Key | Создание / отзыв ключей для каждого AI-потребителя |
OAuth 2.1 | Authorization Code + PKCE, DCR (RFC 7591), refresh rotation, revoke |
Подключение SQL Server | Хост/порт/пользователь/пароль (AES-256-GCM), TLS опционально |
Гранулярные права | Для каждой таблицы: чтение данных и/или просмотр метаданных. Умолчание = DENY |
Журнал аудита | Все запросы AI фиксируются: ключ, инструмент, таблица, фильтр, строки, длительность, статус |
Лимит запросов | 60 запросов/мин на API-ключ (настраивается) |
Полный read-only | Инструменты генерируют только |
Agent Test | Межмодельное взаимодействие с Gemini из Web UI для сквозного тестирования |
Архитектура
┌──────────────┐ HTTPS ┌─────────────┐ ┌──────────────────────────────┐
│ AI Agent ├───────────►│ nginx ├─────────►│ mcp-sqlserv (Docker) │
│ (MCP client)│ Bearer │ reverse │ app-net │ Express + MCP + OAuth │
└──────────────┘ token │ proxy+SSL │ work │ │ │ │
└─────────────┘ │ ▼ ▼ │
┌──────────────┐ HTTPS │ SQLite mssql pool │
│ Web Admin UI ├─────────────────────────────────────►│ (data/, keys, │ │
│ (browser) │ REST /api/* │ audit, izin) ▼ │
└──────────────┘ │ ┌──────────┐ │
│ │ SQL Srvr │ │
└──────────────┴──────────┴────┘Быстрый старт
# 1. Clone & siapkan environment
git clone https://github.com/<username>/mcp-sqlserv.git
cd mcp-sqlserv
cp .env.example .env # isi ADMIN_USER / ADMIN_PASSWORD (min 8 karakter)
# 2. Build & jalankan
docker compose up -d --build
# 3. Verifikasi
curl http://localhost:4000/healthzСервер работает по адресу http://localhost:4000 — Web UI администратора на /, MCP-эндпоинт на /mcp.
Переменные окружения
Переменная | По умолчанию | Описание |
|
| Порт сервера |
|
| Папка с SQLite (монтируется в том при compose) |
|
| Пользователь веб-интерфейса администратора |
| обязательно | Пароль веб-интерфейса администратора (мин. 8 символов) |
| авто | Секрет JWT/шифрования (генерируется автоматически и сохраняется, если пусто) |
|
| Тайм-аут SQL-запроса; |
|
| Частота запросов на API-ключ |
|
| Отключить OAuth с помощью |
|
| Время жизни authorization code (секунды) |
|
| Время жизни access token (секунды) |
|
| Время жизни refresh token (секунды, 30 дней) |
Сценарий использования
Войдите в Web UI → меню Подключение БД → заполните host/port/user/pass/database + Проверка соединения.
Для Docker-контейнера: SQL Server на хосте можно использовать через
host.docker.internal.Меню API Keys → создайте ключ (показан один раз, сохраните!).
Меню Разрешения таблиц → отметьте таблицы, которые AI может читать → Сохранить разрешения. Действует default deny.
Подключите AI-агент к
https://<domain>/mcp+ заголовокAuthorization: Bearer <api-key>.
Подключение универсального MCP-клиента
{
"mcpServers": {
"sql-server": {
"url": "https://<domain>/mcp",
"headers": { "Authorization": "Bearer sk-xxxx" }
}
}
}Быстрая проверка с помощью curl:
curl -X POST https://<domain>/mcp \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'Claude Custom Connector (claude.ai / Desktop)
Откройте Customize → Connectors → Add custom connector.
Remote MCP server URL:
https://<domain>/mcp.Advanced settings → заполните OAuth Client ID + Secret из меню OAuth Clients
(redirect URI:https://claude.ai/api/mcp/auth_callback).Можно оставить пустым — Claude зарегистрируется автоматически через Dynamic Client Registration (RFC 7591).
Нажмите Add → Connect → браузер откроет страницу входа оператора → Разрешить доступ.
Claude сохранит refresh token и будет вызывать MCP-инструменты с bearer-токеном.
Claude Code (CLI):
claude mcp add mcp-sqlserv https://<domain>/mcp --transport http \
... # bila client pre-registered: --client-id <id> --client-secret --callback-portЭндпоинты OAuth
Endpoint | Standard |
| RFC 9728 |
| RFC 8414 |
| RFC 7591 (DCR, public + confidential) |
| RFC 6749 + PKCE S256 |
| RFC 6749 / 7636 |
| RFC 7009 |
Идентичность OAuth = сессия оператора. Access token сопоставляется с внутренним API-ключом oauth:<client_id> — все права на таблицы, ограничение запросов и аудит действуют и для подключений Claude. Отзыв клиента мгновенно аннулирует все его токены.
Инструменты MCP
Инструмент | Назначение |
| Список разрешённых таблиц + примерное количество строк |
| Колонки, типы, nullable, identity, первичные ключи, индексы |
| Чтение строк с структурированным фильтром, сортировка, пагинация |
| Подсчёт строк с необязательным фильтром |
| Получить одну строку по первичному ключу |
| Информация о сервере и базе данных |
Имена таблиц должны быть без уточнения схемой (users, не dbo.users). Колонки проверяются по sys.columns; значения на 100% передаются через bind parameter.
Поддерживаемые структурированные фильтры: eq, neq, lt, lte, gt, gte, like, startsWith, endsWith, in, between, isNull, isNotNull.
Безопасность
Сырой SQL — запрещён — только структурированный построитель запросов
Важный список идентификаторов — регулярные выражения + проверка реальных метаданных БД
Default deny — таблицы без разрешения недоступны
Жёсткие ограничения — максимум 1000 строк/запрос, 20 фильтров, 50 значений IN, тайм-аут 30 сек
API-ключ + rate limit — на каждый ключ + журнал аудита всех запросов
Read-only — рекомендация: для SQL Server достаточно выдать пользователю
GRANT SELECTПароли БД хранятся зашифрованными AES-256-GCM в SQLite
Развёртывание
Разворачивается через Docker Compose в сеть app-network вместе с nginx в роли обратного прокси (wildcard SSL, без буферизации SSE, CORS для веб-MCP-клиентов).
Миграция между VPS
Код и Docker будут работать на любом VPS, но два следующих элемента не попадают в систему контроля версий (они в .gitignore) и должны переноситься вручную:
Что переносится | Содержимое | Способ |
| Учётные данные администратора и секреты | Скопируйте файл с старого VPS или создайте заново из |
| SQLite (API-ключ, права, аудит, подключения в БД) |
|
# Di VPS baru
git clone https://github.com/<username>/mcp-sqlserv.git && cd mcp-sqlserv
# Migrasi state dari VPS lama (opsional)
rsync -av vps-lama:/path/mcp-sqlserv/.env .env
rsync -av vps-lama:/path/mcp-sqlserv/data ./data
# Network eksternal harus ada dulu (dipakai docker-compose.yaml)
docker network create app-network # abaikan jika sudah ada
docker compose up -d --buildБез переноса
data/сервер продолжит работать — нужно будет просто заново указать подключение к БД, создать API-ключи и настройить права таблиц через Web UI.
Структура проекта
mcp-sqlserv/
├── src/
│ ├── index.ts # Bootstrap Express + routing
│ ├── config.ts # Env config
│ ├── db/storage.ts # SQLite: api_keys, db_config, permissions, audit_log
│ ├── sqlserver/ # Connection pool, metadata (sys.tables), query builder
│ ├── mcp/ # MCP server (per-session) + tools
│ ├── oauth/ # OAuth 2.1: router, PKCE, discovery
│ ├── api/ # REST admin (auth, config, keys, permissions, audit)
│ └── ui/ # SPA vanilla JS (public/)
├── public/ # Web UI admin (tanpa build step)
├── test/ # Test suite keamanan + OAuth + smoke
├── Dockerfile # Multi-stage build (node:20-alpine)
├── docker-compose.yaml # Attach ke app-network, host.docker.internal
└── LICENSE # MITREST API администратора
Метод | Адрес | Описание |
POST |
| Вход администратора (cookie httpOnly) |
GET |
| Статус БД, ключей, прав |
GET/PUT |
| Чтение / сохранение конфигурации БД |
POST |
| Проверка соединения |
GET/POST |
| Список / создание API-ключей |
PUT/DELETE |
| Переименование / отзыв |
GET/PUT |
| Список / сохранение прав на таблицы |
GET |
| Журнал аудита |
GET |
| Информация об URL MCP и пример конфига |
GET |
| Проверка доступности (без авторизации) |
Тестирование
npm run test:smoke # smoke test dasar
npm run test:security # 29 test: injection, permission, limit, pagination, auth
npm run test:oauth # 46 test: discovery, DCR, PKCE, consent, token, refresh, revoketest/oauth.mjs запускает свой сервер на порту 4000 (каталог данных oauth-test-data/) — дополнительная настройка не требуется.
Участие в разработке
Помощь приветствуется! Открывайте issue или pull request. Для крупных изменений сначала обсудите их через issue, чтобы они соответствовали принципу продукта: безопасность — это продукт — каждый слой (MCP, UI, Agent Test) должен сохранять одинакове стандарты: read-only, default-deny, параметризованные запросы.
Лицензия
Этот проект лицензирован под MIT License.
Related MCP Connectors
Guard AI agents' PostgreSQL/MySQL access via MCP: SQL audit, auth, masking, write approval
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to securely connect to and query Microsoft SQL Server databases with read-only access, schema discovery, and relationship mapping. Features advanced security protections, health monitoring, and bulk operations for production environments.963 npmMIT
- AlicenseBqualityDmaintenanceAn MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.4912 npm4MIT
- AlicenseNot gradedqualityCmaintenanceProvides read-only Microsoft SQL Server database access to AI agents with row-level security, enabling SELECT queries, table metadata, and schema introspection through MCP.15 npmMIT
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server for Microsoft SQL Server that enables AI agents to safely explore and query SQL Server databases.804 npmMIT