Skip to main content
Glama

QueryShield

AIエージェントとエンタープライズデータベース間のセキュアなSQLプロキシ。

エージェントは、プレーンな英語(または構造化されたSQL)で単一のエンドポイントを呼び出します。QueryShieldは以下の処理を行います:

  1. プロンプトキャッシングを使用して、Claude経由で自然言語をSQLに変換します。

  2. すべてのクエリをASTレベルで検証します。SELECTのみが許可され、ステートメントの連結、禁止された関数、LIMIT句の欠如は許可されません。

  3. エージェントごとの行レベルセキュリティを適用します:スキーマ/テーブルのホワイトリストおよびWHERE句のインジェクション。

  4. 顧客のDBに対して実行し、行を返します。

  5. すべての試行を追記専用の監査テーブルに記録します。メタデータのみを記録し、行の内容は決して記録しません。

エージェントが接続文字列を見ることはありません。


クイックスタート

pip install -r requirements.txt
cp .env.example .env
# Set ANTHROPIC_API_KEY, DATABASE_URL, VAULT_KEY (see below)

python -m queryshield.start

VAULT_KEY用にFernetキーを一度生成し、紛失しないようにしてください:

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 を作成する

sqlglot ASTがSELECT以外を拒否

エージェントが ; と2つ目のステートメントを忍び込ませる

パーサーが len(statements) > 1 を拒否

エージェントが pg_sleep, xp_cmdshell などを使用する

ASTノードレベルで関数を拒否リスト化

エージェントがスコープ外のテーブルを読み取る

RLSスキーマ + テーブルホワイトリスト

エージェントが他のテナントの行を読み取る

AST .where() を介して row_filters を注入

スタックトレース経由で接続文字列が漏洩する

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 Webhook

目標は $32.5K MRR @ 15顧客 (Pro 10 + Enterprise 5) です。


デプロイ

このリポジトリはRailwayに対応しています。python -m queryshield.start がエントリポイントです(Railwayはシェルなしで開始コマンドを実行するため、os.getenv 経由で PORT を読み取ります)。RailwayのマーケットプレイスからPostgres + (オプションで) Redisをプロビジョニングし、残りは環境変数で設定します。

railway up

/health は生存確認用です。/ready はコントロールプレーンのDBに到達できない場合に503を返します。


テスト

pip install pytest
python -m pytest tests/

42個のテストが以下をカバーしています:

  • ASTの安全性(24ケース — 直接的なDDL、コメント、エンコードされたキーワード、複数のステートメント、禁止された関数、LIMITの欠如)

  • RLSエンジン(6ケース — ホワイトリストの強制、WHERE句の注入、既存の述語との結合)

  • SQLite「顧客DB」に対するプロキシのエンドツーエンドテスト(5ケース — 正常系、ブロックされたDML、RLS行フィルタリング、テーブルホワイトリスト、キャッシュヒット)

  • FastAPI TestClient経由のHTTP統合(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