SQL MCP Server
SQL MCP Server
Сервер на основе Model Context Protocol, который предоставляет LLM-агентам (Claude Desktop, Claude Code или любому MCP-клиенту) доступ к базе данных Postgres через шесть инструментов только для чтения. Подключите к нему агента и задавайте вопросы вроде «какие клиенты сделали более пяти заказов в прошлом месяце?» — агент сам изучит схему и выполнит запросы к данным с помощью инструментов ниже.
Инструменты
Инструмент | Описание |
| Обзор всех таблиц: имя, описание, размер, количество столбцов |
| Столбцы, типы и связи внешних ключей для одной таблицы |
| Поиск таблиц/столбцов, имя которых соответствует ключевому слову |
| Просмотр реальных строк (по умолчанию 5) |
| Количество строк в таблице |
| Выполнение произвольного запроса |
Related MCP server: mcp-data-gateway
Почему это не «просто обёртка вокруг psycopg2»
Демо Text-to-SQL — обычное дело; по-настоящему сложная часть — и именно на ней сосредоточены усилия этого проекта — сделать execute_select безопасным для передачи LLM, которая будет генерировать произвольный SQL:
Роль Postgres только для чтения. Сервер подключается как
mcp_readonly— роль с привилегиями только наSELECT(см.scripts/init_schema.sql). Даже ошибка в описанных ниже проверках на уровне приложения не может привести к записи.Принудительный режим только для чтения на уровне сессии. Каждое соединение выполняет
SET TRANSACTION READ ONLY(db.py).Проверка выражений (
security.py): допускается только одно выражениеSELECT/WITH— без нескольких инструкций подряд (; DROP TABLE ...), без SQL-комментариев (блокируется протаскивание инструкций через комментарии), а список запрещённых ключевых слов покрываетINSERT/UPDATE/DELETE/DDL/GRANT/и т.д., включаяSELECT ... INTO(который молча создаёт таблицу).Проверка идентификаторов.
describe_table,sample_rowsиcount_rowsпринимают имя таблицы как параметр. Поскольку SQL-идентификаторы нельзя параметризовать плейсхолдерами, имена таблиц проверяются по строгому регулярному выражению и по актуальному списку разрешённых имён, полученному изinformation_schema, — а не просто экранированием строк.Ограничение ресурсов.
statement_timeoutв Postgres предотвращает вышедшие из-под контроля запросы, а на стороне сервера для каждого результата запроса применяется ограничение на количество строк, даже если в запросе LLM не указанLIMIT.
Быстрый старт
git clone <this-repo>
cd sql-mcp-server
pip install -r requirements.txt
# 1. Start Postgres with the sample schema
docker compose up -d
# 2. Generate sample e-commerce data (uses the postgres superuser, not mcp_readonly)
PGUSER=postgres PGPASSWORD=postgres python scripts/generate_sample_data.py
# 3. Configure the server to use the read-only role
cp .env.example .env
# edit .env if you changed the default mcp_readonly password
# 4. Run the tests
pytest
# 5. Run the server (stdio transport, for use with an MCP client)
python -m sql_mcp_server.serverПодключение к Claude Desktop
Добавьте в конфигурацию MCP Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"sql-explorer": {
"command": "python",
"args": ["-m", "sql_mcp_server.server"],
"cwd": "/absolute/path/to/sql-mcp-server",
"env": {
"PGHOST": "localhost",
"PGPORT": "5432",
"PGDATABASE": "sales",
"PGUSER": "mcp_readonly",
"PGPASSWORD": "change_me"
}
}
}
}Перезапустите Claude Desktop и задайте, например, такой вопрос: «Какие таблицы доступны и какая категория товаров приносит наибольшую выручку?»
Пример схемы
orders → order_items → products → categories, плюс customers. Выручка заказа = sum(order_items.quantity * order_items.unit_price). Генератор наполняет базу ~600 клиентами, ~3,500 заказами и несколькими намеренными странностями в данных (отсутствующие email, пара выделяющихся оптовых заказов), чтобы запросы выглядели так, будто работают с реальными данными.
Тестирование
tests/test_security.py и tests/test_tools.py запускаются без базы данных: они проверяют слой валидации напрямую, а функции инструментов — с замоканным слоем БД. Именно это и запускает CI. Сам db.py (слой psycopg2) проверяется на практике запуском сервера с Docker-инстансом Postgres; см. «Быстрый старт» выше.
Структура проекта
sql_mcp_server/
config.py Environment-based settings
security.py SQL/identifier validation (the core safety logic)
db.py psycopg2 access layer
server.py MCP tool definitions
scripts/
init_schema.sql Schema + read-only role setup
generate_sample_data.py Faker-based sample data
tests/
test_security.py Validation logic (18+ cases: injection, stacked
statements, comment smuggling, DDL/DML blocking, etc.)
test_tools.py Tool functions with mocked DBThis server cannot be deployed
Maintenance
Related MCP Connectors
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with PostgreSQL databases through MCP, allowing users to explore database structures, inspect table schemas, and execute read-only SQL queries.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query a PostgreSQL database through a small set of controlled, read-only tools for schema inspection, row lookup, and aggregate statistics.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to execute SQL queries and inspect PostgreSQL database schemas via MCP tools.-
- AlicenseNot gradedqualityDmaintenanceA read-only natural-language database agent that exposes PostgreSQL schema-discovery and SELECT tools via MCP, enabling users to query databases in plain English.MIT