Skip to main content
Glama
Fattan-malva

mcp-sqlserv

by Fattan-malva

mcp-sqlserv

MCP-сервер для безопасного чтения базы данных SQL Server — защита от SQL-инъекций по построению, управляется через Web Admin UI.

License: MIT Node TypeScript Docker MCP Tests

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

Эндпоинт /mcp, совместим со всеми MCP-клиентами через HTTP

Multi-project

Отдельный URL для каждого проекта /mcp/<projectId>, хранилища и права изолированы

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

Инструменты генерируют только SELECT; путей записи не существует

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.

Переменные окружения

Переменная

По умолчанию

Описание

PORT

4000

Порт сервера

DATA_DIR

./data

Папка с SQLite (монтируется в том при compose)

ADMIN_USER

admin

Пользователь веб-интерфейса администратора

ADMIN_PASSWORD

обязательно

Пароль веб-интерфейса администратора (мин. 8 символов)

SESSION_SECRET

авто

Секрет JWT/шифрования (генерируется автоматически и сохраняется, если пусто)

QUERY_TIMEOUT_MS

30000

Тайм-аут SQL-запроса;

RATE_LIMIT_PER_MIN

60

Частота запросов на API-ключ

OAUTH_ENABLED

1

Отключить OAuth с помощью 0

OAUTH_CODE_TTL_S

600

Время жизни authorization code (секунды)

OAUTH_ACCESS_TTL_S

3600

Время жизни access token (секунды)

OAUTH_REFRESH_TTL_S

2592000

Время жизни refresh token (секунды, 30 дней)

Сценарий использования

  1. Войдите в Web UI → меню Подключение БД → заполните host/port/user/pass/database + Проверка соединения.

    Для Docker-контейнера: SQL Server на хосте можно использовать через host.docker.internal.

  2. Меню API Keys → создайте ключ (показан один раз, сохраните!).

  3. Меню Разрешения таблиц → отметьте таблицы, которые AI может читать → Сохранить разрешения. Действует default deny.

  4. Подключите 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)

  1. Откройте Customize → Connectors → Add custom connector.

  2. Remote MCP server URL: https://<domain>/mcp.

  3. Advanced settings → заполните OAuth Client ID + Secret из меню OAuth Clients
    (redirect URI: https://claude.ai/api/mcp/auth_callback).

    Можно оставить пустым — Claude зарегистрируется автоматически через Dynamic Client Registration (RFC 7591).

  4. Нажмите Add → Connect → браузер откроет страницу входа оператора → Разрешить доступ.

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

GET /.well-known/oauth-protected-resource

RFC 9728

GET /.well-known/oauth-authorization-server

RFC 8414

POST /oauth/register

RFC 7591 (DCR, public + confidential)

GET /oauth/authorize (login operator + consent)

RFC 6749 + PKCE S256

POST /oauth/token (code exchange + refresh rotation)

RFC 6749 / 7636

POST /oauth/revoke

RFC 7009

Идентичность OAuth = сессия оператора. Access token сопоставляется с внутренним API-ключом oauth:<client_id> — все права на таблицы, ограничение запросов и аудит действуют и для подключений Claude. Отзыв клиента мгновенно аннулирует все его токены.

Инструменты MCP

Инструмент

Назначение

list_tables

Список разрешённых таблиц + примерное количество строк

get_table_schema

Колонки, типы, nullable, identity, первичные ключи, индексы

read_records

Чтение строк с структурированным фильтром, сортировка, пагинация

count_records

Подсчёт строк с необязательным фильтром

get_record_by_pk

Получить одну строку по первичному ключу

server_info

Информация о сервере и базе данных

Имена таблиц должны быть без уточнения схемой (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) и должны переноситься вручную:

Что переносится

Содержимое

Способ

.env

Учётные данные администратора и секреты

Скопируйте файл с старого VPS или создайте заново из .env.example

data/

SQLite (API-ключ, права, аудит, подключения в БД)

rsync / скопируйте папку со старого VPS

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

REST API администратора

Метод

Адрес

Описание

POST

/api/auth/login

Вход администратора (cookie httpOnly)

GET

/api/status

Статус БД, ключей, прав

GET/PUT

/api/config

Чтение / сохранение конфигурации БД

POST

/api/config/test

Проверка соединения

GET/POST

/api/keys

Список / создание API-ключей

PUT/DELETE

/api/keys/:id

Переименование / отзыв

GET/PUT

/api/permissions

Список / сохранение прав на таблицы

GET

/api/audit

Журнал аудита

GET

/api/connect

Информация об URL MCP и пример конфига

GET

/healthz

Проверка доступности (без авторизации)

Тестирование

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

test/oauth.mjs запускает свой сервер на порту 4000 (каталог данных oauth-test-data/) — дополнительная настройка не требуется.

Участие в разработке

Помощь приветствуется! Открывайте issue или pull request. Для крупных изменений сначала обсудите их через issue, чтобы они соответствовали принципу продукта: безопасность — это продукт — каждый слой (MCP, UI, Agent Test) должен сохранять одинакове стандарты: read-only, default-deny, параметризованные запросы.

Лицензия

Этот проект лицензирован под MIT License.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    9
    63 npm
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.
    49
    12 npm
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server for Microsoft SQL Server that enables AI agents to safely explore and query SQL Server databases.
    804 npm
    MIT