Approval gate for databases について
Approval gate for databases は、読み取りを通し、データやスキーマを変更する呼び出しを別の担当者の承認まで保留する MCP プロキシです。データベース MCP サーバーを使うチーム向けで、コーディングエージェントの危険なシェルコマンドも確認できます。
主な機能
- 01読み取り呼び出しを通過
- 02書き込みに管理者承認を要求
- 03呼び出し内容と警告を表示
- 04承認済みの呼び出しを一度だけ実行
- 05コーディングエージェントの危険なコマンドを確認
活用シーン
- 01実行前にデータベース変更を確認
- 02本番環境への書き込みを別の人が承認
- 03コーディングエージェントの危険なコマンドを保留
MCP 対応
MCP クライアントと上流の MCP サーバーの間に入り、承認ルールを適用しながら呼び出しを転送します。一般的なサーバー向けのプリセットと、保留中の申請を確認する `check_approval` ツールも備えています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @hibira-io/mcp-approval-gateGATE_COMMANDシークレットThe database MCP server to wrap, e.g. npx -y @bytebase/dbhub --transport stdio --dsn postgres://user:pass@host/dbHIBIRA_APP_IDHibira app ID (hibira.io portal)HIBIRA_KEYシークレットHibira app keyHIBIRA_SECRETシークレットHibira app secretGATE_LABELThe database's name on the approval pageGATE_PUSH_INTERESTSComma-separated push interests that receive approval requestsGATE_MODEwrites (default), all or noneローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
データベース MCP サーバー向け承認ゲート
@hibira-io/mcp-approval-gate は、アシスタントをデータベースに接続する MCP サーバーの前段に配置します。読み取りはそのまま通過します。データやスキーマを変更する操作は、ホストされた承認ページで別の人が承認するまで保留され、プッシュ通知でその人のスマートフォンに届きます。承認されたとおりに、一度だけ実行されます。

実際のセッション:Claude Code が DBHub 経由で注文 1042 を返金済みにするよう要求します。UPDATE は保留され、アシスタントに承認リンクが渡されることはありません。リクエストは、店舗マネージャーのスマートフォンにある Hibira Approvals の受信トレイに表示されます(プッシュ通知でも届きます)。マネージャーが開いてステートメントを確認し、承認すると、アシスタントが変更を完了します。(MP4 · 同じリクエストを拒否した場合)
あらゆる MCP サーバーで動作し、以下でテスト済みです。
- DBHub(Postgres、MySQL、MariaDB、SQL Server、SQLite)
- Postgres MCP Pro(
postgres-mcp) - Supabase MCP(ローカルまたは
mcp.supabase.com)
Claude(Desktop、Code、claude.ai)、Cursor、ChatGPT、その他あらゆる MCP クライアントでも使用できます。
assistant ──► approval gate ──► database MCP server ──► database
│ writes only
▼
Hibira approval page + push ──► supervisor taps Approve / Reject
導入の理由
ほとんどのデータベース MCP サーバーには、読み取り専用にするか、アシスタントに何でも書き込ませるかの二択しかありません。クライアント側の「このツールを許可しますか?」という確認には、依頼した本人が回答します。このゲートは、本番データを扱う際にチームが通常求める手順、つまり、ステートメントを目の前で確認したうえで、別の人が承認する手順を追加します。
- 正確な呼び出しに紐づきます。 承認の対象となるのは、1 組の引数を持つ 1 回のツール呼び出しです(フィンガープリントも表示されます)。ステートメントが変更された場合は、新たな承認が必要です。承認された呼び出しは一度だけ実行されます。
- 安全側に失敗します。 ゲートが読み取れない SQL や、読み取り専用だと判定できないツールは、承認待ちになります。承認サービスに接続できない場合、何も実行されません。
- データベースはお客様のもとに留まります。 ゲートは、データベース MCP サーバーが実行されている場所で動作します。Hibira が参照するのは承認リクエスト(タイトル、ステートメント、ツール名)のみで、接続文字列やクエリ結果は参照しません。
- レビュアーにとって明確です。 ページには、データベースのラベル、変更の種類(
UPDATE、DROP TABLEなど)、「WHERE 句のない DELETE はすべての行を変更する」といった警告、ステートメント全文が表示されます。
- approvals.hibira.ioでHibira Approvals ワークスペースを作成し、 承認する人(店舗マネージャー、DBA など)を招待します。招待された人は スマートフォンでリクエストを受け取り、承認用受信トレイで判断します。
- クライアントの設定で、データベース MCP サーバーの手前にゲートを配置します
(以下を参照)。
--より後ろは、データベースサーバーの通常のコマンドです。 コピーするキーはありません。 - アシスタントが最初に何かを変更しようとすると、リンクと短いコードが表示されます。 ワークスペース管理者がリンクを開き、ワークスペースを選択して接続を 押します。これ以降、ゲートが接続されます。読み取りはその間もすべて実行できます。
代わりにターミナルから事前に接続するには、
npx -y @hibira-io/mcp-approval-gate loginを実行します。statusとlogoutも
同様に使用できます。接続はトークンであり、
~/.config/hibira/approval-gate.jsonに保存されます。このトークンでできるのは、
そのワークスペースの承認をリクエストして読み取ることだけです。管理者は
ワークスペース設定ですべての接続済みゲートを確認でき、いつでも取り消せます。
Claude Code
claude mcp add shop-db -e GATE_LABEL=shop-production \
-- npx -y @hibira-io/mcp-approval-gate \
-- npx -y @bytebase/dbhub --transport stdio --dsn "postgres://user:pass@host:5432/shop"
Claude Desktop、Cursor、Windsurf、VS Code
claude_desktop_config.json、.cursor/mcp.jsonなども同じ形式です。
{
"mcpServers": {
"shop-db": {
"command": "npx",
"args": [
"-y", "@hibira-io/mcp-approval-gate",
"--label", "shop-production",
"--",
"npx", "-y", "@bytebase/dbhub", "--transport", "stdio",
"--dsn", "postgres://user:pass@host:5432/shop"
]
}
}
}
postgres-mcp:
"args": ["-y", "@hibira-io/mcp-approval-gate", "--label", "analytics", "--",
"uvx", "postgres-mcp", "--access-mode=unrestricted"],
"env": { "DATABASE_URI": "postgresql://..." }
ここでは--access-mode=unrestrictedを使用して問題ありません。書き込みを
保留するのはゲートです。
Supabase(ローカルサーバー):
"args": ["-y", "@hibira-io/mcp-approval-gate", "--label", "supabase-prod", "--",
"npx", "-y", "@supabase/mcp-server-supabase@latest", "--project-ref=<project-ref>"],
"env": { "SUPABASE_ACCESS_TOKEN": "sbp_..." }
SELECTを使ったexecute_sqlはすぐに実行されます。書き込み、apply_migration、
deploy_edge_function、ブランチのマージ、プロジェクトの一時停止には承認が必要です。
Supabase(ホスト型サーバー):
"args": ["-y", "@hibira-io/mcp-approval-gate", "--label", "supabase-prod",
"--upstream-url", "https://mcp.supabase.com/mcp?project_ref=<project-ref>",
"--header", "Authorization: Bearer ${SUPABASE_ACCESS_TOKEN}"],
ChatGPT と claude.ai(リモート)
ウェブクライアントには HTTPS URL が必要です。そのため、データベースのそばで ゲートを小さなサーバーとして実行し、その前段に HTTPS を配置します (リバースプロキシ、トンネル、Fly.io や Railway などのプラットフォームを使用します)。
npx -y @hibira-io/mcp-approval-gate login # once, on the server
export GATE_TOKEN="$(openssl rand -hex 24)" # keep it secret
npx -y @hibira-io/mcp-approval-gate --http --host 0.0.0.0 --port 8787 \
--label shop-production \
-- npx -y @bytebase/dbhub --transport stdio --dsn "$DATABASE_URL"
エンドポイントはhttps://your-host/mcp/<GATE_TOKEN>です。ヘッダーを送信できる
クライアントでは、https://your-host/mcpとAuthorization: Bearer <GATE_TOKEN>を
使用できます。
- ChatGPT:「Settings → Apps & Connectors → Advanced → Developer mode」を開き、 「Create」を選択して、トークン付きの URL を貼り付け、認証方法として 「No authentication」を選択します。
- claude.ai:「Settings → Connectors → Add custom connector」を開き、 トークン付きの URL を貼り付けます。
GATE_TOKENが設定されていない場合、ゲートはローカル以外のアドレスでの
リッスンを拒否します。Dockerfileが含まれています。サインインに使う
ターミナルがないコンテナでは、HIBIRA_APPROVALS_TOKENにワークスペーストークンを
渡します(任意のマシンでloginを実行した後、
~/.config/hibira/approval-gate.jsonからコピーします)。または、初回起動時に
ゲートのログに表示される接続リンクを確認してください。
データベース以外:プリセット
ゲートはあらゆる MCP サーバーの手前で動作します。よく使われるいくつかの
サーバーについては、--presetで読み取り専用のツールと変更を行うツールを判別し、
「Stripe: POST /v1/refunds」や「GitHub: pull request acme/shop#42 をマージ」のような
分かりやすいタイトルで承認リクエストを作成します。--allowと--gateは、
プリセットよりも優先されます。
| プリセット | 承認待ちになる操作 | すぐに実行される操作 |
|---|---|---|
stripe | stripe_api_write、send_money、transfer_money、convert_currency、… | stripe_api_read、検索、ドキュメント、分析 |
github | マージ、プッシュ、ファイル変更、新しいリポジトリ、ワークフローの実行、コメント | get_*、list_*、search_*、*_read |
gmail | 送信、返信、転送、削除、フィルター | 読み取り、検索、下書き |
shopify | graphql_mutation、作成、更新、割引、在庫 | クエリ、分析、ドキュメント |
Stripe(ホスト型サーバー、エージェント API キーを使用):
claude mcp add stripe -- npx -y @hibira-io/mcp-approval-gate --preset stripe \
--upstream-url https://mcp.stripe.com --header 'Authorization: Bearer ${STRIPE_AGENT_KEY}'
GitHub(Docker 上の公式サーバー):
claude mcp add github -e GITHUB_PERSONAL_ACCESS_TOKEN=... \
-- npx -y @hibira-io/mcp-approval-gate --preset github \
-- docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN ghcr.io/github/github-mcp-server
Gmail と Shopify では、現在使用しているサーバーの前に--preset gmailまたは
--preset shopifyを指定します。プリセットが認識しないツールには、以下の通常の
ルールが適用されます。
アシスタントに表示される内容
書き込み呼び出しは、判断を最大50秒間(--wait)待ちます。その間、クライアントが早まって諦めないよう、進捗状況を送信します。
- 承認済み: 呼び出しが実行され、通常の結果とともに、承認されたことを示す行が返されます。
- 拒否または期限切れ: 実行されなかったことを示すエラーが返されます。監督者がコメントを残している場合は、そのコメントも含まれます。
- 引き続き承認待ち: 監督者の承認が必要であることを示す短い回答と、
approval_idが返されます。このゲートはcheck_approvalというツールを追加します。決定したとユーザーが伝えると、アシスタントはそのapproval_idを指定してこのツールを呼び出し、承認されていれば処理が実行されます。同じ呼び出しを再度要求すると、同じリクエストが再利用されます。
**ゲートが Approvals ワークスペースに接続されている場合(メンバーに通知され、サインインして判断します)、または別の方法でリクエストが監督者に届く場合(--push-interests、--push-users または --channel)、アシスタントに承認リンクは表示されません。**そのため、アシスタントとチャットしているユーザーは、チャットから自分の変更を承認できません。これらの方法を使わない場合、監督者に連絡する唯一の手段はリンクなので、アシスタントは転送できるようにリンクを表示します。--show-link always または never を指定すると、この動作を上書きできます。
承認待ちになる処理
デフォルトの --mode writes では、次のようになります。
--gateに指定されたツールは常に承認待ちになり、--allowに指定されたツールは承認待ちになりません(末尾の*はプレフィックスに一致します)。- SQL を含む呼び出し(
sql、query、statement、queriesなどの引数)は、いずれかの文が何かを変更する場合に承認待ちになります。対象は、INSERT、UPDATE、DELETE、MERGE、CREATE、ALTER、DROP、TRUNCATE、GRANT、COPY、CALL、DO、SET、VACUUM、データを変更するWITH、SELECT ... INTO、書き込みに対するEXPLAIN ANALYZE、setvalやpg_terminate_backendなどの関数を呼び出すSELECT、および解析できない文です。コメント、文字列、ドル引用符で囲まれた本文は無視されるため、SELECT 'DROP TABLE x'は読み取りとして扱われます。 - その他のツールは、
readOnlyHintが設定されているか、読み取りを示す名前(list_、get_、search_、describe_、explain_、analyze_など)が付いていれば、そのまま実行されます。それ以外はすべて承認待ちになります。
--mode all を指定すると、読み取りも含め、すべての呼び出しが承認待ちになります。--mode none を指定するとゲートが無効になります(テスト時に便利です)。
ゲートは二重チェックの仕組みであり、権限管理システムではありません。データベースユーザーにも、必要な権限だけを付与してください。
コーディングエージェント:リスクのあるシェルコマンドを実行する前に承認
同じパッケージは、Claude Code、Codex、Cursor、Hermes Agent 用のフックです。取り消しが難しいシェルコマンドは、Hibira Approvals ワークスペースで別の人が承認するまで待機し、それ以外のコマンドは通常どおり実行されます。
| 承認待ちになる操作 | 例 |
|---|---|
| ファイルの削除 | rm -rf src、find . -delete、git clean -fdx(rm -rf node_modules、dist、build などは対象外です) |
| Git 履歴の書き換え | git push --force、git reset --hard、git branch -D、リモートブランチの削除 |
| デプロイとリリース | vercel --prod、fly deploy、wrangler deploy、firebase deploy、gh pr merge、npm run deploy、make release |
| インフラストラクチャ | terraform apply / destroy、pulumi up、cdk deploy、kubectl delete / apply、helm upgrade、aws ... delete-* |
| 公開 | npm publish、cargo publish、twine upload、docker push、gh release create |
| データベース | psql -c "DELETE ..."、SQL のヒアドキュメントやファイル、prisma migrate deploy、artisan migrate --force、redis-cli FLUSHALL |
コマンドはシェルと同じ方法で読み取られます(&&、パイプ、$( )、ヒアドキュメントなど)。sudo、env、bash -c、ssh host '...'、npx、uv run などのラッパーも解析されます。SQL は MCP ゲートと同じように分類されます。psql -c "select ..." は実行され、DELETE は承認待ちになります。コマンドは npx -y @hibira-io/mcp-approval-gate hook check -- terraform apply で確認できます。
リクエストには、コマンド全体、承認待ちになる理由、フォルダー、リポジトリとブランチ、およびコンピューターが表示されます。承認者にはスマートフォンに通知が届きます。エージェントはリンクを受け取らないため、自分自身を承認できません。承認されると、そのフォルダーで該当するコマンドが一度だけ実行されます。却下された場合は(コメントとともに)停止するよう指示され、エージェントに返されます。10 分以内に誰も回答しなければ、エージェントには待機し、後で同じコマンドを再実行するよう伝えられます。
コマンドはお使いのコンピューター上で確認されます。承認待ちになるコマンドだけがリクエストを作成し、ワークスペースの月間リクエスト数にカウントされます。その月のリクエストを使い切ると、リスクのあるコマンドはブロックされたままになり、エージェントにはその理由が伝えられます。問い合わせなしで実行されることはありません。
インストール。 このコンピューターをワークスペースに一度接続します。
npx -y @hibira-io/mcp-approval-gate login --label "coding agent"
次にフックを追加します。Hibira agent plugin マーケットプレイスを使う場合は、claude plugin install hibira-approval-hooks@hibira を実行します(Codex と Cursor も同じプラグインをインストールします)。手動で追加することもできます。
-
Claude Code、
~/.claude/settings.json(またはプロジェクトの.claude/settings.json):{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "npx -y @hibira-io/mcp-approval-gate hook claude", "timeout": 660 } ] } ] } } -
Codex、
~/.codex/hooks.json(次に/hooksで信頼します):{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "npx -y @hibira-io/mcp-approval-gate hook codex", "timeout": 660 } ] } ] } } -
Cursor、
~/.cursor/hooks.json:{ "version": 1, "hooks": { "beforeShellExecution": [ { "command": "npx -y @hibira-io/mcp-approval-gate hook cursor", "timeout": 660, "failClosed": true } ] } } -
Hermes Agent、
~/.hermes/config.yaml(Hermes がフックを待つ時間は最大 300 秒です。そのため、フックは 280 秒後に待機を終了し、承認されたら再試行するようエージェントに伝えます)。Hibira Hermes container には、この設定が含まれています。hooks: pre_tool_call: - matcher: "terminal" command: "mcp-approval-gate hook hermes" timeout: 300 fail_closed: true
すべてのコマンドですぐに使えるようにするには、npm install -g @hibira-io/mcp-approval-gate で一度インストールし、コマンドとして mcp-approval-gate hook claude を使用します。
設定は ~/.config/hibira/approval-hook.json または環境変数に記述します。
{
"always": ["^\\./scripts/ship\\.sh"],
"never": ["^terraform apply .*-target=module\\.sandbox"],
"approvers": ["platform-team"],
"wait": 600,
"expires": 30
}
GATE_HOOK=off を設定すると、1 つのシェルでフックが無効になります。プロジェクトでは .hibira/approval-hook.json に独自の always ルールと approvers を追加できます(never ルールは追加できないため、エージェントがリポジトリを編集して自分自身のチェックを無効にすることはできません)。これは不注意によるミスを防ぐための安全策であり、サンドボックスではありません。エージェントが意図的にコマンドを偽装する可能性があるため、本番環境の認証情報にもエージェントがアクセスできないようにしてください。
オプション
| フラグ | 環境変数 | デフォルト | |
|---|---|---|---|
HIBIRA_APPROVALS_TOKEN | サインインの代わりに使用するワークスペーストークン(サーバー、コンテナー向け) | ||
--profile | GATE_PROFILE | default | 使用する保存済み接続。1台のマシン上のゲートを別々のワークスペースに接続する場合に指定します |
HIBIRA_APP_ID, HIBIRA_KEY, HIBIRA_SECRET | 0.2 と同様に Hibira アプリのキーを使用します(プッシュ通知とチャンネルのオプションが適用されます) | ||
HIBIRA_API_URL | https://ws.hibira.io | ||
--label | GATE_LABEL | database | 承認ページに表示するデータベース名 |
--preset | GATE_PRESET | stripe、github、gmail、shopify(上記を参照) | |
--mode | GATE_MODE | writes | writes、all、none |
--allow | GATE_ALLOW_TOOLS | 待機させないツール | |
--gate | GATE_TOOLS | 常に待機させるツール | |
--approvers | GATE_APPROVERS | Approvals ワークスペースで判断できるユーザー。承認者グループのスラッグまたはメンバーのメールアドレスを指定します(デフォルト:管理者または承認者全員) | |
--push-interests | GATE_PUSH_INTERESTS | リクエストをプッシュ通知する対象の interest | |
--push-users | GATE_PUSH_USERS | ...または、プッシュ通知するユーザー ID | |
--channel | GATE_CHANNEL | 承認用受信トレイなど、このチャンネルにもリクエストを通知します | |
--show-link | GATE_SHOW_LINK | auto | アシスタントに承認リンクを渡します:auto(プッシュ通知もチャンネルも設定されていない場合のみ)、always、never |
--options | GATE_OPTIONS | Approve,Reject | 回答ボタン。最初のボタンが承認です |
--wait | GATE_WAIT_SECONDS | 50 | 「まだ待機中です」と回答するまで、呼び出しを待機する時間 |
--expires | GATE_EXPIRES_MINUTES | 60 | リクエストを開いたままにする時間(最長7日) |
-- <command> | GATE_COMMAND | 起動するデータベース MCP サーバー | |
--upstream-url | GATE_UPSTREAM_URL | ...またはリモートサーバー(Streamable HTTP) | |
--header | GATE_UPSTREAM_HEADERS | リモートサーバー用のヘッダー。${VAR} は環境変数を読み込みます | |
--http | オフ | stdio の代わりに Streamable HTTP で提供します | |
--host, --port | GATE_HOST, PORT | 127.0.0.1, 8787 | |
GATE_TOKEN | ローカル以外のアドレスで --http を使用する場合に必須です |
保留中の呼び出しはゲートのメモリ上に保持されます。ゲートが再起動すると、待機中の呼び出しは破棄され(実行されません)、アシスタントがあらためて確認を求めます。
開発
npm install
npm test
# against real servers and a local Postgres:
DATABASE_URL=postgres://... node --test test/real-servers.e2e.js
ライセンス
MIT
中文摘要
@hibira-io/mcp-approval-gate は、あらゆるデータベース MCP サーバー(DBHub、postgres-mcp、Supabase MCP など)をラップします。読み取りはそのまま通過しますが、書き込み、テーブル変更、削除は一旦停止し、Hibira がホストする承認ページまたはスマートフォンへのプッシュ通知で、別の人(上司)が承認するまで待機します。承認後は、元の内容のまま1回だけ実行されます。
- 承認は今回の呼び出しの完全なパラメーターに紐づけられます(フィンガープリント付き)。SQL を変更すると、再度承認が必要です。
- プッシュ通知またはチャンネルを設定すると、アシスタントは承認リンクを取得できません。プッシュ通知を受け取った上司だけが承認できます。
- 解釈できない SQL や、読み取り専用かどうか不明なツールは、すべて承認が必要です。承認サービスに接続できない場合は実行されません。
- ゲートはお客様自身の環境で動作します。Hibira は承認内容を中継するだけで、データベースのパスワードには触れず、クエリ結果も見ることができません。
- Claude(Desktop / Code / claude.ai)、Cursor、ChatGPT で利用できます。ウェブ版では
--httpとGATE_TOKENを使用します。 - 設定方法:hibira.io で Approvals ワークスペースを作成し、承認者を招待します。設定では、
--の後ろに元のデータベース MCP コマンドを指定するだけで、Key をコピーする必要はありません。初めて書き込みを行うとき、アシスタントが接続リンクとコードを提示します。ワークスペース管理者がログインして「接続」を押してください(先にnpx -y @hibira-io/mcp-approval-gate loginを実行することもできます)。 - コーディングエージェントの承認フック(Claude Code / Codex / Cursor / Hermes Agent):同じパッケージをエージェント用のフックとしても使用できます。ファイルの削除(
rm -rf)、git push --force、デプロイ(vercel --prod、fly deploy、wrangler deploy)、terraform apply、パッケージの公開(npm publish)、データベースへの書き込みなど、取り消せないシェルコマンドは、別の人の承認を受けるために Approvals ワークスペースに送信されます。承認されると、そのコマンドは1回だけ実行を許可されます。それ以外のコマンドは通常どおり実行されます。まずnpx -y @hibira-io/mcp-approval-gate login --label "coding agent"を一度実行し、agent-plugin にあるhibira-approval-hooksプラグインをインストールしてください(または上記の手順に沿ってフックを手動で追加してください)。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。