Skip to main content
Glama

QueryShield

Безопасный SQL-прокси между ИИ-агентами и корпоративными базами данных.

Агенты обращаются к единой конечной точке на обычном английском языке (или структурированном SQL). QueryShield:

  1. Переводит естественный язык в SQL через Claude с использованием кэширования промптов.

  2. Проверяет каждый запрос на уровне AST — разрешены только SELECT, никаких объединенных операторов, никаких запрещенных функций, обязателен LIMIT.

  3. Применяет безопасность на уровне строк для каждого агента: белые списки схем/таблиц и внедрение условий WHERE.

  4. Выполняет запрос к БД клиента и возвращает строки.

  5. Логирует каждую попытку в таблицу аудита, доступную только для добавления — только метаданные, никакого содержимого строк.

Агенты никогда не видят строки подключения.


Быстрый старт

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) — готовый SELECT

  • get_audit_log(limit) — недавние попытки для вызывающего агента


Модель безопасности

Угроза

Защита

Агент создает DROP TABLE

AST sqlglot отклоняет всё, кроме SELECT

Агент добавляет ; и второй оператор

парсер отклоняет len(statements) > 1

Агент использует pg_sleep, xp_cmdshell, ...

черный список функций на уровне узлов AST

Агент читает таблицы вне своей области доступа

RLS схема + белый список таблиц

Агент читает строки других арендаторов

row_filters внедряются через AST .where()

Утечка строки подключения через трассировку стека

шифрование Fernet, никогда не возвращается в API

Аудит-лог становится вектором утечки данных

хранятся только метаданные — никогда строки

Ротация VAULT_KEY

повторное шифрование строк новым ключом (через скрипт)

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, ошибки аутентификации)

A
license - permissive license
-
quality - not tested
C
maintenance

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