关于 bouncer
bouncer 用静态规则包检查应用源代码是否包含英国和尼日利亚法规要求的控制措施,面向工程与合规团队。它无需 LLM,提供通过、失败或未知结论,并在可用时附上文件和行号证据。
主要功能
- 01内置英国和尼日利亚规则包
- 02语言无关的源码扫描
- 03通过、失败和未知结论
- 04控制措施的文件与行号证据
- 05CI 检查缺失项并返回非零状态
- 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 会验证法规要求的控制是否确实存在于你的代码中——包括英国《在线安全法》、ICO《儿童守则》(AADC)和尼日利亚(NDPC、FCCPC、FIRS),并将要求表达为确定性的规则包。它可在 CI 中运行;缺少必需控制时会以非零状态码退出,而且无需大模型。
它会在入口处检查 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)。 注释和测试/fixture 文件永远不会被视为证据。next和react-native仍是仅适用于 TS/JS 的别名。使用target.languages缩小范围。
exclude— 要跳过的额外 glob 模式(会与内置的测试/fixture/mock 排除项合并;设置"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。未知界面名称会导致规则包验证错误。
尼日利亚规则包
对于在尼日利亚运营的平台,内置了三个规则包:
ng-ndpc— 《2023 年尼日利亚数据保护法》(NDPC):隐私声明、选择加入 和细粒度同意、数据主体权利、加密、数据保留/删除、NDPA 本地化、DPO 指定、72 小时违规事件应对计划、跨境保障措施。ng-fccpc— 消费者保护(FCCPC):将一概而论的“概不退款/所有销售均为最终交易”条款标记为无效——且精度较高,因此分级或附带条件的退款政策不会触发该规则——此外还检查是否提供退款政策、是否存在滴灌定价、是否明确接受条款,以及是否提供服务条款。ng-firs— 税务(FIRS):7.5% 增值税税率、佣金增值税、付款预扣税、增值税税务发票。
有些义务属于流程要求,而非代码要求——例如 NDPC 注册、签署跨境 DPA,以及实际汇缴 WHT。这些规则会显示为待跟进事项(附注后添加到 ignore 中),而不是静态扫描能够验证的内容。
MCP
bouncer 也可作为 MCP 服务(stdio),因此 Agent 可以获取相同的确定性结果:
| 工具 | 用途 |
|---|---|
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 内置的测试运行器,针对一次性 fixture 仓库运行:
glob/brace 展开、每种断言探针(find、allOf/anyOf/not、
allInFile + within 窗口、expect: "absent")、通过/失败/unknown
判定语义,以及 pack 加载。CI 会在 Node 18、20、22 和 24 上运行测试。
许可证
MIT
工具链的一部分
bouncer 是构成 AI 辅助开发确定性信任层的四种工具之一。每种工具都用静态分析来回答人们总是交给 LLM 的问题。
- repoctx — 上下文:这项更改实际上影响了什么?
- tieline — 契约:前端和后端是否在不知不觉中不再一致?
- bouncer(此工具)— 合规性:你能向 Ofcom 证明这件事合理吗?
- aiglare — 治理:模型在哪些地方可能做出你无法撤销的操作?
更多信息请访问 segunolumbe.com。静态分析,绝不用模型。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。