<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>BouncerFox Blog</title>
        <link>https://bouncerfox.dev/blog</link>
        <description>BouncerFox Blog</description>
        <lastBuildDate>Sun, 29 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Your AI Agents Have Config Files. Nobody's Scanning Them.]]></title>
            <link>https://bouncerfox.dev/blog/introducing-bouncerfox</link>
            <guid>https://bouncerfox.dev/blog/introducing-bouncerfox</guid>
            <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing BouncerFox, an open-source CLI that scans AI agent configurations for security risks, misconfigurations, and governance violations.]]></description>
            <content:encoded><![CDATA[<p>Teams are shipping AI agents into production faster than ever. Claude Code reads <code>CLAUDE.md</code> for instructions. MCP servers wire up tools via <code>.mcp.json</code>. Custom agents run off YAML definitions that control what they can access, execute, and modify.</p>
<p>These files are the <strong>new attack surface</strong> and nobody is scanning them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem">The Problem<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Think about what lives in a typical <code>CLAUDE.md</code>:</p>
<ul>
<li class="">Instructions that shape agent behavior</li>
<li class="">References to API endpoints and internal systems</li>
<li class="">Tool access permissions and filesystem paths</li>
<li class="">Implicit trust boundaries that are never validated</li>
</ul>
<p>Now consider <code>.mcp.json</code>. It defines which MCP servers an agent connects to, what tools they expose, and what permissions they have. A single <code>mcp__*</code> wildcard in <code>allowedTools</code> gives an agent unrestricted access to all tools on a server.</p>
<p>Traditional security scanners (SAST, SCA, secret detection) weren't built for this. They scan code, not agent instructions. They check dependencies, not MCP server trust chains. They don't understand that a Markdown file can be a security-critical configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-bouncerfox">Introducing BouncerFox<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#introducing-bouncerfox" class="hash-link" aria-label="Direct link to Introducing BouncerFox" title="Direct link to Introducing BouncerFox" translate="no">​</a></h2>
<p><strong>BouncerFox</strong> is an open-source Go CLI that deterministically scans AI agent config files for security and governance issues. All scanning runs offline. Code never leaves your machine.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">bouncerfox scan </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><br></span></code></pre></div></div>
<p>It runs 35 built-in detection rules across four categories:</p>
<ul>
<li class=""><strong>Security (SEC).</strong> Hardcoded secrets, destructive commands, reverse shells, credential exfiltration, external URLs, invisible unicode, high-entropy strings.</li>
<li class=""><strong>Quality (QA).</strong> Missing descriptions, empty skill bodies, invalid names, oversized files.</li>
<li class=""><strong>Config (CFG).</strong> Unrestricted Bash in allowedTools, wildcard MCP permissions, shell injection in hooks, broad permission flags.</li>
<li class=""><strong>Prompt Safety (PS).</strong> Hidden HTML comments containing instructions.</li>
</ul>
<p>Every finding is deterministic, traceable to a specific rule and line number, and tagged with a severity level (info, warn, high, critical).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-deterministic-first">Why Deterministic First?<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#why-deterministic-first" class="hash-link" aria-label="Direct link to Why Deterministic First?" title="Direct link to Why Deterministic First?" translate="no">​</a></h2>
<p>AI-powered scanning is on the roadmap, but the core scanner is intentionally rule-based. Here's why:</p>
<ol>
<li class=""><strong>Auditability.</strong> Every finding maps to a rule ID. You can explain why a PR was blocked.</li>
<li class=""><strong>Speed.</strong> Scans complete in milliseconds, not seconds. No API calls, no tokens burned.</li>
<li class=""><strong>Reliability.</strong> No false positives from model hallucination. A rule either matches or it doesn't.</li>
<li class=""><strong>CI/CD fit.</strong> Deterministic scanners slot into merge gates without flakiness.</li>
</ol>
<p>Semantic scanning (using embeddings to detect subtler risks) will augment this foundation, not replace it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-it-as-a-pr-merge-gate">Use It as a PR Merge Gate<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#use-it-as-a-pr-merge-gate" class="hash-link" aria-label="Direct link to Use It as a PR Merge Gate" title="Direct link to Use It as a PR Merge Gate" translate="no">​</a></h2>
<p>BouncerFox is built to run in CI/CD. Add it as a GitHub Action and block PRs that introduce risky agent configurations:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> BouncerFox Scan</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">pull_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">scan</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> bouncerfox/cli@v0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> .</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">format</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> sarif</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">severity</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> warn</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-rules">Custom Rules<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#custom-rules" class="hash-link" aria-label="Direct link to Custom Rules" title="Direct link to Custom Rules" translate="no">​</a></h2>
<p>Define project-specific detection rules in <code>.bouncerfox.yml</code> without writing Go code. The custom rule compiler supports 19 match primitives including pattern matching, field checks, size limits, and logic combinators. All patterns use RE2 regex. <a class="" href="https://bouncerfox.dev/docs/guides/custom-rules">See the custom rules guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://bouncerfox.dev/blog/introducing-bouncerfox#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>BouncerFox is open source and actively developed. Here's what's coming:</p>
<ul>
<li class=""><strong>BouncerFox Platform.</strong> Org-level governance with centralized rule config, finding history, enforcement policies, and cross-repo analytics. The CLI already has connected mode built in. Set <code>BOUNCERFOX_API_KEY</code> when the platform launches and it activates automatically.</li>
<li class=""><strong>Semantic AI scanning.</strong> Embedding-based detection for subtle misconfigurations that rules can't catch.</li>
</ul>
<p>Star the repo, try it on your project, and <a href="https://github.com/bouncerfox/cli/discussions" target="_blank" rel="noopener noreferrer" class="">let us know what you find</a>.</p>
<p><a class="" href="https://bouncerfox.dev/docs/getting-started">Get started in 2 minutes</a> | <a href="https://github.com/bouncerfox/cli" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a></p>]]></content:encoded>
            <category>launch</category>
            <category>security</category>
            <category>ai-agents</category>
            <category>open-source</category>
        </item>
    </channel>
</rss>