bouncer について
bouncerは、英国とナイジェリアの規制ルールパックが求める対策をアプリケーションのソースコードから静的に確認します。エンジニアリングやコンプライアンスのチーム向けで、LLMを使わず、可能な場合はファイルと行番号の証拠とともにpass、fail、unknownを報告します。
主な機能
- 01英国とナイジェリアの組み込みルールパック
- 02言語に依存しないソーススキャン
- 03pass、fail、unknownの判定
- 04対策を示すファイルと行番号
- 05不合格時に非ゼロ終了するCIチェック
- 06HTML監査レポートとルール説明
活用シーン
- 01リリース前に必須の対策を確認
- 02対策の欠落時にCIを不合格にする
- 03コンプライアンス評価の証拠を確認
- 04検証できないコード上の領域を特定
MCP 対応
stdioのMCPサーバーは、コンプライアンス検査、ルールとルールパックの一覧、ルール説明のツールを公開し、チェッカーと同じ決定的な結果を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
4掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| packs | array | いいえ | これらの pack ids に限定します(例:uk-osa、uk-aadc)。 |
| config | string | いいえ | bouncer.config.json のパスです。デフォルトでは cwd から上位ディレクトリを検索します。 |
| status | string | いいえ | 検出結果を fail、unknown、all(デフォルト)のいずれかで絞り込みます。 |
詳細
bouncer
静的コンプライアンス管理策チェッカー — 規制で求められる管理策が、コード内に実装されているかを確認します。
nugehs.github.io/bouncer-web(サイト)

bouncer は、規制で 求められる 管理策が実際にコード内に存在するかを確認します。対象は英国の Online Safety Act、ICO Children's Code(AADC)、ナイジェリア(NDPC、FCCPC、FIRS)で、決定論的な ルールパック として表現されています。CI で実行でき、必須の管理策が欠けている場合はゼロ以外の終了コードを返します。LLM は不要です。
入り口で ID をチェックし、コンプライアンスに準拠していないコードが通らないようにします。
bouncer はエンジニアリングを支援するツールであり、法的助言ではありません。緑色のレポートは、ルールが検出対象とする管理策がコード内に見つかったことを意味します。コンプライアンス審査や DPO によるレビューの代わりにはなりません。
概要
規制当局は現在、年齢確認、子ども向けの高プライバシー設定、ユーザー生成コンテンツの通報・ブロック機能、DPIA、リスク評価など、実証可能な 管理策を求めています。これらはコードベースに存在するかどうかを確認できる、具体的なものです。bouncer は、規制をリポジトリに対する一連の静的チェックに変換します。tieline が API コントラクトをドリフトチェックに変換するのと同じです。エンジンは法律について何も知りません。知っているのは ルールパック です。
bouncer と semgrep/ポリシー・アズ・コードの比較
semgrep、CodeQL、Snyk などのスキャナーが答えるのは、「ここに問題のあるコードはあるか?」 です。脆弱性や危険なパターンなど、存在すべきでないもの を探します。bouncer が答えるのはその逆で、「規制で求められるコードが実際に存在するか?」 です。たとえば、登録時の年齢確認、UGC を扱う画面での通報・ブロック機能、子ども向けの高プライバシー設定などです。脆弱性がないリポジトリでも、こうした義務のすべてに違反している可能性があります。ポリシー・アズ・コードのツール(OPA/Rego、Conftest)は、設定やインフラストラクチャ をポリシーに照らしてチェックします。一方、bouncer は アプリケーションのソースコード を規制のルールパックに照らしてチェックし、各管理策について file:line の証拠を示します。また、対象箇所を特定できない場合は、正直に unknown を返します。つまり、semgrep は脆弱性を検出し、bouncer は必須の管理策が存在することを証明します。 両者は相互に補完するので、併用してください。
インストール
npx @nugehs/bouncer init
npx @nugehs/bouncer check
または、クローンして通常の Node で実行できます(実行時依存関係ゼロ、Node ≥ 18)。
使い方
bouncer init [path] # write a starter bouncer.config.json
bouncer check # run packs, print report, exit 1 on a missing control
bouncer check --pack uk-aadc # restrict to one pack
bouncer check --status fail # show only the failures
bouncer report --out report.html # self-contained HTML audit report
bouncer list # every rule the configured packs apply
bouncer explain <ruleId> # what a rule requires + how it is checked
bouncer packs # rule packs shipped with bouncer
bouncer doctor # sanity-check config, adapter, packs
bouncer mcp # start the MCP server (stdio)
判定結果
| 判定結果 | 意味 |
|---|---|
| pass | 必須の管理策が見つかりました(証拠:file:line) |
| fail | 対象箇所は存在しますが、管理策の証拠が見つかりませんでした |
| unknown | このリポジトリ内で対象箇所を特定できませんでした — 判定不能であり、合格ではありません |
unknown は意図的な判定です。bouncer は見つけられなかった対象箇所について、緑色の合格を報告することはありません。対象箇所が見つからない場合は、正直に「判定不能」とします。
設定
bouncer.config.json:
{
"target": {
"adapter": "auto",
"repo": "./my-app",
"roots": ["."]
},
"packs": ["uk-osa", "uk-aadc"],
"packDirs": [],
"ignore": [],
"exclude": [],
"failOn": ["fail"]
}
adapter— 規制対象のサーフェス(登録、プロフィール、チャット、ライブ配信など)を、スタック内のファイルにどのように対応付けるかを指定します。
bouncer は言語に依存しません。 デフォルトの
autoアダプターは、TS/JS、Go、 Java、Kotlin、Scala、C#、C/C++、Rust、Swift、Dart、PHP、Python、Ruby、Elixir、 SQL、および HTML テンプレートをスキャンします。サーフェスは、命名規則 (signup/、sign_up.py、SignUpController.java)を問わず、ディレクトリ名/ファイル名で検出されます。 コメントおよびテスト/フィクスチャファイルは、証拠としてカウントされません。nextとreact-nativeは、引き続き TS/JS 専用のエイリアスです。target.languagesで対象を絞り込めます。
exclude— スキップする追加の glob(組み込みのテスト/フィクスチャ/モックの除外対象に追加されます。これらを無効にするには"defaultExcludes": falseを設定します)。packs— 実行するルールパックを指定します。組み込みパック:uk-osa、uk-aadc、ng-ndpc、ng-fccpc、ng-firs。packDirs— 独自の*.jsonパックを格納する追加ディレクトリ。ignore— スキップするルール ID。failOn—checkがゼロ以外で終了する対象の分類(デフォルトは["fail"])。failOnの設定にかかわらず、すべてのルールがunknownの場合もcheckは 1 で終了します: サーフェスが見つからず、何も検証されていないためです。_で始まるキー(例:"_note")はコメントとして扱われ、何も通知せず無視されます。
ルールパック
パックは JSON です。各ルールは、法的基準をサーフェスに対する静的アサーションに対応付けます:
{
"id": "aadc.geolocation-default-off",
"standard": "Standard 10 — Geolocation",
"severity": "high",
"surface": "profile",
"intent": "Geolocation must default to off for children.",
"fix": "Default any location-sharing setting to off.",
"assert": {
"find": "(share[_-]?location|location[_-]?sharing)[\"']?\\s*[:=]\\s*(false|off)\\b",
"in": ["profile", "privacy", "location"],
"expect": "present"
}
}
アサーションノード:
{ "find": "<regex>", "in": "<surface|glob>", "expect": "present|absent" }{ "allOf": [ … ] }·{ "anyOf": [ … ] }·{ "not": … }
in は、サーフェスのエイリアス(アダプターで解決)、エイリアス/glob の配列、または生の glob を受け付けます。expect: "absent" は意味を反転させます。一致が違反となります(促しのパターン、自己申告式の年齢確認チェックボックスなどで使用します)。
サーフェス
any、signup、auth、profile、privacy、location、chat、livestream、ugc、moderation、consent、legal、dsr、security、retention、breach、processors、payments、invoice、governance。不明なサーフェス名は、パックの検証エラーになります。
ナイジェリア向けパック
ナイジェリアで運営するプラットフォーム向けに、3 つのパックが組み込まれています:
ng-ndpc— ナイジェリアデータ保護法 2023(NDPC):プライバシー通知、オプトインと詳細な同意、データ主体の権利、暗号化、データ保持/消去、NDPA のローカライズ、DPO の指定、72 時間以内のデータ侵害対応計画、越境移転の保護措置。ng-fccpc— 消費者保護(FCCPC):一律の「返金不可/すべての販売は最終」条項を無効として検出します。検出精度は高く、段階的または条件付きの返金ポリシーは誤検出されません。また、返金ポリシーの掲載、追加料金の後出し表示がないこと、明示的な規約への同意、利用規約の掲載も確認します。ng-firs— 税務(FIRS):7.5% の VAT 税率、手数料への VAT、支払額に対する WHT、VAT の税務請求書。
一部の義務はコードではなくプロセスに関するものです。NDPC への登録、署名済みの越境 DPA、WHT の納付などが該当します。これらのルールは、静的スキャンで立証できる項目ではなく、追跡すべきギャップとして表示されます(メモを添えて ignore に追加してください)。
MCP
bouncer は MCP サーバー(stdio)でもあるため、エージェントは同じ決定論的な結果を取得できます:
| ツール | 目的 |
|---|---|
compliance_check | パックを実行し、管理項目ごとの判定と証拠を返す |
list_rules | 設定済みパックで適用されるルールを一覧表示 |
explain_rule | ルールの基準、目的、修正方法、および検査方法を説明する |
list_packs | 利用可能なルールパックを一覧表示 |
// .mcp.json
{ "mcpServers": { "bouncer": { "command": "npx", "args": ["-y", "@nugehs/bouncer", "mcp"] } } }
CI
- run: npx @nugehs/bouncer check
必須の管理項目が失われるとビルドが失敗します。たとえば、誰かが UGC サーフェスから年齢確認ゲートや報告ボタンを削除した場合です。
テスト
npm test # node --test — zero dependencies, nothing to install
このテストスイートは、使い捨てのフィクスチャリポジトリを対象に、Node 組み込みのテストランナーで実行されます。
glob/brace 展開、すべてのアサーションプローブ(find、allOf/anyOf/not、
allInFile と within ウィンドウ、expect: "absent")、pass/fail/unknown
の判定セマンティクス、パックの読み込みをテストします。CI では Node 18、20、22、24 で実行されます。
ライセンス
MIT
ツールチェーンの一部
bouncer は、AI 支援開発のための決定論的な信頼レイヤーを構成する 4 つのツールの 1 つです。それぞれが、静的解析によって、LLM に繰り返し委ねられている問いに答えます。
- repoctx — コンテキスト:この変更は実際に何に影響しますか?
- tieline — 契約:フロントエンドとバックエンドの整合性がいつの間にか崩れていませんか?
- bouncer(このツール)— コンプライアンス:これを Ofcom に説明できますか?
- aiglare — ガバナンス:モデルが、元に戻せない操作を実行できる場所はどこですか?
詳しくは segunolumbe.com をご覧ください。静的解析であり、モデルではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。