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 parameterSQL-инъекции исключены по построению.

  • Разрешения на таблицы работают по принципу default deny: без явного разрешения таблица недоступна.

  • Каждый запрос фиксируется в журнале аудита с ключом, инструментом, фильтром, количеством строк и длительностью.

Related MCP server: safedb-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.

A
license - permissive license
Not graded
quality - not tested
C
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

  • 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
    75
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Secure MCP server for safe, read-only DB access by AI agents, with SQL guardrails, table allowlists, PII masking, and audit logs
    6
    34
    7
    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
    23
    4
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to connect to Microsoft SQL Server via the MCP protocol, supporting database schema queries, data reading, and arbitrary SQL execution.

View all related MCP servers

Related MCP Connectors

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/Fattan-malva/mcp-sqlserver'

If you have feedback or need assistance with the MCP directory API, please join our Discord server