GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Static compliance-controls checker for UK Online Safety Act & ICO Children's Code. CLI + MCP.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"bouncer": {
"command": "npx",
"args": [
"-y",
"@nugehs/bouncer",
"mcp"
]
}
}
}在终端中运行这条命令
claude mcp add bouncer -- npx -y @nugehs/bouncer mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"bouncer": {
"command": "npx",
"args": [
"-y",
"@nugehs/bouncer",
"mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"bouncer": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@nugehs/bouncer",
"mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过 GitHub 账户 nugehs 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.3.0)于25天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Static compliance-controls checker — the controls a regulation requires, verified in your code.
[nugehs.github.io/bouncer-web](https://nugehs.github.io/bouncer-web/) (site)
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.
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.
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.
npx @nugehs/bouncer init
npx @nugehs/bouncer check
Or clone and run with plain Node (zero runtime dependencies, 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 # 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)
| Verdict | Meaning |
|---|---|
| pass | the required control was found (evidence: file:line) |
| fail | the surface exists, but no evidence of the control was found |
| unknown | the 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".
bouncer.config.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
autoadapter 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.
nextand
react-nativeremain as TS/JS-only aliases. Narrow withtarget.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._ (e.g. "_note") are treated as comments and ignored silently.A pack is JSON. Each rule maps a *legal standard* to a static assertion over a *surface*:
{
"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": " ", "in": " ", "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.).
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.
For a platform operating in Nigeria, three packs ship built-in:
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.
bouncer is also an MCP server (stdio), so an agent can pull the same deterministic results:
| Tool | Purpose |
|---|---|
compliance_check | run packs, return per-control verdicts + evidence |
list_rules | list rules the configured packs apply |
explain_rule | a rule's standard, intent, fix, and how it is checked |
list_packs | available rule packs |
// .mcp.json
{ "mcpServers": { "bouncer": { "command": "npx", "args": ["-y", "@nugehs/bouncer", "mcp"] } } }
- 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.
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.
MIT
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.
More at segunolumbe.com. *static analysis, never the model.*