bouncer

io.github.nugehs由 GitHub 帳號 nugehs 發布v0.3.0更新於 Oct 28, 2026

Static compliance-controls checker for UK Online Safety Act & ICO Children's Code. CLI + MCP.

已驗證STDIO僅桌面開發者工具安全與監控

概覽

AI 產生的概覽

靜態合規檢查器,以確定性規則包核驗程式碼庫中是否存在法規要求的控制項(英國《線上安全法》、ICO 兒童準則、奈及利亞規則包),並以 MCP 工具提供。

可以做什麼
  • 對程式碼庫執行合規規則包,回傳每項控制項的判定結果與 file:line 證據
  • 列出目前設定規則包所適用的所有規則
  • 說明單一規則對應的標準、意圖、修正方式與檢查方法
  • 列出工具內建的規則包
  • 判定分為通過、失敗與未知,未知不會被當成通過
適用情境
當需要讓助理核查應用程式原始碼中是否確實存在年齡驗證、使用者生成內容上的檢舉/封鎖入口、兒童高隱私預設設定等必要控制項,或在修正前了解某條規則的具體要求時適用。它補充而非取代弱點掃描工具。
執行需求
以 stdio 在本機執行,通常透過 npx 從 npm 套件 @nugehs/bouncer 啟動,需要 Node.js 18 或更新版本。目標儲存庫中需有 bouncer.config.json 來指定轉接器、規則包與排除項目。未宣告需要帳號、API 金鑰或環境變數。
安裝前請注意
它會讀取儲存庫原始碼以產生結果,結論僅反映規則所查找的已編碼控制項;專案自述為工程輔助工具而非法律意見,全部通過的報告不能取代合規或 DPO 審查。部分義務屬於流程而非程式碼,只會以待追蹤缺口呈現。它是靜態檢查器,不會修改程式碼。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 bouncer,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

bouncer

Static compliance-controls checker — the controls a regulation requires, verified in your code.

[npm] [CI] [license: MIT] [node] [dependencies]

nugehs.github.io/bouncer-web (site)

[bouncer demo]

bouncer verifies that the controls a regulation requires actually exist in your code — UK Online Safety Act, ICO Children's Code (AADC), and Nigeria (NDPC, FCCPC, FIRS) — expressed as deterministic rule packs. It runs in CI, exits non-zero when a required control is missing, and needs no LLM.

It checks IDs at the door so non-compliant code doesn't get in.

bouncer is an engineering aid, not legal advice. A green report means the coded controls a rule looks for were found — it is not a substitute for a compliance / DPO review.


Why

Regulators now expect demonstrable controls: age assurance, high-privacy defaults for children, report/block affordances on user-generated content, a DPIA, a risk assessment. Those are concrete things that either exist in a codebase or don't. bouncer turns a regulation into a set of static checks over your repo, the same way tieline turns an API contract into drift checks — the engine knows nothing about the law; the rule packs do.

bouncer vs semgrep / policy-as-code

Scanners like semgrep, CodeQL, or Snyk answer "is there bad code here?" — they hunt for vulnerabilities and dangerous patterns that shouldn't exist. bouncer answers the opposite question: "does the code the regulation requires actually exist?" — age assurance on sign-up, report/block on UGC surfaces, high-privacy defaults for children. A repo can be vulnerability-free and still fail every one of those obligations. Policy-as-code tools (OPA/Rego, Conftest) gate configs and infrastructure against policy; bouncer gates application source against regulatory rule packs, with file:line evidence for every control and an honest unknown when a surface can't be located. In short: semgrep finds vulnerabilities; bouncer proves required controls exist. They complement each other — run both.

Install

bash
npx @nugehs/bouncer initnpx @nugehs/bouncer check

Or clone and run with plain Node (zero runtime dependencies, Node ≥ 18).

Usage

bash
bouncer init [path]                 # write a starter bouncer.config.jsonbouncer check                       # run packs, print report, exit 1 on a missing controlbouncer check --pack uk-aadc        # restrict to one packbouncer check --status fail         # show only the failuresbouncer report --out report.html    # self-contained HTML audit reportbouncer list                        # every rule the configured packs applybouncer explain <ruleId>            # what a rule requires + how it is checkedbouncer packs                       # rule packs shipped with bouncerbouncer doctor                      # sanity-check config, adapter, packsbouncer mcp                         # start the MCP server (stdio)

Verdicts

VerdictMeaning
passthe required control was found (evidence: file:line)
failthe surface exists, but no evidence of the control was found
unknownthe surface could not be located in this repo — can't determine, not a pass

unknown is deliberate: bouncer never reports a green pass for a surface it could not find. Missing surface → honest "can't determine".

Configuration

bouncer.config.json:

json
{  "target": {    "adapter": "auto",    "repo": "./my-app",    "roots": ["."]  },  "packs": ["uk-osa", "uk-aadc"],  "packDirs": [],  "ignore": [],  "exclude": [],  "failOn": ["fail"]}
  • adapter — how regulation surfaces (sign-up, profile, chat, livestream…) map onto files for your stack.

bouncer is language-agnostic. The default auto adapter scans TS/JS, Go, Java, Kotlin, Scala, C#, C/C++, Rust, Swift, Dart, PHP, Python, Ruby, Elixir, SQL and HTML templates. Surfaces are found by directory/file names in any naming convention (signup/, sign_up.py, SignUpController.java). Comments and test/fixture files are never counted as evidence. next and react-native remain as TS/JS-only aliases. Narrow with target.languages.

  • exclude — extra globs to skip (added to built-in test/fixture/mock excludes; set "defaultExcludes": false to disable those).
  • packs — which rule packs to run. Built-ins: uk-osa, uk-aadc, ng-ndpc, ng-fccpc, ng-firs.
  • packDirs — extra directories of your own *.json packs.
  • ignore — rule ids to skip.
  • failOn — which buckets make check exit non-zero (default ["fail"]). Regardless of failOn, check also exits 1 when every rule is unknown: no surface was located, so nothing was verified.
  • Keys starting with _ (e.g. "_note") are treated as comments and ignored silently.

Rule packs

A pack is JSON. Each rule maps a legal standard to a static assertion over a surface:

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"  }}

Assertion nodes:

  • { "find": "<regex>", "in": "<surface|glob>", "expect": "present|absent" }
  • { "allOf": [ … ] } · { "anyOf": [ … ] } · { "not": … }

in accepts a surface alias (resolved by the adapter), an array of aliases/globs, or a raw glob. expect: "absent" flips the meaning — a match is a violation (used for nudge patterns, self-declared age checkboxes, etc.).

Surfaces

any, signup, auth, profile, privacy, location, chat, livestream, ugc, moderation, consent, legal, dsr, security, retention, breach, processors, payments, invoice, governance. Unknown surface names are pack-validation errors.

Nigeria packs

For a platform operating in Nigeria, three packs ship built-in:

  • ng-ndpc — Nigeria Data Protection Act 2023 (NDPC): privacy notice, opt-in & granular consent, data-subject rights, encryption, retention/erasure, NDPA localization, DPO designation, 72-hour breach plan, cross-border safeguards.
  • ng-fccpc — consumer protection (FCCPC): blanket "no refund / all sales final" clauses flagged as void — and high-precision, so a tiered or conditional refund policy doesn't trip it — plus refund-policy present, no drip pricing, explicit terms acceptance, terms of service present.
  • ng-firs — tax (FIRS): 7.5% VAT rate, VAT on commission, WHT on payouts, VAT tax invoice.

Some obligations are process, not code — NDPC registration, signed cross-border DPAs, the WHT remittance itself. Those rules surface as gaps to track (add them to ignore with a note), not things a static scan can prove.

MCP

bouncer is also an MCP server (stdio), so an agent can pull the same deterministic results:

ToolPurpose
compliance_checkrun packs, return per-control verdicts + evidence
list_ruleslist rules the configured packs apply
explain_rulea rule's standard, intent, fix, and how it is checked
list_packsavailable rule packs
jsonc
// .mcp.json{ "mcpServers": { "bouncer": { "command": "npx", "args": ["-y", "@nugehs/bouncer", "mcp"] } } }

CI

yaml
- run: npx @nugehs/bouncer check

Fails the build when a required control goes missing — e.g. someone removes an age-gate or a report button from a UGC surface.

Tests

bash
npm test    # node --test — zero dependencies, nothing to install

The suite runs on Node's built-in test runner against throwaway fixture repos: glob/brace expansion, every assertion probe (find, allOf/anyOf/not, allInFile + within windows, expect: "absent"), the pass/fail/unknown verdict semantics, and pack loading. CI runs it on Node 18, 20, 22, and 24.

License

MIT


Part of the toolchain

bouncer is one of four tools that form a deterministic trust layer for AI-assisted development. Each answers a question people keep handing to an LLM — with static analysis instead.

  • repoctx — context: what does this change actually touch?
  • tieline — contracts: did the front end and back end quietly stop agreeing?
  • bouncer (this tool) — compliance: could you defend this to Ofcom?
  • aiglare — governance: where can the model do something you can't undo?

More at segunolumbe.com. static analysis, never the model.

來源:README.md,提交 89e5075

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v0.3.0最新Oct 13, 2026
  2. v0.2.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分