MCP SQLite Server (Read-Only)
MCP SQLite Server (только чтение)
Готовый к продакшену сервер Model Context Protocol, который предоставляет ИИ-агентам безопасный доступ только для чтения к базе данных SQLite (shop.db). Создан с использованием официального Python SDK mcp с транспортом stdio.
Возможности
3 инструмента MCP:
list_tables,describe_table,query_databaseМногоуровневая защита только для чтения: режим только для чтения в URI SQLite +
PRAGMA query_only+ валидатор SQL + проверка кодов операций EXPLAINПроверка запросов: отклоняет
INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/REPLACE/TRUNCATE/ATTACH/DETACH, многооператорные запросы (;), комментарии SQL (--,/* */) и изменяющиеPRAGMA— без ложных срабатываний на строковых литералахПагинация: лимит строк по умолчанию (100), параметры
limit/offset, флаг усечённого выводаЛогирование только в stderr: все логи и трассировки идут в
sys.stderr;stdoutзарезервирован исключительно для JSON-RPCПолные аннотации типов:
mypy --strictбез ошибокTDD: 105 тестов, покрывающих безопасность, слой БД, инструменты MCP, 8 эталонных запросов и защиту stderr
Related MCP server: sqlite-mcp-server
Быстрый старт
Предварительные требования
Python 3.10+
Файл базы данных SQLite (по умолчанию:
./shop.db)
Локальная настройка
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Конфигурация
Скопируйте .env.example и укажите путь к базе данных:
cp .env.example .env
# Edit DATABASE_PATH to point to your SQLite fileИли задайте переменную окружения напрямую:
export DATABASE_PATH=/abs/path/to/shop.dbЗапуск сервера
python -m mcp_server.serverСервер обменивается данными через stdin/stdout с использованием транспорта stdio MCP. Вы не взаимодействуете с ним напрямую — клиент MCP (например, Claude Desktop, ваш ИИ-агент) подключается к нему.
Конфигурации клиента MCP
Стандартный Python
Добавьте это в конфигурацию вашего клиента MCP (например, claude_desktop_config.json у Claude Desktop):
{
"mcpServers": {
"sqlite-shop": {
"command": "python",
"args": ["-m", "mcp_server.server"],
"env": {
"DATABASE_PATH": "/abs/path/to/shop.db"
}
}
}
}Docker
Сначала соберите образ:
docker build -t mcp-shop:latest .Затем настройте ваш клиент MCP:
{
"mcpServers": {
"sqlite-shop": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/abs/path/to/shop.db:/app/shop.db",
"-e", "DATABASE_PATH=/app/shop.db",
"mcp-shop:latest"
]
}
}
}Docker Compose
docker compose up -dИнструменты
list_tables
Выводит список всех пользовательских таблиц и представлений в базе данных (исключая внутренние таблицы sqlite_*).
Параметры: нет
Возвращает:
{
"tables": ["customers", "orders", "order_items", "products"],
"count": 4
}describe_table
Описывает схему таблицы: столбцы, внешние ключи, количество строк и оператор CREATE.
Параметры:
table(строка, обязательный): имя таблицы для описания.
Возвращает:
{
"table": "customers",
"columns": [
{"cid": 0, "name": "id", "type": "INTEGER", "notnull": 0, "default": null, "pk": 1},
{"cid": 1, "name": "first_name", "type": "TEXT", "notnull": 1, "default": null, "pk": 0}
],
"foreign_keys": [],
"row_count": 150,
"sql": "CREATE TABLE customers (...)"
}query_database
Выполняет SQL-запрос только для чтения с поддержкой пагинации.
Параметры:
sql(строка, обязательный): один оператор SQL только для чтения (SELECT,WITH,EXPLAINилиPRAGMAтолько для чтения).limit(целое, необязательный): максимальное количество возвращаемых строк. По умолчанию: 100. Максимум: 1000.offset(целое, необязательный): количество пропускаемых строк. По умолчанию: 0.
Возвращает:
{
"columns": ["id", "first_name"],
"rows": [{"id": 1, "first_name": "Alice"}, {"id": 2, "first_name": "Bob"}],
"row_count": 2,
"truncated": false,
"limit": 100,
"offset": 0
}Когда truncated равен true, доступно больше строк — увеличьте offset, чтобы получить следующую страницу.
Безопасность
Сервер реализует многоуровневую защиту для гарантии доступа только для чтения:
Уровень 1: Подключение SQLite (режим только для чтения в URI)
База данных открывается с file:<path>?mode=ro, что предотвращает запись на уровне движка SQLite. Дополнительно на каждом подключении устанавливается PRAGMA query_only = ON.
Уровень 2: Валидатор SQL-запросов (security.py)
Прежде чем любой запрос достигнет SQLite, он проходит через многоступенчатый валидатор:
Удаление строковых литералов: строковые литералы (
'...',"...") заменяются заполнителями, чтобы ключевые слова внутри данных (например, продукт с названием "Deleted Item") не вызывали ложных срабатываний.Обнаружение комментариев: комментарии SQL (
--,/* */) отклоняются для предотвращения обхода через комментарии.Отклонение многооператорных запросов: любой символ точки с запятой (
;) отклоняется, предотвращая составные запросы.Анализ ключевых слов: первое реальное ключевое слово оператора должно быть
SELECT,WITH,EXPLAINилиPRAGMA. Деструктивные ключевые слова (INSERT,UPDATE,DELETE,DROP,ALTER,CREATE,REPLACE,TRUNCATE,ATTACH,DETACH,VACUUMи т.д.) блокируются.Проверка PRAGMA: разрешены только PRAGMA для чтения (
table_info,database_listи т.д.). Любая PRAGMA с присваиванием (=) или входящая в блок-список изменяющих PRAGMA (journal_mode,synchronous,foreign_keysи т.д.) отклоняется.
Уровень 3: Проверка кодов операций EXPLAIN
В качестве последней защиты запрос пропускается через собственный парсер SQLite с помощью EXPLAIN <query>. Полученный поток кодов операций проверяется на наличие записывающих кодов (OpenWrite, Insert, Delete, Create, Drop и т.д.) и флагов записывающих транзакций. Если таковые обнаружены, запрос отклоняется.
Уровень 4: Очищенные сообщения об ошибках
Все ошибки, возвращаемые клиенту, очищаются — пути файловой системы и внутренние детали удаляются для предотвращения утечки информации.
Тестирование
Тесты используют только временные или in-memory базы данных — никогда не производственную shop.db.
# Run all tests
python -m pytest
# Run with verbose output
python -m pytest -v
# Run a specific test file
python -m pytest tests/test_security.pyПокрытие тестами
Тестовый файл | Покрытие |
| 76 тестов: допустимые запросы, отклонение деструктивных операторов, проверка PRAGMA, отклонение многооператорных запросов, предотвращение обхода через комментарии, обработка строковых литералов |
| 20 тестов: принудительное только чтение, список таблиц, описание схемы, пагинация, усечение, все 8 эталонных запросов |
| 9 тестов: обнаружение инструментов MCP, вызовы инструментов через SDK-клиент, отклонение деструктивных запросов, пагинация, 7 эталонных запросов через инструменты, защита stderr/отсутствие загрязнения stdout |
Статический анализ
# Type checking
python -m mypy
# Linting
python -m ruff check src/ tests/Структура проекта
.
├── .env.example # Environment variable template
├── Dockerfile # Docker containerization
├── docker-compose.yml # Docker Compose config
├── pyproject.toml # Package config, deps, tool settings
├── README.md # This file
├── shop.db # The SQLite database (not included in tests)
├── src/mcp_server/
│ ├── __init__.py
│ ├── config.py # Configuration (DATABASE_PATH, limits, URI builder)
│ ├── db.py # Read-only Database class with introspection + query
│ ├── security.py # SQL validator (multi-layer defense-in-depth)
│ ├── server.py # MCP server entrypoint (stdio transport)
│ ├── tools.py # MCP tool definitions and handlers
│ └── py.typed # PEP 561 marker
└── tests/
├── __init__.py
├── test_db.py # Database layer + benchmark tests
├── test_security.py # Query validator tests
└── test_server.py # MCP server/tool testsЭталонные задачи
Инструменты сервера позволяют ИИ-агенту выполнять следующие аналитические задачи (проверены тестами на контролируемой фикстурной базе данных):
Обнаружение таблиц:
list_tables+describe_table— список всех таблиц и описание схем.Подсчёт с фильтром:
query_databaseсSELECT COUNT(*) FROM customers WHERE country = 'Germany'.Агрегация по странам:
SELECT country, COUNT(*) ... GROUP BY country ORDER BY ... DESC LIMIT 1.Пожизненная ценность клиента: объединение
customers+orders,SUM(total_amount), сортировка по сумме.Эффективность продуктов: объединение
order_items+products, агрегация по количеству и выручке,LIMIT 5.Агрегация по категориям: переход
order_items→products→category, агрегация выручки,LIMIT 3.Фильтрация по дате:
SUM(total_amount) WHERE substr(order_date,1,4) = '2025'.Агрегация заказов: объединение
customers+orders,COUNT(o.id), сортировка по количеству.
Конфигурация
Переменная окружения | По умолчанию | Описание |
|
| Путь к файлу базы данных SQLite |
|
| Лимит строк по умолчанию для результатов запроса (максимум 1000) |
Лицензия
Этот проект предоставляется как есть для демонстрационных целей.
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
- FlicenseNot gradedqualityDmaintenanceExposes a SQLite database to AI assistants with structured, read-safe access. Includes five tools for schema exploration, querying, and sampling data.
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server that enables LLMs to safely explore and query any SQLite database via natural language. It exposes tools for listing tables, describing schemas, and executing SELECT/WITH queries with built-in safety guards like write prevention and row limits.MIT
- FlicenseNot gradedqualityCmaintenanceExposes any SQLite database as read-only MCP tools for AI assistants, enabling listing tables, describing schemas, and running SELECT queries with filtering, ordering, and pagination.
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to query a SQLite database using natural language through the Model Context Protocol (MCP). Includes security guardrails that block destructive SQL operations.
Related MCP Connectors
Explore, query, and inspect SQLite databases with ease. List tables, preview results, and view det…
Read-only MCP server for Muovi, Argentina's trust-first local services marketplace (6 tools).
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
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/ilyassakhanov/my-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server