Lomberk について
Lomberkは、AIエージェントを使うチーム向けのPostgreSQLゲートウェイです。データベース認証情報を渡さずにSQLをポリシー検査に通し、破壊的な文を拒否し、指定した書き込みを人の承認まで保留して、外部キーのカスケードを含む変更を記録・取り消せます。
主な機能
- 01エージェント書き込みのSQLポリシー検査
- 02破壊的なSQLコマンドの拒否
- 03リスクの高い書き込みの承認保留
- 04変更行の記録と書き込みの取り消し
- 05チェックポイントとエージェント履歴の確認
活用シーン
- 01DB認証情報を渡さずにPostgreSQLを更新
- 02保護対象テーブルへの書き込みを承認制にする
- 03承認前に保留中の書き込みの影響を確認
- 04カスケードを含む適用済み書き込みの取り消し
MCP 対応
Lomberkは、SQL実行、テーブル説明、承認待ち、チェックポイント状態、変更一覧のツールをMCPクライアントに公開します。Streamable HTTPとローカルstdioで動作します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx lomberkLOMBERK_CONFIGAbsolute path to the lomberk.yaml that `lomberk setup` wrote. The connection strings and keys are read from the .env beside it.LOMBERK_AGENT_DSNシークレットConnection string for the low-privilege role the agent's SQL runs as. Only needed when the .env beside lomberk.yaml doesn't set it.LOMBERK_ADMIN_DSNシークレットConnection string for the control role that owns the lomberk schema (checkpoints, undo, ledger). Only needed when the .env beside lomberk.yaml doesn't set it.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Lomberk
エージェントによるすべての書き込みを、取り消し可能に。 LomberkはPostgreSQL向けのMCPゲートウェイです。AIエージェントはデータベースの認証情報を保持する代わりに、ここを通じてSQLを送信します。破壊的なコマンドをブロックし、大規模または機密性の高い書き込みは人間の承認待ちにし、変更されたすべての行を記録します。また、外部キーによるカスケードも含め、適用済みの書き込みを取り消せます。
Claude Code用の安全装置だけをお探しですか? Lomberk Seatbeltは、DROP、TRUNCATE、WHEREのないDELETE、prisma migrate reset、dropdbなどの前にエージェントに確認を求めさせる無料のプラグインです。2つのコマンドでインストールできます。
クイックスタート(60秒)
uvと、PostgreSQL 14以降のデータベースの所有者の接続文字列が必要です(ロールを作成できるロール:Supabase、Neon、RDSではpostgres)。
uvx lomberk setup # asks for the owner connection string; what you type stays out of your shell history
スクリプトでは、代わりにLOMBERK_INSTALL_DSNを設定し、--yesを追加してください。
セットアップでは、生成したパスワードを使って最小権限のロールを2つ作成し、Lomberkをインストールしてテーブルを一覧表示し、選択したテーブルを取り消し可能にします。その後、lomberk.yamlと非公開の.env(モード600)を書き込み、それらに対してlomberk doctorを実行します。既存のロールやファイルを変更することはありません。所有者の接続文字列は一度だけ使用され、保存されません。最後に、次のようなMCPクライアント用の行が表示されます。
claude mcp add lomberk -e LOMBERK_CONFIG=/path/to/lomberk.yaml -- uvx lomberk serve
Cursor、Claude Desktop、VS Code、Codex用の設定スニペットも表示されます。その後、エージェントに何かを変更するよう依頼してください。
lomberk log # what your agents changed, newest first
lomberk undo cp_… # put it back, cascades included
lomberk approve cp_… # let a held write run (or: lomberk reject cp_…)
lomberk doctor # check the setup any time
Supabase、Neon、RDS、Railwayについては、docs/hosted-postgres.mdを参照してください。Supabaseでは、セッションプーラーの接続文字列(IPv4)を使用してください。セットアップ時に、そこからlomberk_agent.<project-ref>というログイン名が生成されます。
エージェントが利用できる機能
| ツール | |
|---|---|
execute_sql | ハードゲート、ポリシー、記録を通じて1つのステートメントを実行します。チェックポイント(cp_…)、APPROVAL REQUIRED、または拒否された理由を返します |
describe_tables | 利用可能なテーブルとその列(秘密情報を含む列は非表示)、および人間の承認待ちとなる書き込みを表示します |
wait_for_approval | 保留中の書き込みについて、人間が承認または拒否するまで進捗を報告しながら待機し、実行されたかどうかを伝えます |
checkpoint_status | 書き込みの状態(承認待ち、適用済み、拒否、取り消し済み)を表示します |
list_my_changes | 取り消し対象を特定できるよう、トークン付きでエージェント自身の最近の書き込みを表示します |
エージェントは承認も取り消しもできません。これらの操作には管理者キー、CLI、または(Pro)Slack、SSO、パネルが必要です。
9秒間のデータベース削除デモ
2026年4月、自律型コーディングエージェントが過剰な権限を持つインフラストラクチャトークンを使い、本番データベースを9秒で削除しました。Lomberkはもう一つの侵入口、つまりエージェント自身のデータベースアクセスを塞ぎます。SQLがLomberkを経由する場合、悪意のあるエージェントに何ができ、何ができないのかをご覧ください。

1. スタックを起動する
git clone https://github.com/ege-usta/lomberk && cd lomberk
docker compose up -d --build
curl localhost:8000/readyz # {"status":"ready"}
これにより、デモ用のpocketosデータベース(users ← payments、ON DELETE CASCADEを使用)が起動し、最小権限のロールを2つ使ってLomberkがインストールされ、両方のテーブルが登録されて、ゲートウェイが起動します。
2. エージェントを接続する(URLとキーだけが渡されます)
claude mcp add --transport http lomberk http://localhost:8000/mcp \
--header "Authorization: Bearer demo-agent-key"
Streamable HTTPに対応するMCPクライアントなら、どれでも同じように動作します。
3. エージェントが暴走した場合
| エージェントが送信する内容 | Lomberk |
|---|---|
DROP TABLE public.users | 拒否:DDL は構造上禁止されています |
DELETE FROM public.users | 拒否:WHERE のない書き込みです |
DELETE FROM public.users WHERE id > 0 | 保留:public.users は保護されています → 承認が必要です。トークン:cp_… |
UPDATE public.payments SET amount = 0 WHERE id > 0 | 適用。チェックポイントが作成されます:保護されていないテーブルの 2 行です。元に戻す操作を 1 回行うと、以前の金額に戻ります |
max_rows_without_approval(デモでは 10)を超える行に対する同じ書き込み | 保留:実行され、件数が記録されてロールバックされました。現在は人の判断待ちです |
4. 人が判断します(管理者キーはエージェントに決して渡しません)
H="X-API-Key: demo-admin-key"
curl -H "$H" localhost:8000/v1/checkpoints/pending
curl -H "$H" "localhost:8000/v1/checkpoints?status=applied" # recent writes, to find the cp_ to undo
curl -H "$H" -X POST localhost:8000/v1/checkpoints/cp_…/approve # or /reject
curl -H "$H" -X POST localhost:8000/v1/checkpoints/cp_…/undo # users AND cascaded payments come back
保留中のリクエストは agent.approval_timeout_minutes 経過後に期限切れになります。まず GET /v1/checkpoints/cp_… または lomberk show cp_… で正確な SQL を確認してください。
SQL だけでなく、行も確認できます。 書き込みが保留されると、Lomberk はそれを 1 回実行し、変更内容を記録してロールバックします。そのため、承認者は判断する前に、カスケードを含む影響を確認できます。
$ lomberk show cp_… # the agent sent: DELETE FROM public.users WHERE id = 1
would change: 2 row(s) in public.users (1), public.payments (1) (dry run when held)
delete public.users {"id": "1"}: {"id": 1, "name": "Alice CEO", "plan": "enterprise", "email": "[email protected]", …}
delete public.payments {"id": "1"}: {"id": 1, "amount": 1000.0, "status": "success", "user_id": 1}
同じプレビューはウェブパネルと API でも確認できます。Slack には件数のみが表示されます。機密列はマスクされ、エージェントのロールから隠されている列は表示されません。重複キーや親レコードの欠落など、失敗する書き込みは人の判断待ちにせず、直ちに拒否されます。プレビューは保留された時点のスナップショットです。テーブル自身のトリガーがロールバックで取り消せない処理を行う場合は、approvals.preview: false を設定してください。
設定(lomberk.yaml)
limits:
max_rows_without_approval: 10 # larger writes are rolled back and held
statement_timeout_ms: 15000
protected_tables: # any write, or FK cascade, reaching these is held
- public.users
sensitive_columns: # like `password`: never shown to the agent, hidden by the DB on register
- pass
- settings # a JSON column that holds secrets
agent:
approval_timeout_minutes: 30
不明なキーがあると起動に失敗するため、タイプミスによって保護が気付かないうちに無効になることはありません。ゲートウェイは ./lomberk.yaml を読み込みます。別の場所から起動する場合(MCP クライアントは通常、別のディレクトリから lomberk serve を起動します)は、LOMBERK_CONFIG にファイルの絶対パスを設定してください。そのファイルが見つからない場合、起動は拒否されます。./lomberk.yaml が見つからない場合は警告のみが表示され、デフォルト設定(保護対象テーブルなし)で実行されます。
環境変数:LOMBERK_CONFIG(lomberk.yaml のパス)、LOMBERK_ADMIN_DSN(制御ロール)、LOMBERK_AGENT_DSN(エージェントロール)、LOMBERK_API_KEY(エージェント)、LOMBERK_ADMIN_KEY(承認者)、LOMBERK_AUDIT_LOG(JSONL パス)、LOMBERK_LICENSE_KEY(Pro)、LOMBERK_METRICS_KEY(/metrics を有効化)。キーには 32 文字以上のランダムな文字列を使用してください(openssl rand -hex 32)。LOMBERK_ALLOW_WEAK_KEYS=true を設定しない限り(ノート PC でのデモのみ)、ゲートウェイは脆弱なキーやデモ用キーを拒否します。
自分のデータベースへのインストール
pip install lomberk # Slack and SSO: pip install "lomberk[pro]"; or: docker build -t lomberk .
export LOMBERK_INSTALL_DSN=postgresql://owner@db/app # used only for install
# first, as that owner: CREATE ROLE lomberk_control LOGIN PASSWORD '...'; CREATE ROLE lomberk_agent LOGIN PASSWORD '...';
lomberk init --control-role lomberk_control --agent-role lomberk_agent
lomberk register public.orders --agent-role lomberk_agent # repeat per table (and FK children)
lomberk verify-ledger # tamper-evidence check
エージェントができない操作と、実際の攻撃 20 件に対する正確な拒否内容:docs/attack-gallery.md。
Supabase、Neon、Amazon RDS、Railway の手順(ロール、接続文字列、RLS、updated_at トリガー):docs/hosted-postgres.md。
Lomberk の導入前によくある質問:docs/faq.md。
サービスを使わずにローカルで単一ユーザー開発を行う場合:lomberk serve(stdio MCP)。シェルアクセス権を持つエージェントとこのモードを使用しないでください。SECURITY.md を参照してください。
チーム機能(Solo および Pro)
ウェブパネルと監査ログのエクスポートは Solo および Pro に付属します。Slack での承認、承認者の SSO、2 人承認ルールは Pro の機能です。
Slack での承認と承認者の SSO には追加ライブラリが必要です:pip install "lomberk[pro]"、または uvx --from "lomberk[pro]" lomberk serve を実行してください。Docker イメージには含まれています。ライブラリがない場合、ゲートウェイは必要なインストール方法を表示して起動を拒否します。
Slack で承認する(Pro)
slack/app-manifest.json からアプリを作成し(bot スコープは chat:write のみ、Socket Mode のため公開 URL は不要です)、承認用チャンネルにボットを招待してから、次を実行します。
slack:
channel_id: C0123APPROVALS
team_allowlist: [T0123]
admin_allowlist: [U0ALICE, U0BOB] # only these users' clicks count
include_sql: false # default: SQL never leaves for Slack
LOMBERK_SLACK_ENABLED=true LOMBERK_SLACK_APP_TOKEN=xapp-… LOMBERK_SLACK_BOT_TOKEN=xoxb-…
保留中のリクエストはすべて「承認」/「拒否」ボタンとともに投稿され、メッセージは最終状態に更新されます。承認者の Slack ID は監査ログに記録されます。
承認者 SSO(Pro)
承認者は会社の ID プロバイダー(Okta、Microsoft Entra ID、Google、Keycloak、任意の OIDC 発行者)でサインインし、ID トークンを送信します。監査ログには共有キーではなく、個人(oidc:[email protected])が記録されます。
sso:
issuer: https://corp.okta.com # keys are discovered from the issuer
audience: lomberk-approvals # the client ID registered for Lomberk
allowed_groups: [db-approvers] # and/or allowed_identities: [[email protected]]
# allow_admin_key: true # the shared key is OFF once SSO is on; CLI stays as break-glass
curl -H "Authorization: Bearer $ID_TOKEN" -X POST localhost:8000/v1/checkpoints/cp_…/approve
この発行者とオーディエンスに対して、非対称署名(RS/PS/ES)付きのトークンのみが受け付けられ、有効期限が切れていない必要があります。デフォルトの identity_claim: email では、トークンでメールアドレスが検証済みとして示されている必要があります。Entra ID はこのフラグを送信しないため、そちらでは identity_claim を upn または oid に設定してください。
Web 承認パネル(Pro)
https://<gateway>/panel/ を開くと、承認待ちの書き込み、承認者が記録された履歴、ワンクリックでの取り消し、エクスポートを確認できます。承認者は SSO または管理者キーでサインインします。「SSO でサインイン」を提供するには、IdP で <panel_url>/panel/sso/callback をリダイレクト URI として登録してください。
sso:
# ...the SSO settings above, with audience = the panel's client ID
panel_url: https://lomberk.corp.com # public https URL of this gateway
IdP でそのクライアントにクライアントシークレットが必要な場合は、LOMBERK_SSO_CLIENT_SECRET を設定してください。
2 人ルール(Pro)
approvals:
required: 2 # a held write runs only after two different people approve it
検証済みの ID のみが対象です。N 人全員が SSO(パネルまたは API)経由で承認するか、全員が Slack 経由で承認する必要があります。1 人が両方を利用できるため、システムを混在させても人数には加算されません。管理者キーと CLI による承認は記録されますが、本人確認にならないため対象にはなりません。1 件でも拒否されると、書き込みは取り消されます。すべての承認は追記専用の lomberk.approvals テーブルに保存されます。
監査エクスポート(Pro)
curl -H "X-API-Key: $ADMIN_KEY" "localhost:8000/v1/audit/export?format=csv&since=2026-01-01" > audit.csv # or format=jsonl
各チェックポイントには、SQL、エージェント、ステータス、行数、承認者、台帳ハッシュが含まれます。パネルからも同じ内容をボタンでエクスポートできます。
ライセンスキー
Web パネルと監査エクスポートの利用には Solo または Pro のキーを指定した LOMBERK_LICENSE_KEY が必要です。Slack 承認、SSO、2 人ルールの利用には Pro が必要です。Pro 機能を設定した状態で Solo キーを使用すると、起動が拒否され、どの機能に Pro が必要かが表示されます。また、このキーによって取り消し可能な期間も変わります。キーがない場合は 24 時間、Solo または Pro の場合は 30 日、Enterprise の場合は無制限です。期間は書き込みの実行時(保留中の書き込みの場合は最終承認時)から数えます。期間を過ぎたチェックポイントは expired(HTTP 403)を返し、状態はそのまま維持されます。
料金ページでキーを購入できます。キーはすぐにメールで届き、サブスクリプションに合わせて更新されます。ゲートウェイは起動時に一度だけ Polar(api.polar.sh)でキーを確認します。この呼び出しではキーと、Pro キーの場合はこのデータベースを識別するランダムなラベル(lomberk.license_activation)が送信されるため、1 つの Pro キーで最大 3 つのデータベースを利用できます。Polar のカスタマーポータルで使用枠を解放できます。lomberk undo が Polar に問い合わせるのは、チェックポイントが 24 時間より古い場合のみです。Polar が停止している場合(応答がない場合、または 3 回試行した後に 5xx または 429 の応答があった場合)も Pro は有効なままです。Polar からまったく応答がない間は、起動に最大で約 1 分かかることがあります。データベースの初回アクティベーションは再送されません。タイムアウトまたは 5xx の後は再試行されず(Polar 側ですでに枠が使用されている可能性があるため)、次回起動時に再試行されます。有効な付与を示さないその他の応答は、無効なキーとして扱われます。キーが無効、キャンセル済み、またはすでに 3 つのデータベースで使用されている場合、Pro 機能が設定された状態でのゲートウェイの起動は拒否され、理由が表示されます。キーは起動時に確認されるため、サブスクリプションがキャンセルされると、次回の再起動時に Pro は無効になります。
仕組み
- AST による厳格な制限:PostgreSQL 独自のパーサー(
pglast)により、単一のSELECT/INSERT/UPDATE/DELETE(または通常のEXPLAIN)、WHERE句を伴うスキーマ修飾付きの書き込み、約 190 種類の副作用のない組み込み関数を許可します。対象には、ウィンドウ関数、JSON、全文検索、gen_random_uuid()など、エージェントが日常的に使用する関数が含まれます。 - ポリシー:保護対象テーブル、外部キーのカスケードが及ぶ範囲、行数制限を適用します。実行はトランザクション内で行い、ロールバックします。
- 変更の記録:
SECURITY DEFINERの行トリガーが、単一使用のケイパビリティトークンにひも付いて、すべての変更(カスケードを含む)を記録します。 - 取り消し:外部キーに従った順序(子より先に親を復元)で取り消し、競合とスキーマの変更を確認します。変更前の行は Postgres 独自のテキスト形式で保持するため、あらゆる型(JSON の
nullやキーの順序も含む)が完全に元どおりに戻ります。後から書き込まれた行には触れず、取り消しを拒否します。 - 制限付き読み取り:読み取りは
statement_timeoutを設定した読み取り専用モードで実行され、サーバー側カーソルを使ってストリーミングされます。返されるのは最大 100 行(値ごとに 4,000 文字、合計 100,000 文字)で、さらに行がある場合はエージェントに通知します。 - 台帳:追記専用の、SHA-256 ハッシュチェーン形式のチェックポイントです。
監視
/healthz(プロセスが稼働中)と /readyz(両方のデータベースロールに到達可能)はキー不要です。Prometheus 用の /metrics を有効にするには、LOMBERK_METRICS_KEY を設定してください。イベント別(denied、held、applied、undone など)の判定件数、処理待ちの保留中の書き込み件数、および最も古い保留中の書き込みの経過時間が確認できるため、承認待ちが積み上がったときにアラートを出せます。含まれるのは件数のみで、SQL、行、名前は含まれません。
scrape_configs:
- job_name: lomberk
authorization: { credentials: "<LOMBERK_METRICS_KEY>" }
static_configs: [{ targets: ["lomberk:8000"] }]
現在の制限事項: 登録するテーブルにはすべて主キーが必要です(単一列でも複数列でも可。lomberk register がテーブルから読み取ります)。パーティションテーブルに対応しています。パーティションテーブルとすべてのパーティションを登録すれば、後から追加されたパーティションも対象となり、別のパーティションに移動した行も元の場所に戻ります。ルールまたは従来型の継承を使用するテーブルへの書き込みは拒否されます。また、独自のトリガーを持つパーティションテーブルへの書き込みも拒否されます。独自のトリガーを持つテーブルへの書き込みは、担当者の対応を待ちます。ただし、updated_at のように行自体のみを変更するトリガーや、Lomberk が保護するテーブルへのトリガーの場合は、--allow-triggers を指定してテーブルを登録できます。その場合、取り消し時は行の復元中にトリガーを無効にするため、行は完全に元どおりに戻ります。JSON のキーはリテラルとして記述する必要があります(->>'theme')。JSON 内のマスキングはベストエフォートです。機密情報を含む可能性のある JSON 列は sensitive_columns に列挙してください。DDL はブロックされ、取り消しはできません。全項目については、SECURITY.md をご覧ください。
オーバーヘッド
localhost 上の Postgres 16 で測定(200 回実行、p50 / p95):
| 経路 | レイテンシー |
|---|---|
| 厳格な制限 + ポリシー(DB なし) | 0.1 / 0.1 ms |
| Lomberk 経由の読み取り | 5.4 / 6.2 ms |
| Lomberk 経由の記録・取り消し可能な書き込み | 18.3 / 23.9 ms |
| 新しい接続での通常の書き込み(ベースライン) | 4.8 / 6.0 ms |
エージェントの処理には数秒かかるため、実際の影響はごくわずかです。コストの大部分は新しい接続の確立によるものです。リモート/TLS データベース向けのコネクションプーリングは、今後のロードマップに含まれています。
PostgreSQL 14、15、16、17、18 でテスト済みです。CI では、すべてのバージョンで完全なテストスイートを実行します。
料金
| Free | Solo | Pro | Enterprise | |
|---|---|---|---|---|
| 対象 | お試し、サイドプロジェクト | 個人開発者 | チーム | 多数のデータベース |
| 料金 | $0 | $49/month(チェックアウトは近日開始) | $199/month または $1,990/year | お問い合わせ |
ハードゲート、保留、キャプチャ、台帳、リモート MCP、API/CLI 承認、lomberk log | ✓ | ✓ | ✓ | ✓ |
| 取り消し可能な期間 | 24 時間 | 30 日間 | 30 日間 | 無制限 |
| ウェブパネル、監査エクスポート | ✓ | ✓ | ✓ | |
| Slack 承認、承認者 SSO、二者ルール | ✓ | ✓ | ||
| ライセンスキーあたりのデータベース数 | 1 | 最大 3 | 無制限 | |
| 請求 | カード、セルフサービス | カード、セルフサービス | 年次請求書 | |
| サポート | GitHub の issue | GitHub の issue | GitHub の issue | 優先回答、セキュリティ質問票への対応 |
Pro を購入:キーはすぐにメールで届きます。Enterprise については、データベース数と承認者数を添えてディスカッションを作成してください。見積もりを返信します。支払い、請求書、売上税は、販売者として記録される Polar が取り扱います。
Lomberk はセルフホスト可能で、データが当社に届くことはありません。電話サポートやオンコール対応はありません。ドキュメントと lomberk doctor を使って、ご自身でセットアップできるようになっています。
開発
uv sync --all-groups
PYTHONPATH=src uv run pytest tests/ # needs Docker (testcontainers)
変更履歴:CHANGELOG.md。コントリビューション:CONTRIBUTING.md。
ライセンス
オープンコアです。src/lomberk/ee/ の外にあるすべての機能(ハードゲート、ポリシー、キャプチャ、取り消し、台帳、リモート MCP、API/CLI 承認)は Apache-2.0 です。安全対策の全機能を無料で実行できます。
src/lomberk/ee/(Slack 承認、承認者 SSO、ウェブパネル、監査エクスポート、ライセンスチェック)は、Elastic License 2.0(ELv2)の下でソースを公開しています。これは Elasticsearch が使用しているものと同じライセンスです。コードを閲覧、実行、変更できます。これらの機能には Solo、Pro、または Enterprise のキーが必要です。また ELv2 では、キーのチェックを削除または回避すること、およびソフトウェアをホスト型サービスとして提供することが禁止されています。二者ルールはコアコードに含まれていますが、有効化にはキーが必要です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。