<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shubhbhangoo</title>
    <description>The latest articles on DEV Community by Shubhbhangoo (@shubhbhangoo).</description>
    <link>https://dev.to/shubhbhangoo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4090151%2F2c664733-9570-48c8-b76e-736d943266c4.png</url>
      <title>DEV Community: Shubhbhangoo</title>
      <link>https://dev.to/shubhbhangoo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubhbhangoo"/>
    <language>en</language>
    <item>
      <title># Agent Firewall v2.5: I Attacked My Own AI Agent Security Boundary</title>
      <dc:creator>Shubhbhangoo</dc:creator>
      <pubDate>Fri, 04 Sep 2026 07:27:41 +0000</pubDate>
      <link>https://dev.to/shubhbhangoo/-agent-firewall-v25-i-attacked-my-own-ai-agent-security-boundary-17al</link>
      <guid>https://dev.to/shubhbhangoo/-agent-firewall-v25-i-attacked-my-own-ai-agent-security-boundary-17al</guid>
      <description>&lt;p&gt;AI agents can call APIs, use MCP tools, access databases, modify files, and trigger real-world actions.&lt;/p&gt;

&lt;p&gt;So the important security question isn't just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the agent trustworthy?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is this specific action authorized right now?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the problem I built &lt;strong&gt;Agent Firewall&lt;/strong&gt; to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The architecture is intentionally centered around one authorization boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent
   |
   v
Tool / API Request
   |
   v
FirewallSDK.authorize()
   |
   +--&amp;gt; identity
   +--&amp;gt; task
   +--&amp;gt; capability
   +--&amp;gt; provenance
   +--&amp;gt; delegation
   +--&amp;gt; constraints
   +--&amp;gt; validity
   +--&amp;gt; revocation
   +--&amp;gt; policy
   +--&amp;gt; security state
   |
   v
ALLOW / DENY
   |
   v
Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not the number of checks.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;where authority comes from&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Security analysis can provide evidence and context.&lt;/p&gt;

&lt;p&gt;It cannot create an authorization decision.&lt;/p&gt;

&lt;p&gt;A risk score cannot become an allow.&lt;/p&gt;

&lt;p&gt;An LLM cannot become an allow.&lt;/p&gt;

&lt;p&gt;Monitoring cannot become an allow.&lt;/p&gt;

&lt;p&gt;Aegis cannot become an allow.&lt;/p&gt;

&lt;p&gt;The canonical authorization boundary remains responsible for the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capabilities
&lt;/h2&gt;

&lt;p&gt;Agent Firewall treats permissions as signed capabilities.&lt;/p&gt;

&lt;p&gt;A capability can carry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;identity
action
constraints
issuer
expiration
delegation
nonce
signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payments.send
amount_max = 1000
expires_at = ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authority can be delegated or attenuated, but not widened.&lt;/p&gt;

&lt;p&gt;A child capability can become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;amount_max = 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It cannot turn itself into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;amount_max = 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same idea applies across delegation lineage.&lt;/p&gt;

&lt;p&gt;Every step must preserve or reduce authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aegis
&lt;/h2&gt;

&lt;p&gt;v2.4 introduced Aegis, the adaptive authority control plane.&lt;/p&gt;

&lt;p&gt;It allows live authority to be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;narrowed
suspended
revalidated
revoked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while a task is running.&lt;/p&gt;

&lt;p&gt;But Aegis has a very deliberate limitation.&lt;/p&gt;

&lt;p&gt;It can restrict authority.&lt;/p&gt;

&lt;p&gt;It cannot grant authority.&lt;/p&gt;

&lt;p&gt;Its integration with the SDK is essentially:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Aegis
   |
   v
deny-only gate
   |
   v
FirewallSDK.authorize()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no Aegis → ALLOW path.&lt;/p&gt;

&lt;p&gt;That separation is important because otherwise the system would eventually have two authorization engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then came v2.5
&lt;/h2&gt;

&lt;p&gt;I decided to stop adding features and attack what already existed.&lt;/p&gt;

&lt;p&gt;The v2.5 mission was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Attack the shipped boundary until a guarantee breaks, the attack is contained, or a limitation becomes clear.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I ran &lt;strong&gt;22 attacks&lt;/strong&gt; against v2.4.&lt;/p&gt;

&lt;p&gt;And we found real problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  An expired capability could be allowed
&lt;/h3&gt;

&lt;p&gt;The most serious finding was an expiry check that could silently abstain when the firewall could not establish the current time.&lt;/p&gt;

&lt;p&gt;That meant a legitimate signature could still result in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expired capability
        |
        v
authorized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;v2.5 changes that to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clock unavailable
        |
        v
DENY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Internal security state could raise exceptions
&lt;/h3&gt;

&lt;p&gt;Failures in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;revocation&lt;/li&gt;
&lt;li&gt;delegation lineage&lt;/li&gt;
&lt;li&gt;issuer trust&lt;/li&gt;
&lt;li&gt;risk state&lt;/li&gt;
&lt;li&gt;refusal state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;could previously escape &lt;code&gt;authorize()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That matters because an exception isn't a security decision.&lt;/p&gt;

&lt;p&gt;v2.5 turns those failures into explicit denials such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;revocation_state_unavailable:{Type}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The boundary decides.&lt;/p&gt;

&lt;p&gt;The caller does not.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorization and execution could disagree
&lt;/h3&gt;

&lt;p&gt;Three integrations had another interesting problem.&lt;/p&gt;

&lt;p&gt;The firewall authorized one representation of a request, while the handler could receive another.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;authorize({"amount": 10})
        |
        v
ALLOW

handler({"amount": 5000})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The authorization boundary itself was correct.&lt;/p&gt;

&lt;p&gt;The integration around it wasn't.&lt;/p&gt;

&lt;p&gt;v2.5 fixes this structurally by normalizing or settling the request once and giving the same object to both authorization and execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authority envelopes
&lt;/h2&gt;

&lt;p&gt;v2.4 also introduced &lt;code&gt;AuthorityEnvelope&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It provides a projection of what a capability can still do after considering its constraints and delegation lineage.&lt;/p&gt;

&lt;p&gt;But an envelope is deliberately &lt;strong&gt;not&lt;/strong&gt; an authorization decision.&lt;/p&gt;

&lt;p&gt;The guarantee is one-way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Envelope excludes request
        |
        v
authorize() must deny
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Envelope does not exclude request
        |
        v
authorize() must allow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction prevents an analytical projection from becoming a second authorization path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security model
&lt;/h2&gt;

&lt;p&gt;The deeper principle behind the project is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evidence
   |
   v
Context
   |
   v
Authorization
   |
   v
Authority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evidence
   |
   v
Authority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A signature is evidence.&lt;/p&gt;

&lt;p&gt;A risk score is evidence.&lt;/p&gt;

&lt;p&gt;A monitoring result is evidence.&lt;/p&gt;

&lt;p&gt;An AI-generated assessment is evidence.&lt;/p&gt;

&lt;p&gt;None of them should automatically become authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  And the tests?
&lt;/h2&gt;

&lt;p&gt;v2.5 has &lt;strong&gt;16 named security invariants&lt;/strong&gt; covering properties such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AUTHORIZATION_UNIQUENESS
MODEL_NON_AUTHORITY
CONTROL_PLANE_INTEGRITY
PROVENANCE_INTEGRITY
FAIL_CLOSED
ENVELOPE_SOUNDNESS
DELEGATION_MONOTONICITY
CAPABILITY_MONOTONICITY
REVOCATION_MONOTONICITY
POLICY_NON_WIDENING
AEGIS_STATE_TRANSITIONS
REVALIDATION_CONSISTENCY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting rule is that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNVERIFIABLE != PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an invariant cannot establish its claim, it does not quietly report success.&lt;/p&gt;

&lt;p&gt;That is a small implementation detail with a large security consequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What v2.5 taught me
&lt;/h2&gt;

&lt;p&gt;The hardest bugs weren't always sophisticated attacks.&lt;/p&gt;

&lt;p&gt;Some were caused by something much simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unknown
   |
   v
nothing obviously wrong
   |
   v
allow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the dangerous direction.&lt;/p&gt;

&lt;p&gt;The safer model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unknown
   |
   v
cannot establish
   |
   v
deny / restrict / revalidate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent Firewall v2.5 is therefore less about adding another security feature and more about making the existing boundary harder to escape.&lt;/p&gt;

&lt;p&gt;The goal remains simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agents can have powerful capabilities. Those capabilities should be explicit, bounded, and enforceable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;github:&lt;a href="https://github.com/Shubhbhangoo/agent-firewall" rel="noopener noreferrer"&gt;https://github.com/Shubhbhangoo/agent-firewall&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>security</category>
      <category>agents</category>
    </item>
    <item>
      <title>I Built a Security Firewall for AI Agents: From 73 Tests to 1,600+</title>
      <dc:creator>Shubhbhangoo</dc:creator>
      <pubDate>Sun, 23 Aug 2026 14:05:55 +0000</pubDate>
      <link>https://dev.to/shubhbhangoo/i-built-a-security-firewall-for-ai-agents-from-73-tests-to-1600-56ga</link>
      <guid>https://dev.to/shubhbhangoo/i-built-a-security-firewall-for-ai-agents-from-73-tests-to-1600-56ga</guid>
      <description>&lt;p&gt;AI agents are becoming increasingly capable of using tools.&lt;/p&gt;

&lt;p&gt;They can call APIs, access databases, execute code, interact with MCP servers, make HTTP requests, and potentially perform actions with real-world consequences.&lt;/p&gt;

&lt;p&gt;That creates a question I kept coming back to:&lt;/p&gt;

&lt;p&gt;What actually stands between an AI agent and a dangerous tool call?&lt;/p&gt;

&lt;p&gt;I decided to build that layer.&lt;/p&gt;

&lt;p&gt;I called it Agent Firewall.&lt;/p&gt;

&lt;p&gt;What is Agent Firewall?&lt;/p&gt;

&lt;p&gt;Agent Firewall is an authorization and security layer that sits between AI agents and the tools they want to use.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;p&gt;AI Agent&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Agent Firewall&lt;br&gt;
   |&lt;br&gt;
   +--&amp;gt; Allow&lt;br&gt;
   +--&amp;gt; Deny&lt;br&gt;
   +--&amp;gt; Require Approval&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Tool / API / MCP Server&lt;/p&gt;

&lt;p&gt;Instead of trusting an agent simply because it is authenticated, the firewall evaluates whether that specific operation is authorized.&lt;/p&gt;

&lt;p&gt;The project started as a relatively small policy engine.&lt;/p&gt;

&lt;p&gt;It became considerably larger.&lt;/p&gt;




&lt;p&gt;v0.1: Start with the obvious problem&lt;/p&gt;

&lt;p&gt;The first version focused on basic authorization.&lt;/p&gt;

&lt;p&gt;A tool request could result in:&lt;/p&gt;

&lt;p&gt;ALLOW&lt;br&gt;
DENY&lt;br&gt;
APPROVAL&lt;/p&gt;

&lt;p&gt;The firewall was designed to fail closed.&lt;/p&gt;

&lt;p&gt;If there wasn't an applicable rule, the request wasn't allowed to magically pass through.&lt;/p&gt;

&lt;p&gt;I also started testing things that shouldn't work, rather than only testing happy paths.&lt;/p&gt;

&lt;p&gt;That became a recurring theme throughout the project.&lt;/p&gt;

&lt;p&gt;A security boundary needs to be much more interested in what happens when someone tries to break it than a normal application usually is.&lt;/p&gt;




&lt;p&gt;v0.2: Make policies harder to break&lt;/p&gt;

&lt;p&gt;The next version made the policy system more expressive and defensive.&lt;/p&gt;

&lt;p&gt;Policies gained things like:&lt;/p&gt;

&lt;p&gt;Generic argument matching&lt;/p&gt;

&lt;p&gt;Argument validation&lt;/p&gt;

&lt;p&gt;Policy validation&lt;/p&gt;

&lt;p&gt;Request IDs&lt;/p&gt;

&lt;p&gt;Better auditability&lt;/p&gt;

&lt;p&gt;MCP bypass testing&lt;/p&gt;

&lt;p&gt;The test suite reached 73 tests.&lt;/p&gt;

&lt;p&gt;At this point I started treating the firewall less like a feature and more like a security boundary.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A normal application can sometimes recover from an unexpected input.&lt;/p&gt;

&lt;p&gt;An authorization layer should preferably say:&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;




&lt;p&gt;v0.3: Agents need identities&lt;/p&gt;

&lt;p&gt;A tool shouldn't just ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this operation allowed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should also ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this operation allowed for this agent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So Agent Firewall became identity-aware.&lt;/p&gt;

&lt;p&gt;This introduced:&lt;/p&gt;

&lt;p&gt;Agent-specific authorization&lt;/p&gt;

&lt;p&gt;Identity-aware policies&lt;/p&gt;

&lt;p&gt;Conflict resolution&lt;/p&gt;

&lt;p&gt;More precise policy matching&lt;/p&gt;

&lt;p&gt;Concurrency testing&lt;/p&gt;

&lt;p&gt;Performance benchmarking&lt;/p&gt;

&lt;p&gt;The test suite reached 145 tests.&lt;/p&gt;

&lt;p&gt;The architecture was starting to become something more interesting than a collection of if statements.&lt;/p&gt;




&lt;p&gt;v0.4: Cryptographic identity&lt;/p&gt;

&lt;p&gt;An agent name is not an identity.&lt;/p&gt;

&lt;p&gt;If a request simply says:&lt;/p&gt;

&lt;p&gt;agent = finance-agent&lt;/p&gt;

&lt;p&gt;then anyone who can claim that string could potentially impersonate the agent.&lt;/p&gt;

&lt;p&gt;So the next step was cryptographic identity.&lt;/p&gt;

&lt;p&gt;Agent Firewall gained:&lt;/p&gt;

&lt;p&gt;Cryptographic agent identities&lt;/p&gt;

&lt;p&gt;Key lifecycle management&lt;/p&gt;

&lt;p&gt;Key rotation&lt;/p&gt;

&lt;p&gt;Key revocation&lt;/p&gt;

&lt;p&gt;Persistent identity state&lt;/p&gt;

&lt;p&gt;Cryptographically chained audit logs&lt;/p&gt;

&lt;p&gt;The test suite reached 264 tests.&lt;/p&gt;

&lt;p&gt;This was one of the points where the project really started feeling like security infrastructure rather than an ordinary authorization library.&lt;/p&gt;




&lt;p&gt;v0.5: Capabilities&lt;/p&gt;

&lt;p&gt;Identity answers who the agent is.&lt;/p&gt;

&lt;p&gt;But I also needed to answer:&lt;/p&gt;

&lt;p&gt;What is the agent actually allowed to do?&lt;/p&gt;

&lt;p&gt;That led to capability-based authorization.&lt;/p&gt;

&lt;p&gt;Capabilities became first-class permissions.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;finance-agent&lt;br&gt;
    |&lt;br&gt;
    +-- payments.send&lt;/p&gt;

&lt;p&gt;I also added:&lt;/p&gt;

&lt;p&gt;Rate limiting&lt;/p&gt;

&lt;p&gt;Spending budgets&lt;/p&gt;

&lt;p&gt;Persistent security state&lt;/p&gt;

&lt;p&gt;Human approval workflows&lt;/p&gt;

&lt;p&gt;Capability requirements&lt;/p&gt;

&lt;p&gt;Policy conflict handling&lt;/p&gt;

&lt;p&gt;The test suite reached 390 tests.&lt;/p&gt;

&lt;p&gt;Now an agent could be identified and restricted by the authority it possessed.&lt;/p&gt;




&lt;p&gt;v0.6: Signed capabilities&lt;/p&gt;

&lt;p&gt;This was a much bigger step.&lt;/p&gt;

&lt;p&gt;Capabilities themselves became cryptographically signed permissions.&lt;/p&gt;

&lt;p&gt;A capability could contain things such as:&lt;/p&gt;

&lt;p&gt;Agent&lt;br&gt;
Capability&lt;br&gt;
Issuer&lt;br&gt;
Constraints&lt;br&gt;
Expiration&lt;br&gt;
Signature&lt;/p&gt;

&lt;p&gt;I added explicit capability namespaces:&lt;/p&gt;

&lt;p&gt;payments.send&lt;br&gt;
payments.refund&lt;br&gt;
payments.*&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;payments.* → payments.send     ✅&lt;br&gt;
payments.* → payments.refund   ✅&lt;br&gt;
payments.* → accounts.read     ❌&lt;/p&gt;

&lt;p&gt;Then came attenuation.&lt;/p&gt;

&lt;p&gt;A capability with:&lt;/p&gt;

&lt;p&gt;payments.*&lt;br&gt;
amount_max = 1000&lt;/p&gt;

&lt;p&gt;could be narrowed to:&lt;/p&gt;

&lt;p&gt;payments.*&lt;br&gt;
amount_max = 100&lt;/p&gt;

&lt;p&gt;but it couldn't suddenly become:&lt;/p&gt;

&lt;p&gt;amount_max = 10000&lt;/p&gt;

&lt;p&gt;That led naturally into delegation.&lt;/p&gt;

&lt;p&gt;An agent could delegate authority to another agent, but the delegated authority couldn't exceed the original authority.&lt;/p&gt;

&lt;p&gt;Replay protection was also introduced using nonces and capability fingerprints.&lt;/p&gt;

&lt;p&gt;The test suite reached 737 tests.&lt;/p&gt;




&lt;p&gt;v0.7: Leave the Python sandbox&lt;/p&gt;

&lt;p&gt;At this point I had a fairly serious authorization model.&lt;/p&gt;

&lt;p&gt;But there was another problem.&lt;/p&gt;

&lt;p&gt;A security system isn't particularly useful if it only protects a function inside your application.&lt;/p&gt;

&lt;p&gt;Real agents interact with external systems.&lt;/p&gt;

&lt;p&gt;So v0.7 pushed the capability model across actual protocol boundaries.&lt;/p&gt;

&lt;p&gt;Agent Firewall gained:&lt;/p&gt;

&lt;p&gt;MCP authorization&lt;/p&gt;

&lt;p&gt;HTTP authorization&lt;/p&gt;

&lt;p&gt;Signed capability transport&lt;/p&gt;

&lt;p&gt;HTTP method/path namespace mapping&lt;/p&gt;

&lt;p&gt;Cross-agent capability binding&lt;/p&gt;

&lt;p&gt;Request constraint enforcement&lt;/p&gt;

&lt;p&gt;Adversarial protocol testing&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;POST /payments&lt;br&gt;
        ↓&lt;br&gt;
http.POST.payments&lt;br&gt;
        ↓&lt;br&gt;
Capability verification&lt;br&gt;
        ↓&lt;br&gt;
Authorization&lt;br&gt;
        ↓&lt;br&gt;
Handler&lt;/p&gt;

&lt;p&gt;The same security model could now be applied across different ways an agent might reach a tool.&lt;/p&gt;




&lt;p&gt;v0.8: Capabilities need a lifecycle&lt;/p&gt;

&lt;p&gt;Then I ran into another problem.&lt;/p&gt;

&lt;p&gt;A capability isn't simply:&lt;/p&gt;

&lt;p&gt;valid&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;invalid&lt;/p&gt;

&lt;p&gt;It has a history.&lt;/p&gt;

&lt;p&gt;It might be:&lt;/p&gt;

&lt;p&gt;ISSUED&lt;br&gt;
   ↓&lt;br&gt;
DELEGATED&lt;br&gt;
   ↓&lt;br&gt;
ATTENUATED&lt;br&gt;
   ↓&lt;br&gt;
USED&lt;br&gt;
   ↓&lt;br&gt;
REPLAYED&lt;br&gt;
   ↓&lt;br&gt;
REVOKED&lt;br&gt;
   ↓&lt;br&gt;
EXPIRED&lt;/p&gt;

&lt;p&gt;So v0.8 introduced explicit capability lifecycle tracking.&lt;/p&gt;

&lt;p&gt;More importantly, lifecycle and revocation state became persistent.&lt;/p&gt;

&lt;p&gt;I added SQLite-backed storage so security state could survive process restarts.&lt;/p&gt;

&lt;p&gt;That meant the system could remember:&lt;/p&gt;

&lt;p&gt;Revoked capabilities&lt;/p&gt;

&lt;p&gt;Lifecycle history&lt;/p&gt;

&lt;p&gt;Capability usage&lt;/p&gt;

&lt;p&gt;Replay events&lt;/p&gt;

&lt;p&gt;Authorization denials&lt;/p&gt;

&lt;p&gt;Expiration events&lt;/p&gt;

&lt;p&gt;The v0.8 checkpoint reached 1,438 passing tests.&lt;/p&gt;




&lt;p&gt;v0.9: Make it usable&lt;/p&gt;

&lt;p&gt;Security infrastructure isn't very useful if developers hate integrating it.&lt;/p&gt;

&lt;p&gt;So v0.9 focused on the developer experience.&lt;/p&gt;

&lt;p&gt;Instead of forcing developers to manually construct every authorization call, they can use:&lt;/p&gt;

&lt;p&gt;from firewall.protect import protect&lt;/p&gt;

&lt;p&gt;@protect(&lt;br&gt;
    sdk=sdk,&lt;br&gt;
    capability=capability,&lt;br&gt;
)&lt;br&gt;
def send_payment(amount):&lt;br&gt;
    return amount&lt;/p&gt;

&lt;p&gt;The important invariant remains:&lt;/p&gt;

&lt;p&gt;authorize()&lt;br&gt;
    ↓&lt;br&gt;
ALLOW&lt;br&gt;
    ↓&lt;br&gt;
handler()&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;handler()&lt;br&gt;
    ↓&lt;br&gt;
oops, authorization failed&lt;/p&gt;

&lt;p&gt;Denied operations don't reach the handler.&lt;/p&gt;

&lt;p&gt;I also added reusable protected tools:&lt;/p&gt;

&lt;p&gt;from firewall.tools import ProtectedTool&lt;/p&gt;

&lt;p&gt;tool = ProtectedTool(&lt;br&gt;
    sdk=sdk,&lt;br&gt;
    capability=capability,&lt;br&gt;
    handler=send_payment,&lt;br&gt;
)&lt;/p&gt;




&lt;p&gt;Tool adapters&lt;/p&gt;

&lt;p&gt;v0.9 also introduced vendor-neutral and vendor-specific tool adapters.&lt;/p&gt;

&lt;p&gt;The project now supports adapters for:&lt;/p&gt;

&lt;p&gt;OpenAI tools&lt;/p&gt;

&lt;p&gt;Anthropic tools&lt;/p&gt;

&lt;p&gt;Generic tool calls&lt;/p&gt;

&lt;p&gt;The adapters translate provider-specific formats, but they don't create authority.&lt;/p&gt;

&lt;p&gt;Authorization stays inside the firewall.&lt;/p&gt;

&lt;p&gt;A vendor-neutral request can be normalized into a common representation before reaching the authorization layer.&lt;/p&gt;

&lt;p&gt;That means the security model doesn't need to change every time an agent framework changes its tool-call format.&lt;/p&gt;




&lt;p&gt;Lifecycle investigation&lt;/p&gt;

&lt;p&gt;Another v0.9 addition was a read-only explanation layer.&lt;/p&gt;

&lt;p&gt;Instead of creating another authorization engine, the explanation system reads lifecycle history and answers questions like:&lt;/p&gt;

&lt;p&gt;What happened to this capability?&lt;/p&gt;

&lt;p&gt;Was it revoked?&lt;/p&gt;

&lt;p&gt;Was it replayed?&lt;/p&gt;

&lt;p&gt;Was the request denied?&lt;/p&gt;

&lt;p&gt;What was the latest lifecycle event?&lt;/p&gt;

&lt;p&gt;This makes investigating authorization decisions much easier without introducing a second source of truth.&lt;/p&gt;




&lt;p&gt;CLI&lt;/p&gt;

&lt;p&gt;v0.9 also introduced a CLI:&lt;/p&gt;

&lt;p&gt;firewall --help&lt;br&gt;
firewall init --path firewall.yaml&lt;br&gt;
firewall validate firewall.yaml&lt;br&gt;
firewall inspect-token &lt;br&gt;
firewall explain lifecycle.db&lt;/p&gt;

&lt;p&gt;The CLI uses the same underlying Python APIs as the SDK.&lt;/p&gt;

&lt;p&gt;One authorization engine.&lt;/p&gt;

&lt;p&gt;Different interfaces.&lt;/p&gt;




&lt;p&gt;Property-based testing&lt;/p&gt;

&lt;p&gt;I also started using Hypothesis alongside the existing adversarial tests.&lt;/p&gt;

&lt;p&gt;Instead of writing only:&lt;/p&gt;

&lt;p&gt;test_input_1&lt;br&gt;
test_input_2&lt;br&gt;
test_input_3&lt;/p&gt;

&lt;p&gt;I can describe properties the system should maintain and let generated inputs explore the edges.&lt;/p&gt;

&lt;p&gt;The property-based tests cover areas such as:&lt;/p&gt;

&lt;p&gt;Input normalization&lt;/p&gt;

&lt;p&gt;Lifecycle snapshots&lt;/p&gt;

&lt;p&gt;Persistence round trips&lt;/p&gt;

&lt;p&gt;Authorization stability&lt;/p&gt;

&lt;p&gt;Capability transport&lt;/p&gt;

&lt;p&gt;Property-based testing isn't a magic security certificate.&lt;/p&gt;

&lt;p&gt;It's another way to find weird combinations that manually written tests might miss.&lt;/p&gt;




&lt;p&gt;v1.0: Persistent key management&lt;/p&gt;

&lt;p&gt;The v1.0 release moves deeper into cryptographic key infrastructure.&lt;/p&gt;

&lt;p&gt;One of the major additions is persistent key management through SQLite.&lt;/p&gt;

&lt;p&gt;Previously, key state could exist only in memory.&lt;/p&gt;

&lt;p&gt;Now the key manager can persist:&lt;/p&gt;

&lt;p&gt;Key IDs&lt;/p&gt;

&lt;p&gt;Private/public key material&lt;/p&gt;

&lt;p&gt;Active key state&lt;/p&gt;

&lt;p&gt;Retired keys&lt;/p&gt;

&lt;p&gt;Trusted issuers&lt;/p&gt;

&lt;p&gt;Key rotation can therefore survive process restarts.&lt;/p&gt;

&lt;p&gt;The model is roughly:&lt;/p&gt;

&lt;p&gt;Active Key&lt;br&gt;
    |&lt;br&gt;
    | rotate&lt;br&gt;
    v&lt;br&gt;
Retired Key&lt;/p&gt;

&lt;p&gt;New Key&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Active Key&lt;/p&gt;

&lt;p&gt;The implementation also checks for invalid persistent states, such as multiple active keys.&lt;/p&gt;

&lt;p&gt;This is important because cryptographic infrastructure shouldn't quietly accept corrupted or contradictory security state.&lt;/p&gt;




&lt;p&gt;The architecture now&lt;/p&gt;

&lt;p&gt;The system has evolved quite a bit from the original:&lt;/p&gt;

&lt;p&gt;Agent → Firewall → Tool&lt;/p&gt;

&lt;p&gt;The security path is now closer to:&lt;/p&gt;

&lt;p&gt;AI AGENT&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
             Provider Adapter&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
              Tool Normalization&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
              Agent Identity&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
            Signed Capability&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
              Namespace Check&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
                Constraints&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
               Validity Check&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
              Replay Protection&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
                  Policy&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
             Rate Limit / Budget&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
                 Approval&lt;br&gt;
                     |&lt;br&gt;
                     v&lt;br&gt;
               Authorization&lt;br&gt;
                  /     \&lt;br&gt;
               DENY     ALLOW&lt;br&gt;
                 |        |&lt;br&gt;
                 X        v&lt;br&gt;
                       Tool Handler&lt;br&gt;
                           |&lt;br&gt;
                           v&lt;br&gt;
                        Real Tool&lt;/p&gt;

&lt;p&gt;And underneath it:&lt;/p&gt;

&lt;p&gt;Persistent Security State&lt;br&gt;
        |&lt;br&gt;
        +-- Revocations&lt;br&gt;
        +-- Lifecycle&lt;br&gt;
        +-- Keys&lt;br&gt;
        +-- Audit&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;The tool should never execute before the security boundary has authorized it.&lt;/p&gt;




&lt;p&gt;1,600+ tests later&lt;/p&gt;

&lt;p&gt;One thing I really wanted from the project was for the test suite to grow alongside the attack surface.&lt;/p&gt;

&lt;p&gt;The progression looked roughly like:&lt;/p&gt;

&lt;p&gt;v0.2      73 tests&lt;br&gt;
v0.3     145 tests&lt;br&gt;
v0.4     264 tests&lt;br&gt;
v0.5     390 tests&lt;br&gt;
v0.6     737 tests&lt;br&gt;
v0.8   1,438 tests&lt;br&gt;
v0.9   1,602 tests&lt;/p&gt;

&lt;p&gt;The tests cover areas including:&lt;/p&gt;

&lt;p&gt;Policy conflicts&lt;/p&gt;

&lt;p&gt;Identity security&lt;/p&gt;

&lt;p&gt;Cryptographic verification&lt;/p&gt;

&lt;p&gt;Key lifecycle&lt;/p&gt;

&lt;p&gt;Capability authorization&lt;/p&gt;

&lt;p&gt;Delegation&lt;/p&gt;

&lt;p&gt;Attenuation&lt;/p&gt;

&lt;p&gt;Replay protection&lt;/p&gt;

&lt;p&gt;Rate limits&lt;/p&gt;

&lt;p&gt;Budgets&lt;/p&gt;

&lt;p&gt;Approvals&lt;/p&gt;

&lt;p&gt;Persistent state&lt;/p&gt;

&lt;p&gt;Lifecycle tracking&lt;/p&gt;

&lt;p&gt;Audit integrity&lt;/p&gt;

&lt;p&gt;Concurrency&lt;/p&gt;

&lt;p&gt;MCP&lt;/p&gt;

&lt;p&gt;HTTP&lt;/p&gt;

&lt;p&gt;Tool adapters&lt;/p&gt;

&lt;p&gt;Adversarial combinations&lt;/p&gt;

&lt;p&gt;The number itself isn't a security guarantee.&lt;/p&gt;

&lt;p&gt;But watching the test suite grow alongside the architecture has been useful.&lt;/p&gt;




&lt;p&gt;v1.0 is released 🔐&lt;/p&gt;

&lt;p&gt;After all those iterations, Agent Firewall v1.0 is now released.&lt;/p&gt;

&lt;p&gt;What started as a small policy firewall evolved into an authorization layer with:&lt;/p&gt;

&lt;p&gt;Cryptographic agent identities&lt;/p&gt;

&lt;p&gt;Signed capabilities&lt;/p&gt;

&lt;p&gt;Capability namespaces&lt;/p&gt;

&lt;p&gt;Constraints&lt;/p&gt;

&lt;p&gt;Delegation&lt;/p&gt;

&lt;p&gt;Attenuation&lt;/p&gt;

&lt;p&gt;Replay protection&lt;/p&gt;

&lt;p&gt;MCP authorization&lt;/p&gt;

&lt;p&gt;HTTP authorization&lt;/p&gt;

&lt;p&gt;Human approval&lt;/p&gt;

&lt;p&gt;Budgets&lt;/p&gt;

&lt;p&gt;Rate limiting&lt;/p&gt;

&lt;p&gt;Capability lifecycle tracking&lt;/p&gt;

&lt;p&gt;Persistent revocation&lt;/p&gt;

&lt;p&gt;Persistent key management&lt;/p&gt;

&lt;p&gt;Tamper-evident audit logging&lt;/p&gt;

&lt;p&gt;Developer APIs&lt;/p&gt;

&lt;p&gt;Tool adapters&lt;/p&gt;

&lt;p&gt;CLI tooling&lt;/p&gt;

&lt;p&gt;Property-based testing&lt;/p&gt;

&lt;p&gt;The project has now crossed 1,600+ tests across the development releases.&lt;/p&gt;

&lt;p&gt;But v1.0 isn't the finish line.&lt;/p&gt;

&lt;p&gt;Security infrastructure needs continued testing, hardening, review, and scrutiny.&lt;/p&gt;

&lt;p&gt;The goal is to build a system where AI agents can remain powerful without giving them unlimited authority.&lt;/p&gt;

&lt;p&gt;Agents should be powerful. Their authority should be explicit, bounded, and enforceable.&lt;/p&gt;




&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;pip install agent-firewall&lt;/p&gt;

&lt;p&gt;For development:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/Shubhbhangoo/agent-firewall.git" rel="noopener noreferrer"&gt;https://github.com/Shubhbhangoo/agent-firewall.git&lt;/a&gt;&lt;br&gt;
cd agent-firewall&lt;br&gt;
pip install -e ".[dev]"&lt;/p&gt;

&lt;p&gt;Then protect a tool:&lt;/p&gt;

&lt;p&gt;from firewall.protect import protect&lt;/p&gt;

&lt;p&gt;@protect(&lt;br&gt;
    sdk=sdk,&lt;br&gt;
    capability=capability,&lt;br&gt;
)&lt;br&gt;
def send_payment(amount):&lt;br&gt;
    return amount&lt;/p&gt;

&lt;p&gt;Try Agent Firewall&lt;/p&gt;

&lt;p&gt;The project is open source:&lt;/p&gt;

&lt;p&gt;[Agent Firewall on GitHub](&lt;a href="https://github.com/Shubhbhangoo/agent-firewall" rel="noopener noreferrer"&gt;https://github.com/Shubhbhangoo/agent-firewall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're working on AI agents, MCP tools, automated workflows, or security infrastructure, I'd be interested in seeing how you're approaching authorization and tool security.&lt;/p&gt;

&lt;p&gt;Agent Firewall v1.0 is out. 🔐&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>api</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Built a Capability-Based Security Layer for AI Agents — Here's Why It Matters</title>
      <dc:creator>Shubhbhangoo</dc:creator>
      <pubDate>Sat, 22 Aug 2026 20:48:47 +0000</pubDate>
      <link>https://dev.to/shubhbhangoo/i-built-a-capability-based-security-layer-for-ai-agents-heres-why-it-matters-4kfc</link>
      <guid>https://dev.to/shubhbhangoo/i-built-a-capability-based-security-layer-for-ai-agents-heres-why-it-matters-4kfc</guid>
      <description>&lt;p&gt;I Built a Capability-Based Security Layer for AI Agents — Here's Why It Matters&lt;/p&gt;

&lt;p&gt;The Problem Nobody's Talking About&lt;/p&gt;

&lt;p&gt;AI agents are everywhere now. They book flights, send emails, process payments, and access your codebase. But here's the question nobody asks:&lt;/p&gt;

&lt;p&gt;Who authorizes which agent can do what?&lt;/p&gt;

&lt;p&gt;Most people use API keys. An API key is binary — you have it or you don't. If your finance agent's key leaks, someone can drain your account. If your code-review agent gets compromised, it can push malicious commits. There's no middle ground.&lt;/p&gt;

&lt;p&gt;I kept hitting this wall while building agent prototypes. So I built something to fix it.&lt;/p&gt;

&lt;p&gt;What I Built&lt;/p&gt;

&lt;p&gt;Agent Firewall is a capability-based security layer for AI agents. It gives you fine-grained, cryptographically signed permissions with full lifecycle tracking.&lt;/p&gt;

&lt;p&gt;Instead of giving an agent a key that unlocks everything, you give it a capability:&lt;/p&gt;

&lt;p&gt;from agent_firewall import FirewallSDK&lt;/p&gt;

&lt;p&gt;sdk = FirewallSDK(&lt;br&gt;
revocation_store_path="revocations.db",&lt;br&gt;
lifecycle_store_path="lifecycle.db",&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;capability = sdk.issue(&lt;br&gt;
private_key=private_key,&lt;br&gt;
agent="finance-agent",&lt;br&gt;
capability="payments.send",&lt;br&gt;
constraints={&lt;br&gt;
"amount_max": 100,&lt;br&gt;
"expires_at": "2026-08-30T00:00:00Z"&lt;br&gt;
},&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;That agent can now send payments — but only under 100, and only until August 30th. If you revoke the capability, it's dead immediately. If someone replays an old request, it's rejected.&lt;/p&gt;

&lt;p&gt;Why Capabilities Beat API Keys&lt;/p&gt;

&lt;p&gt;API Keys vs Capabilities:&lt;/p&gt;

&lt;p&gt;API Keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Binary access&lt;/li&gt;
&lt;li&gt;No expiration built-in&lt;/li&gt;
&lt;li&gt;Can't be narrowed&lt;/li&gt;
&lt;li&gt;No audit trail&lt;/li&gt;
&lt;li&gt;Leaked = game over&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Granular permissions&lt;/li&gt;
&lt;li&gt;Time-bound by default&lt;/li&gt;
&lt;li&gt;Can be attenuated (narrowed without increasing authority)&lt;/li&gt;
&lt;li&gt;Full lifecycle: ISSUED → USED → REVOKED → EXPIRED&lt;/li&gt;
&lt;li&gt;Revocable individually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Capability Lifecycle&lt;/p&gt;

&lt;p&gt;Every capability in Agent Firewall has an explicit lifecycle:&lt;/p&gt;

&lt;p&gt;ISSUED&lt;br&gt;
↓&lt;br&gt;
DELEGATED&lt;br&gt;
↓&lt;br&gt;
ATTENUATED&lt;br&gt;
↓&lt;br&gt;
USED&lt;br&gt;
↓&lt;br&gt;
REPLAYED&lt;br&gt;
↓&lt;br&gt;
REVOKED&lt;br&gt;
↓&lt;br&gt;
DENIED&lt;br&gt;
↓&lt;br&gt;
EXPIRED&lt;/p&gt;

&lt;p&gt;This isn't just logging — it's security state. You can query whether a capability was used, replayed, or revoked. You can delegate a capability to another agent with reduced authority (your finance agent delegates payments.send with amount_max=50 to a sub-agent). You can attenuate it yourself.&lt;/p&gt;

&lt;p&gt;And in v0.8, all of this persists to SQLite. Restart your service, and the revocation registry and lifecycle history survive.&lt;/p&gt;

&lt;p&gt;Real-World Boundaries&lt;/p&gt;

&lt;p&gt;Agent Firewall isn't just a library — it's a boundary layer.&lt;/p&gt;

&lt;p&gt;HTTP boundary: Maps incoming requests to capability namespaces.&lt;/p&gt;

&lt;p&gt;POST /payments/refund&lt;br&gt;
↓&lt;br&gt;
http.POST.payments.refund&lt;/p&gt;

&lt;p&gt;MCP boundary: Authorizes Model Context Protocol tool calls before execution.&lt;/p&gt;

&lt;p&gt;Both boundaries verify the capability, bind it to the agent identity, check constraints, and apply replay protection before allowing execution.&lt;/p&gt;

&lt;p&gt;The Story Behind It&lt;/p&gt;

&lt;p&gt;Six months ago, I was building COVID detection models for college assignments. Standard undergrad ML stuff.&lt;/p&gt;

&lt;p&gt;Then I started playing with AI agents — LangChain, CrewAI, AutoGen — and kept running into the same problem: these agents have way too much power by default. An API key doesn't care which agent is calling, what it's doing, or when it should stop working.&lt;/p&gt;

&lt;p&gt;So I went deep on capability-based security — a model from operating systems research where permissions are unforgeable tokens that can be delegated and attenuated. I built Agent Firewall to bring that model to the agent era.&lt;/p&gt;

&lt;p&gt;It now has 1,438 passing tests, including adversarial regression coverage. It has architecture docs and a threat model. And yesterday, I shipped v0.8 with SQLite-backed lifecycle persistence.&lt;/p&gt;

&lt;p&gt;Where It's Going&lt;/p&gt;

&lt;p&gt;v1.0 is the next milestone. I'm freezing the API, shipping full documentation, and making this production-ready. The goal is simple:&lt;/p&gt;

&lt;p&gt;Every AI agent that calls a tool should have an authorization layer that understands who, what, and when.&lt;/p&gt;

&lt;p&gt;Check out the repo: github.com/Shubhbhangoo/agent-firewall/tree/v0.8&lt;/p&gt;

&lt;p&gt;If you're building agents that call tools — payments, APIs, databases, anything — I'd love your feedback. Drop an issue, open a PR, or just tell me what your authorization setup looks like today.&lt;/p&gt;

&lt;p&gt;I'm Shubh, a fresh CS grad building security infrastructure for the agent era. Follow along as I ship v1.0 and beyond.&lt;/p&gt;




</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
