QueryShield
QueryShield
Безопасный SQL-прокси между ИИ-агентами и корпоративными базами данных.
Агенты обращаются к единой конечной точке на обычном английском языке (или структурированном SQL). QueryShield:
Переводит естественный язык в SQL через Claude с использованием кэширования промптов.
Проверяет каждый запрос на уровне AST — разрешены только
SELECT, никаких объединенных операторов, никаких запрещенных функций, обязателен LIMIT.Применяет безопасность на уровне строк для каждого агента: белые списки схем/таблиц и внедрение условий
WHERE.Выполняет запрос к БД клиента и возвращает строки.
Логирует каждую попытку в таблицу аудита, доступную только для добавления — только метаданные, никакого содержимого строк.
Агенты никогда не видят строки подключения.
Быстрый старт
pip install -r requirements.txt
cp .env.example .env
# Set ANTHROPIC_API_KEY, DATABASE_URL, VAULT_KEY (see below)
python -m queryshield.startСгенерируйте ключ Fernet для VAULT_KEY один раз и никогда не теряйте его:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"Сквозной поток (curl)
# 1) Boot a tenant. Returns the admin API key — copy it.
curl -X POST localhost:8000/v1/tenants?name=Acme
# 2) Register the customer DB. Connection string is encrypted at rest.
curl -X POST localhost:8000/v1/databases \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"alias": "prod",
"db_type": "postgresql",
"connection_string": "postgresql://reader:secret@db.acme.internal:5432/app",
"allowed_tables": ["users", "orders"]
}'
# 3) Provision a scoped agent (different from admin) for your AI app.
curl -X POST localhost:8000/v1/agents \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{ "name": "reporting", "tenant_id": "<tenant>" }'
# 4) Set the agent's RLS policy.
curl -X POST localhost:8000/v1/policies \
-H 'X-Admin-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"agent_id": "<agent>",
"database_alias": "prod",
"allowed_tables": ["users", "orders"],
"row_filters": { "users": "tenant_id = 42" }
}'
# 5) The agent queries.
curl -X POST localhost:8000/v1/query \
-H 'X-API-Key: qs_...' \
-H 'Content-Type: application/json' \
-d '{
"database_alias": "prod",
"query": "how many active users do we have?",
"mode": "nl",
"max_rows": 10
}'Интеграция с MCP
Указан в официальном реестре MCP как io.github.bch1212/queryshield.
Установите клиент:
pip install queryshield-mcpЗатем добавьте это в конфигурацию Claude Desktop / Cursor / агента:
{
"queryshield": {
"command": "queryshield-mcp",
"env": { "QUERYSHIELD_API_KEY": "qs_..." }
}
}Исходный код автономного пакета PyPI находится в packages/queryshield-mcp/.
Интеграция с MCP (устаревшая)
Добавьте это в любой клиент с поддержкой MCP (Claude Desktop, Cursor, пользовательские агенты):
{
"queryshield": {
"command": "python",
"args": ["-m", "queryshield.mcp_server"],
"env": {
"QUERYSHIELD_API_KEY": "qs_...",
"QUERYSHIELD_BASE_URL": "https://api.queryshield.io"
}
}
}Доступные инструменты:
query_database(database_alias, question, max_rows)— естественный языкquery_database_sql(database_alias, sql, max_rows)— готовый SELECTget_audit_log(limit)— недавние попытки для вызывающего агента
Модель безопасности
Угроза | Защита |
Агент создает | AST sqlglot отклоняет всё, кроме SELECT |
Агент добавляет | парсер отклоняет |
Агент использует | черный список функций на уровне узлов AST |
Агент читает таблицы вне своей области доступа | RLS схема + белый список таблиц |
Агент читает строки других арендаторов |
|
Утечка строки подключения через трассировку стека | шифрование Fernet, никогда не возвращается в API |
Аудит-лог становится вектором утечки данных | хранятся только метаданные — никогда строки |
Ротация | повторное шифрование строк новым ключом (через скрипт) |
safety.py — самый важный модуль. Каждая дополнительная проверка,
которая туда добавляется, должна сопровождаться тестом в tests/test_safety.py.
Тарифы
Тариф | В месяц | Базы данных | Запросов / месяц | Примечания |
Starter | $500 | 3 | 1,000,000 | |
Pro | $1,500 | 10 | 10,000,000 | экспорт аудита |
Enterprise | $3,500 | безлимит | безлимит | SSO, вебхук SIEM |
Цель: $32.5K MRR при 15 клиентах (10 Pro + 5 Enterprise).
Развертывание
Репозиторий готов к работе с Railway. python -m queryshield.start — точка входа
(считывает PORT через os.getenv, так как Railway выполняет команду запуска без
оболочки). Подготовьте Postgres + (опционально) Redis из маркетплейса Railway, остальное — переменные окружения.
railway up/health — проверка работоспособности. /ready возвращает 503, если БД управления
недоступна.
Тесты
pip install pytest
python -m pytest tests/42 теста покрывают:
Безопасность AST (24 случая — прямой DDL, комментарии, закодированные ключевые слова, множественные операторы, запрещенные функции, отсутствие LIMIT)
Механизм RLS (6 случаев — применение белого списка, внедрение WHERE, конъюнкция с существующими предикатами)
Сквозное тестирование прокси с SQLite "клиентской БД" (5 случаев — успешный путь, блокировка DML, фильтрация строк RLS, белый список таблиц, попадание в кэш)
HTTP-интеграция через FastAPI TestClient (7 случаев — полная подготовка → поток запросов, агент с ограниченными правами и RLS, ошибки аутентификации)
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/bch1212/queryshield'
If you have feedback or need assistance with the MCP directory API, please join our Discord server