<?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: SidClaw</title>
    <description>The latest articles on DEV Community by SidClaw (@sidclaw).</description>
    <link>https://dev.to/sidclaw</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3843766%2F8d4be4da-e7f2-461c-ab07-3552f55a7cfd.png</url>
      <title>DEV Community: SidClaw</title>
      <link>https://dev.to/sidclaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sidclaw"/>
    <language>en</language>
    <item>
      <title>63% of orgs can't enforce what their AI agents are allowed to do</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:06:38 +0000</pubDate>
      <link>https://dev.to/sidclaw/63-of-orgs-cant-enforce-what-their-ai-agents-are-allowed-to-do-2d1p</link>
      <guid>https://dev.to/sidclaw/63-of-orgs-cant-enforce-what-their-ai-agents-are-allowed-to-do-2d1p</guid>
      <description>&lt;p&gt;Kiteworks surveyed 225 security and IT leaders for their 2026 Data Security and Compliance Risk Forecast Report. Three numbers from it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;63% can't enforce purpose limitations on what their agents are authorized to do&lt;/li&gt;
&lt;li&gt;60% can't terminate a misbehaving agent&lt;/li&gt;
&lt;li&gt;33% lack evidence-quality audit trails entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And 51% of these organizations already have agents in production. So the gap isn't hypothetical. Agents are running without guardrails right now, in real environments, doing real things.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "enforce purpose limitations" actually means
&lt;/h2&gt;

&lt;p&gt;The Kiteworks phrasing is specific. It's not "we don't have a policy." It's "we have a policy and can't enforce it."&lt;/p&gt;

&lt;p&gt;That distinction matters. Most teams have some document that says "the support bot should only access customer records relevant to the active ticket." But nothing between the LLM deciding to &lt;code&gt;SELECT * FROM customers&lt;/code&gt; and the query executing. The policy exists on paper. The enforcement doesn't exist in code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What enforcement looks like
&lt;/h2&gt;

&lt;p&gt;Here's a LangChain agent with an email-sending tool. No governance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DynamicStructuredTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/core/tools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendEmailTool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DynamicStructuredTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send_email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Send an email to a customer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Email sent to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent decides to send an email. It sends. Nobody reviewed the recipient, the subject, or the body. If the LLM hallucinated the address or wrote something unhinged, it shipped.&lt;/p&gt;

&lt;p&gt;Now with &lt;code&gt;governTools()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;governTools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sidclaw/sdk/langchain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SidClawClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sidclaw/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SidClawClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://app.sidclaw.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIDCLAW_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;support-bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;governedTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;governTools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sendEmailTool&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same tool. But now when the agent calls &lt;code&gt;send_email&lt;/code&gt;, the action gets evaluated against a policy set before executing. If a policy says email-sending requires approval, the action holds. A reviewer sees the recipient, subject, body, and the agent's reasoning. They approve or deny. The agent resumes or stops.&lt;/p&gt;

&lt;p&gt;That's the enforcement the Kiteworks 63% is missing. Not the policy. The runtime check that the policy is actually followed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the policy engine does per tool call
&lt;/h2&gt;

&lt;p&gt;Three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Evaluates the action against priority-ordered policies. First match wins. Outcomes: &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;deny&lt;/code&gt;, &lt;code&gt;flag&lt;/code&gt; (hold for approval), or &lt;code&gt;log&lt;/code&gt; (allow but trace).&lt;/li&gt;
&lt;li&gt;If flagged, creates an approval request with the agent's identity, action name, input payload, reasoning, risk classification, and which policy triggered the hold.&lt;/li&gt;
&lt;li&gt;Records a trace event hash-chained to the previous event. Tampering with any record breaks the chain. That's the audit trail the other 33% from the Kiteworks report don't have.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this doesn't solve
&lt;/h2&gt;

&lt;p&gt;SidClaw governs actions. It doesn't filter LLM outputs for toxicity, check prompt injections, or validate that the agent's reasoning is sound. Those are different problems with different tools (Pangea, Lakera, etc.). This sits at the tool-call layer: the moment the agent decides to &lt;em&gt;do&lt;/em&gt; something in the real world.&lt;/p&gt;

&lt;p&gt;It also doesn't help if the 60% who can't kill a misbehaving agent don't have a policy that denies the misbehavior in the first place. You still need to define what's allowed and what isn't. The policy engine enforces. It doesn't write your policies for you.&lt;/p&gt;




&lt;p&gt;Kiteworks report: &lt;a href="https://www.kiteworks.com/cybersecurity-risk-management/ai-agent-data-governance-why-organizations-cant-stop-their-own-ai/" rel="noopener noreferrer"&gt;kiteworks.com&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://docs.sidclaw.com" rel="noopener noreferrer"&gt;docs.sidclaw.com&lt;/a&gt;&lt;br&gt;
TypeScript SDK: &lt;code&gt;npm install @sidclaw/sdk&lt;/code&gt;&lt;br&gt;
Python SDK: &lt;code&gt;pip install sidclaw&lt;/code&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>typescript</category>
      <category>governance</category>
    </item>
    <item>
      <title>Three agent frameworks, same missing piece</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Tue, 14 Apr 2026 21:41:49 +0000</pubDate>
      <link>https://dev.to/sidclaw/three-agent-frameworks-same-missing-piece-3mha</link>
      <guid>https://dev.to/sidclaw/three-agent-frameworks-same-missing-piece-3mha</guid>
      <description>&lt;p&gt;In the last 30 days, three separate agent frameworks received nearly identical feature requests from their communities. Different repos, different maintainers, different architectures. Same ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LangChain #35393 — "Agent Identity Verification"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Opened mid-April 2026. The thread (15+ comments and growing) asks for a way to verify agent identity before tool execution. Not after. Not in logs. Before the tool call happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI Agents SDK #2775 — governance collaboration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;imran-siddique opened this requesting a governance integration layer for the Agents SDK. The goal: define policies that run before an agent acts, not after it's already sent the email or deleted the row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrewAI #4596 — "Fail closed without pre-execution checks"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three comments. The request is direct: if a policy engine can't evaluate a tool call, block it. Don't default to allowing it. Fail closed, not fail open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they have in common
&lt;/h2&gt;

&lt;p&gt;Strip away the framework-specific language and all three issues describe the same architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent decides to call a tool&lt;/li&gt;
&lt;li&gt;Something checks whether that call should proceed&lt;/li&gt;
&lt;li&gt;If the check says no (or can't decide), the call doesn't happen&lt;/li&gt;
&lt;li&gt;Every decision gets logged&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Pre-execution evaluation with a default-deny posture.&lt;/p&gt;

&lt;p&gt;The reason this keeps coming up independently is that every team building production agents hits the same wall. The agent works. It works &lt;em&gt;too well&lt;/em&gt;. It sends emails nobody reviewed. It runs database queries nobody approved. It calls external APIs with real money attached.&lt;/p&gt;

&lt;p&gt;The observability layer (logging, tracing, monitoring) tells you what happened. It doesn't prevent anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is technically hard
&lt;/h2&gt;

&lt;p&gt;Each framework handles tool calls differently.&lt;/p&gt;

&lt;p&gt;LangChain wraps tools as &lt;code&gt;BaseTool&lt;/code&gt; instances with a &lt;code&gt;_run&lt;/code&gt; method. Intercepting means wrapping that method or using the callback system (which fires after invocation, not before, in most configurations).&lt;/p&gt;

&lt;p&gt;OpenAI's Agents SDK uses function definitions passed to the completions API. The tool call comes back in the API response. Intercepting means catching the response before the function executes — a different hook point than LangChain.&lt;/p&gt;

&lt;p&gt;CrewAI has its own task/tool abstraction with &lt;code&gt;@tool&lt;/code&gt; decorators. Intercepting means wrapping the decorated function or patching the task execution pipeline.&lt;/p&gt;

&lt;p&gt;Three frameworks, three interception points, three sets of lifecycle hooks. A governance layer that works across all of them needs to abstract over these differences without breaking the framework-specific semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually different between the requests
&lt;/h2&gt;

&lt;p&gt;Despite the shared pattern, each community emphasizes different aspects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain's thread&lt;/strong&gt; focuses on identity. Who is this agent? Can we verify its identity before trusting its tool calls? The concern is authentication, not just authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI's issue&lt;/strong&gt; frames it as collaboration between governance systems and the SDK. The language is about integration points and extensibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI's request&lt;/strong&gt; is the most operational. Fail closed. If you can't check, don't proceed. This is classic security engineering applied to agent behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Identity. Integration. Fail-closed defaults. Three angles on the same problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this tells us
&lt;/h2&gt;

&lt;p&gt;When three independent communities ask for the same thing within a month of each other, that's a market signal. Production agent deployments are hitting governance requirements that the frameworks weren't designed to handle.&lt;/p&gt;

&lt;p&gt;The frameworks were built for capability: make the agent smarter, give it more tools, let it reason better. Governance was someone else's problem.&lt;/p&gt;

&lt;p&gt;Now it's everyone's problem. And the teams filing these issues are the ones deploying agents into environments where "the agent decided it was fine" isn't an acceptable answer for why the production database got modified.&lt;/p&gt;

&lt;p&gt;No framework has shipped a complete answer yet. The issues are open, the discussions are active, and the architecture is still being figured out. But the convergence is real. Pre-execution governance for agent tool calls isn't a niche concern anymore. It's the feature request.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>governance</category>
      <category>security</category>
    </item>
    <item>
      <title>How to add human approval to MCP tool calls — no code changes</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Fri, 10 Apr 2026 21:47:49 +0000</pubDate>
      <link>https://dev.to/sidclaw/how-to-add-human-approval-to-mcp-tool-calls-no-code-changes-om0</link>
      <guid>https://dev.to/sidclaw/how-to-add-human-approval-to-mcp-tool-calls-no-code-changes-om0</guid>
      <description>&lt;p&gt;MCP servers do what agents tell them. There's no policy check between "the agent decided to run this query" and "the query executed." If you're running MCP servers in production, every tool call goes straight through.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://github.com/sidclawhq/mcp-guard" rel="noopener noreferrer"&gt;sidclaw-mcp-guard&lt;/a&gt; to fix that. It's a CLI that wraps any MCP server with policy-based guardrails. YAML rules, local approval dashboard, audit trail. No signup, no SaaS dependency. Apache 2.0.&lt;/p&gt;

&lt;p&gt;Here's what it looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  30-second demo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx sidclaw-mcp-guard@latest demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;ALLOW&lt;/span&gt;   &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
  &lt;span class="n"&gt;Allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;read&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;only&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="k"&gt;are&lt;/span&gt; &lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="k"&gt;HOLD&lt;/span&gt;    &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
  &lt;span class="n"&gt;Held&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Data&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;BLOCK&lt;/span&gt;   &lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
  &lt;span class="n"&gt;Blocked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;drop&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="k"&gt;Schema&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="k"&gt;are&lt;/span&gt; &lt;span class="n"&gt;never&lt;/span&gt; &lt;span class="n"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three decisions. Safe reads pass through. Writes wait for a human. Destructive DDL gets blocked outright.&lt;/p&gt;

&lt;p&gt;It catches compound statements too. &lt;code&gt;SELECT 1; DROP TABLE users&lt;/code&gt; doesn't sneak through as a read -- the destructive part gets flagged.&lt;/p&gt;

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

&lt;p&gt;mcp-guard is a proxy. It sits between your MCP client (Claude Desktop, Cursor, VS Code, whatever) and the upstream MCP server. Every &lt;code&gt;tools/call&lt;/code&gt; request passes through the guard first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Client  --&amp;gt;  sidclaw-mcp-guard  --&amp;gt;  MCP Server (postgres, filesystem, etc.)
                      |
                 policy.yaml
                      |
                 localhost:9091 (approval dashboard)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The guard reads your policies, classifies the tool call using semantic patterns, and decides: allow, hold for approval, or deny.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx sidclaw-mcp-guard@latest quickstart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a &lt;code&gt;policy.yaml&lt;/code&gt;, writes &lt;code&gt;.mcp.json&lt;/code&gt; for your client, and starts the approval dashboard at &lt;code&gt;localhost:9091&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To run it manually against any MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx sidclaw-mcp-guard &lt;span class="nt"&gt;--upstream&lt;/span&gt; &lt;span class="s2"&gt;"npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb"&lt;/span&gt; &lt;span class="nt"&gt;--ui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Policy rules
&lt;/h2&gt;

&lt;p&gt;Policies are YAML. Each rule matches a semantic pattern and decides what happens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow-reads&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read-only queries are safe&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sql-read&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;approve-writes&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Data changes need human review&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sql-write&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;approve&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny-destructive&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Schema changes are never allowed&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sql-destructive&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;

&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The patterns aren't regex. &lt;code&gt;sql-read&lt;/code&gt; matches SELECT, EXPLAIN, SHOW. &lt;code&gt;sql-write&lt;/code&gt; matches INSERT, UPDATE, DELETE. &lt;code&gt;sql-destructive&lt;/code&gt; catches DROP, TRUNCATE, ALTER, CREATE. The guard parses the intent, not just the string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shell commands too
&lt;/h2&gt;

&lt;p&gt;Works for filesystem and shell MCP servers, not just databases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shell-safe&lt;/code&gt; -- ls, cat, echo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shell-risky&lt;/code&gt; -- curl, wget, ssh&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shell-destructive&lt;/code&gt; -- rm -rf, chmod 777, dd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same pattern. Same YAML. You can mix SQL and shell rules in one policy file if your agent connects to multiple MCP servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit trail
&lt;/h2&gt;

&lt;p&gt;Every decision gets logged to &lt;code&gt;.sidclaw/audit.jsonl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM users"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"allow-reads"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"DELETE FROM users WHERE id=42"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"approve-writes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"approved"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"DROP TABLE users"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"deny-destructive"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every tool call, every decision, every approval. JSONL so you can grep it, pipe it, or ship it to whatever log aggregator you already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't solve
&lt;/h2&gt;

&lt;p&gt;mcp-guard governs tool calls. It doesn't filter LLM outputs, detect prompt injection, or validate agent reasoning. Those are different problems -- Pangea and Lakera handle the input/output layer. This sits at the action layer: the moment the agent decides to do something through an MCP server.&lt;/p&gt;

&lt;p&gt;It also doesn't replace proper database permissions. If your postgres user has DROP access and you don't want agents dropping tables, fix the permissions too. mcp-guard is a second layer, not a replacement for the first.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/sidclawhq/mcp-guard" rel="noopener noreferrer"&gt;github.com/sidclawhq/mcp-guard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;code&gt;sidclaw-mcp-guard&lt;/code&gt; v0.1.2&lt;/li&gt;
&lt;li&gt;License: Apache 2.0&lt;/li&gt;
&lt;li&gt;Demo: &lt;code&gt;npx sidclaw-mcp-guard@latest demo&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What is an MCP proxy and why does it need an approval layer?</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Sat, 04 Apr 2026 21:21:05 +0000</pubDate>
      <link>https://dev.to/sidclaw/what-is-an-mcp-proxy-and-why-does-it-need-an-approval-layer-296o</link>
      <guid>https://dev.to/sidclaw/what-is-an-mcp-proxy-and-why-does-it-need-an-approval-layer-296o</guid>
      <description>&lt;p&gt;MCP (Model Context Protocol) lets AI agents call external tools. A database query, a file write, an API call -- the agent decides what to do and the MCP server executes it. But there's nothing in the spec that evaluates whether that action &lt;em&gt;should&lt;/em&gt; happen.&lt;/p&gt;

&lt;p&gt;An MCP proxy sits between the agent and the MCP server. It intercepts every &lt;code&gt;tools/call&lt;/code&gt; request, does something with it, and forwards it (or doesn't). The proxy pattern isn't new -- it's how HTTP proxies, API gateways, and service meshes work. Apply it to MCP and you get an enforcement point for agent actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a plain proxy isn't enough
&lt;/h2&gt;

&lt;p&gt;Most MCP proxies today do routing, load balancing, or observability. They watch traffic. Some log it. A few do rate limiting.&lt;/p&gt;

&lt;p&gt;None of that stops an agent from running &lt;code&gt;DROP TABLE customers&lt;/code&gt; if the tool call is well-formed and the agent has access.&lt;/p&gt;

&lt;p&gt;30 CVEs have been filed against MCP servers in the last 60 days. 38% of those servers had no authentication at all. The attack surface is real. But even with auth in place, the question remains: should this specific tool call, with this specific payload, execute right now? Or should a human look at it first?&lt;/p&gt;

&lt;p&gt;That's what an approval layer adds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an approval layer actually does
&lt;/h2&gt;

&lt;p&gt;An MCP proxy with an approval layer intercepts &lt;code&gt;tools/call&lt;/code&gt; before it reaches the upstream server and does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Evaluates the action against a policy. Not a binary allow/deny on the tool name -- a policy that considers the action type, the payload content, the agent's identity, and the risk classification. A SELECT is different from a DELETE. Reading a public file is different from reading &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routes high-risk actions to a human reviewer. The reviewer sees the full context: what the agent wants to do, what it's sending, which policy flagged it, and (if the framework provides it) the agent's reasoning. They approve or deny. The action only proceeds after the decision.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Records everything in an audit trail. Not just "tool was called." The full chain: policy was evaluated, action was flagged, reviewer was notified, reviewer saw context X, reviewer approved at timestamp Y, action executed at timestamp Z. For regulated industries (FINRA 2026, EU AI Act), this chain is what auditors ask for.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The gap in the current ecosystem
&lt;/h2&gt;

&lt;p&gt;Here's what's already shipping for MCP governance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routing/gateway proxies (Gravitee, Cloudflare) handle traffic management and basic auth&lt;/li&gt;
&lt;li&gt;Discovery/posture tools (Cisco DefenseClaw) scan MCP servers for vulnerabilities&lt;/li&gt;
&lt;li&gt;Framework-native flags (OpenAI's &lt;code&gt;needsApproval&lt;/code&gt;) work within a single SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's missing: a proxy that sits in front of &lt;em&gt;any&lt;/em&gt; MCP server, evaluates each tool call against a real policy engine, and holds high-risk actions for human review with full context. That's the approval layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's building this
&lt;/h2&gt;

&lt;p&gt;A few teams are working on MCP governance proxies with approval capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sidclawhq/platform" rel="noopener noreferrer"&gt;SidClaw&lt;/a&gt; (what we built) wraps any stdio MCP server with policy evaluation, human approval workflows, and hash-chain audit trails. 18+ framework integrations. Apache 2.0 SDK.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://faramesh.dev/" rel="noopener noreferrer"&gt;Faramesh Labs&lt;/a&gt; published an Action Authorization Boundary with a custom policy language. 13 integrations. Open-core.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.openbox.ai/" rel="noopener noreferrer"&gt;OpenBox AI&lt;/a&gt; ships runtime governance with cryptographic attestation. $5M seed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hoop.dev/" rel="noopener noreferrer"&gt;hoop.dev&lt;/a&gt; routes infrastructure commands through Slack/Teams for approval. Focused on database and SSH, not general-purpose MCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The category is forming fast. A year ago nobody was building MCP governance. Now there are arxiv papers, seed rounds, and multiple open-source implementations.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need this
&lt;/h2&gt;

&lt;p&gt;If your agents only read data and the stakes are low, a proxy without an approval layer is fine. Log the calls, monitor for anomalies, move on.&lt;/p&gt;

&lt;p&gt;But if your agents can send emails, modify production databases, call payment APIs, or take any action that isn't trivially reversible -- you need something that evaluates the action before it happens. Not after. The audit trail is for proving what happened. The approval layer is for controlling what happens.&lt;/p&gt;




&lt;p&gt;SidClaw docs: &lt;a href="https://docs.sidclaw.com" rel="noopener noreferrer"&gt;docs.sidclaw.com&lt;/a&gt;&lt;br&gt;
MCP spec: &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>governance</category>
    </item>
    <item>
      <title>88% of orgs had AI agent incidents. 82% of execs think they're protected. here's the gap.</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Sat, 04 Apr 2026 04:21:48 +0000</pubDate>
      <link>https://dev.to/sidclaw/88-of-orgs-had-ai-agent-incidents-82-of-execs-think-theyre-protected-heres-the-gap-4g8i</link>
      <guid>https://dev.to/sidclaw/88-of-orgs-had-ai-agent-incidents-82-of-execs-think-theyre-protected-heres-the-gap-4g8i</guid>
      <description>&lt;p&gt;Gravitee surveyed 900+ executives and technical practitioners for their State of AI Agent Security 2026 report. Two numbers from it that don't make sense together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;88% of organizations reported confirmed or suspected AI agent security incidents in the last year&lt;/li&gt;
&lt;li&gt;82% of executives feel confident their existing policies protect against unauthorized agent actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both numbers are real. Both are from the same report. And they describe the same organizations.&lt;/p&gt;

&lt;p&gt;So what's going on?&lt;/p&gt;

&lt;h2&gt;
  
  
  The governance stack has a missing layer
&lt;/h2&gt;

&lt;p&gt;The report also found that 80.9% of technical teams have moved past planning into active testing or production. But only 14.4% deployed with full security/IT sign-off. That means the majority of agents running in production right now were deployed without the security team approving them.&lt;/p&gt;

&lt;p&gt;RSAC 2026 (March 23-27, San Francisco) made this painfully visible. Every major vendor announced agentic AI governance features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cisco open-sourced DefenseClaw -- scans MCP servers, inventories agent skills, maps agents to owners&lt;/li&gt;
&lt;li&gt;Microsoft's Agent Governance Toolkit hit 354 stars, covers all 10 OWASP Agentic risks&lt;/li&gt;
&lt;li&gt;AWS shipped Bedrock AgentCore Policy to GA across 13 regions&lt;/li&gt;
&lt;li&gt;ServiceNow announced AI Control Tower for agent monitoring&lt;/li&gt;
&lt;li&gt;CrowdStrike, Palo Alto, BeyondTrust, Wiz all announced agent-focused features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the pattern? Discovery, posture management, scanning, monitoring, identity. All important. All pre-execution or post-execution.&lt;/p&gt;

&lt;p&gt;None of them ship the approval primitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the approval primitive actually means
&lt;/h2&gt;

&lt;p&gt;An approval primitive is a runtime enforcement point that intercepts an agent's tool call &lt;em&gt;before&lt;/em&gt; it executes, evaluates it against a policy, and either allows it, denies it, or holds it for human review.&lt;/p&gt;

&lt;p&gt;Not "log it and alert later." Not "scan it before deployment." Not "monitor for anomalies after the fact."&lt;/p&gt;

&lt;p&gt;The action is literally paused. A human sees the exact payload -- the SQL query, the API request body, the email draft -- and makes a decision. Then the action proceeds or doesn't.&lt;/p&gt;

&lt;p&gt;That's the layer the Gravitee numbers are screaming about. 82% of executives think their policies protect them because policies exist on paper. But 88% had incidents because nothing enforced those policies at the moment an agent decided to act.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this gap exists
&lt;/h2&gt;

&lt;p&gt;Discovery and posture management are easier problems. You scan an environment, enumerate agents, classify risk. It's a batch job. You can ship it as a dashboard.&lt;/p&gt;

&lt;p&gt;Runtime approval is harder because it sits in the hot path. Every tool call hits it. Latency matters. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A policy engine that evaluates in milliseconds&lt;/li&gt;
&lt;li&gt;An approval workflow that doesn't block the agent forever&lt;/li&gt;
&lt;li&gt;Integration with the agent framework (LangChain, CrewAI, MCP, etc.) at the tool-call level&lt;/li&gt;
&lt;li&gt;An audit trail that's tamper-evident, not just append-only logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is infrastructure, not a feature. And infrastructure takes longer to build than scanners.&lt;/p&gt;

&lt;h2&gt;
  
  
  The competitive landscape is forming fast
&lt;/h2&gt;

&lt;p&gt;A few teams are working on this specific layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faramesh Labs published an arxiv paper on their Action Authorization Boundary -- deterministic enforcement with a custom policy language (FPL). 13 framework integrations. Open-core. 30 GitHub stars. Early but serious.&lt;/li&gt;
&lt;li&gt;OpenBox AI launched on Product Hunt with $5M seed from Tykhe Ventures. Runtime governance with cryptographic attestation. SDK for LangChain, LangGraph, Temporal, n8n.&lt;/li&gt;
&lt;li&gt;HumanLayer (YC F24) had the @require_approval primitive but pivoted to CodeLayer. The original SDK hasn't been updated since June 2025.&lt;/li&gt;
&lt;li&gt;SidClaw (us) ships the approval workflow with a policy engine, compliance mapping to FINRA 2026 and EU AI Act, and hash-chain audit trails. 18+ framework integrations. Apache 2.0 SDK.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are others (hoop.dev for Slack-routed infra approvals, AgentBouncr for lightweight policy enforcement, Barndoor AI for MCP-specific governance). The category is real and growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers predict
&lt;/h2&gt;

&lt;p&gt;Gravitee's report also found that 25.5% of deployed agents can create and task other agents. Agent-to-agent delegation without approval checkpoints is where the 88% incident number is going to get worse.&lt;/p&gt;

&lt;p&gt;The EU AI Act enforcement starts August 2026. FINRA's 2026 oversight report explicitly requires "explicit human checkpoints before execution" for agents that can act or transact. Regulatory pressure is real and has deadlines.&lt;/p&gt;

&lt;p&gt;If your agents are in production without an approval layer, the question isn't whether you'll have an incident. According to the data, you probably already have.&lt;/p&gt;




&lt;p&gt;Gravitee report: &lt;a href="https://www.gravitee.io/state-of-ai-agent-security" rel="noopener noreferrer"&gt;gravitee.io/state-of-ai-agent-security&lt;/a&gt;&lt;br&gt;
SidClaw docs: &lt;a href="https://docs.sidclaw.com" rel="noopener noreferrer"&gt;docs.sidclaw.com&lt;/a&gt;&lt;br&gt;
Faramesh: &lt;a href="https://faramesh.dev/" rel="noopener noreferrer"&gt;faramesh.dev&lt;/a&gt;&lt;br&gt;
OpenBox: &lt;a href="https://www.openbox.ai/" rel="noopener noreferrer"&gt;openbox.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agenticai</category>
      <category>governance</category>
    </item>
    <item>
      <title>Governing MCP tool calls in Claude Code -- before/after in 3 minutes</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Thu, 02 Apr 2026 06:22:47 +0000</pubDate>
      <link>https://dev.to/sidclaw/governing-mcp-tool-calls-in-claude-code-beforeafter-in-3-minutes-2mhe</link>
      <guid>https://dev.to/sidclaw/governing-mcp-tool-calls-in-claude-code-beforeafter-in-3-minutes-2mhe</guid>
      <description>&lt;p&gt;30 CVEs filed against MCP servers in 60 days. 38% have no authentication. And every MCP server your Claude Code session connects to is ungoverned -- tool calls go straight from the LLM to the server with no policy check, no approval step, no audit trail.&lt;/p&gt;

&lt;p&gt;We built a proxy that sits between Claude Code and any upstream MCP server. It evaluates every tool call against your policies before forwarding. Here's the before and after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before: ungoverned MCP server
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;.mcp.json&lt;/code&gt; points Claude Code directly at the MCP PostgreSQL server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="s2"&gt;"postgresql://localhost/mydb"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code asks to run &lt;code&gt;DROP TABLE customers&lt;/code&gt;. The MCP server executes it. Done. No one reviewed it, no one approved it, no record beyond whatever postgres logs you happen to have.&lt;/p&gt;

&lt;h2&gt;
  
  
  After: governed with sidclaw-mcp-proxy
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postgres-governed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@sidclaw/sdk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sidclaw-mcp-proxy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="s2"&gt;"--transport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SIDCLAW_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai_your_key_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SIDCLAW_AGENT_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-code-db-agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SIDCLAW_UPSTREAM_CMD"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SIDCLAW_UPSTREAM_ARGS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-y,@modelcontextprotocol/server-postgres,postgresql://localhost/mydb"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same MCP server underneath. But now every &lt;code&gt;tools/call&lt;/code&gt; request passes through SidClaw's policy engine first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SELECT (allowed):&lt;/strong&gt; Claude Code runs &lt;code&gt;SELECT * FROM customers&lt;/code&gt;. Policy matches "allow read queries." Passes through, ~50ms overhead. You don't notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DELETE (flagged):&lt;/strong&gt; Claude Code runs &lt;code&gt;DELETE FROM customers WHERE name = 'Eve Davis'&lt;/code&gt;. Policy matches "require approval for writes." The proxy returns an MCP error (-32001) with "Approval required" and a link. A reviewer gets a Slack notification (or Teams, email, dashboard -- 16 channels). They see the exact query, the agent ID, which policy triggered it. Approve or deny. Tell Claude Code to retry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DROP (denied):&lt;/strong&gt; Claude Code runs &lt;code&gt;DROP TABLE customers&lt;/code&gt;. Policy matches "block destructive DDL." Denied outright. Claude Code gets an error saying the operation was blocked by policy. No retry.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the approval flow actually works
&lt;/h2&gt;

&lt;p&gt;The proxy uses &lt;code&gt;error&lt;/code&gt; mode by default. When a tool call needs approval, it returns immediately with an MCP error. Claude Code shows you the error. You go approve (or deny) in the dashboard or Slack. Then you tell Claude Code "try again" and the second call succeeds.&lt;/p&gt;

&lt;p&gt;We don't use &lt;code&gt;block&lt;/code&gt; mode (which polls for 30 seconds waiting for a decision) because it'll freeze Claude Code. Error-then-retry is the right pattern here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code
    |
    v
sidclaw-mcp-proxy  (evaluates policy, ~50ms)
    |
    v
MCP PostgreSQL Server
    |
    v
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this wraps
&lt;/h2&gt;

&lt;p&gt;Any MCP server that uses stdio transport. We've tested with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@modelcontextprotocol/server-postgres&lt;/code&gt; (the example above)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@modelcontextprotocol/server-filesystem&lt;/code&gt; (flag writes, allow reads)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@modelcontextprotocol/server-github&lt;/code&gt; (flag PR merges, allow reads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool mappings are configurable per-tool via &lt;code&gt;SIDCLAW_TOOL_MAPPINGS&lt;/code&gt;. You can set data classification, skip governance on safe operations, and map tool names to policy operations using glob patterns (&lt;code&gt;db_*&lt;/code&gt;, &lt;code&gt;*_read&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't do
&lt;/h2&gt;

&lt;p&gt;It doesn't filter LLM outputs. It doesn't detect prompt injection. It doesn't validate that Claude Code's reasoning is correct. Those are different problems -- Pangea, Lakera, and others handle the input/output layer. SidClaw sits at the action layer: the moment the agent decides to do something in the real world.&lt;/p&gt;

&lt;p&gt;It also doesn't help if you're using Streamable HTTP transport with Claude Code. Right now this is stdio only, which is what Claude Code uses for local MCP servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;examples/claude-code-governed/&lt;/code&gt; directory in the repo has a working docker-compose setup. PostgreSQL with sample data, three pre-configured policies, and the &lt;code&gt;.mcp.json&lt;/code&gt; ready to copy. &lt;code&gt;docker compose up&lt;/code&gt; and you're testing in 2 minutes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.sidclaw.com/docs/integrations/claude-code" rel="noopener noreferrer"&gt;docs.sidclaw.com/docs/integrations/claude-code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/sidclawhq/platform" rel="noopener noreferrer"&gt;github.com/sidclawhq/platform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SDK: &lt;code&gt;npm install @sidclaw/sdk&lt;/code&gt; (v0.1.5, Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>mcp</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Adding human approval to LangChain tool calls in 12 lines of TypeScript</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Wed, 01 Apr 2026 05:59:57 +0000</pubDate>
      <link>https://dev.to/sidclaw/adding-human-approval-to-langchain-tool-calls-in-12-lines-of-typescript-4ggl</link>
      <guid>https://dev.to/sidclaw/adding-human-approval-to-langchain-tool-calls-in-12-lines-of-typescript-4ggl</guid>
      <description>&lt;p&gt;Last week we needed to add approval gates to a LangChain agent that sends customer emails. The agent worked fine. The problem was it worked &lt;em&gt;too&lt;/em&gt; fine, and nobody reviewed what it was sending.&lt;/p&gt;

&lt;p&gt;Here’s the before-and-after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before: ungoverned tool call
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DynamicStructuredTool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/core/tools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendEmailTool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DynamicStructuredTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send_email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Send an email to a customer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Email sent to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tool does what the LLM tells it. No questions asked. If the agent hallucinates a recipient or drafts something unhinged, it ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  After: governed tool call with SidClaw
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;governTools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sidclaw/sdk/langchain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SidClawClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sidclaw/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SidClawClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://app.sidclaw.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIDCLAW_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;support-bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;governedTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;governTools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sendEmailTool&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Use governedTools instead of [sendEmailTool] in your agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. &lt;code&gt;governTools()&lt;/code&gt; wraps each tool. When the agent calls &lt;code&gt;send_email&lt;/code&gt;, SidClaw evaluates it against your policies. If a policy says “email-sending requires approval,” the action holds. A reviewer gets a card showing the recipient, subject, body, and the agent’s reasoning. They approve or deny. The agent resumes or stops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s actually happening under the hood
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;governTools()&lt;/code&gt; does three things per tool call:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Evaluates the action against your policy set. Policies are priority-ordered. The first matching policy wins. Possible outcomes: &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;deny&lt;/code&gt;, &lt;code&gt;flag&lt;/code&gt; (hold for approval), or &lt;code&gt;log&lt;/code&gt; (allow but trace).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If flagged, creates an approval request with full context: agent identity, action name, input payload, the agent’s reasoning (if available from the framework), risk classification, and which policy triggered the flag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Records a trace event with a hash-chain link to the previous event. Every action, approval, and denial is cryptographically chained. Tampering with any record breaks the chain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting up policies
&lt;/h2&gt;

&lt;p&gt;The CLI handles initial setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-sidclaw-app
&lt;span class="c"&gt;# Creates agent, default policies, and API key in ~60 seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default policies block destructive database operations and flag high-risk actions like sending emails or modifying production infrastructure. You customize from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use LangChain callbacks?
&lt;/h2&gt;

&lt;p&gt;Fair question. You could write a callback that intercepts tool calls and does... something. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Callbacks don’t have a built-in approval workflow. You’d need to build the “hold execution, notify a human, wait for response, resume” flow yourself.&lt;/li&gt;
&lt;li&gt;Callbacks don’t produce compliance-grade audit trails. If FINRA asks for documented human checkpoints, a console.log isn’t going to cut it.&lt;/li&gt;
&lt;li&gt;Callbacks are LangChain-specific. If you also use the Vercel AI SDK or MCP servers, you’re writing the same interception logic three times.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SidClaw’s &lt;code&gt;governTools()&lt;/code&gt; works across 13 frameworks with the same governance protocol underneath. Switch from LangChain to CrewAI and your policies, approval workflows, and audit trail carry over.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn’t solve
&lt;/h2&gt;

&lt;p&gt;SidClaw governs actions. It doesn’t filter LLM outputs for toxicity, check prompt injections, or validate that the agent’s reasoning is sound. Those are different problems with different tools (Pangea, Lakera, etc.). SidClaw sits at the tool-call layer: the moment the agent decides to &lt;em&gt;do&lt;/em&gt; something in the real world.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.sidclaw.com" rel="noopener noreferrer"&gt;https://docs.sidclaw.com&lt;/a&gt;&lt;br&gt;
TypeScript SDK: &lt;code&gt;npm install @sidclaw/sdk&lt;/code&gt; (v0.1.5)&lt;br&gt;
Python SDK: &lt;code&gt;pip install sidclaw&lt;/code&gt; (v0.1.2)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>langchain</category>
      <category>security</category>
    </item>
    <item>
      <title>Introducing SidClaw: The Missing Approval Layer for AI Agents</title>
      <dc:creator>SidClaw</dc:creator>
      <pubDate>Wed, 25 Mar 2026 22:13:05 +0000</pubDate>
      <link>https://dev.to/sidclaw/introducing-sidclaw-the-missing-approval-layer-for-ai-agents-538g</link>
      <guid>https://dev.to/sidclaw/introducing-sidclaw-the-missing-approval-layer-for-ai-agents-538g</guid>
      <description>&lt;p&gt;Your AI agents can send emails, execute trades, scale infrastructure, and order lab tests. But who approved that? Who saw what the agent was about to do before it did it? Who has the audit trail?&lt;/p&gt;

&lt;p&gt;Today we're launching SidClaw — an open-source governance platform that adds the missing approval step to AI agent workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem nobody else is solving
&lt;/h2&gt;

&lt;p&gt;The AI agent governance space is heating up. Okta is working on identity for agents. SailPoint has machine identity. WorkOS ships authorization primitives. They all handle the same three things: &lt;strong&gt;identity, policy, and audit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But none of them ship the &lt;strong&gt;approval step&lt;/strong&gt; — the part where a human sees rich context about what an agent wants to do, reviews the risk level, sees the agent's reasoning, and makes an informed decision before the action executes.&lt;/p&gt;

&lt;p&gt;That approval step is exactly what regulators are asking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FINRA's 2026 Regulatory Oversight Report&lt;/strong&gt; explicitly calls for "human in the loop" agent oversight and "explicit human checkpoints before execution" for AI agents that act or transact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The EU AI Act&lt;/strong&gt; (enforceable August 2, 2026) requires human oversight, automatic logging, and risk management for high-risk AI systems. Penalties reach up to €35 million or 7% of global annual turnover.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We saw that the gap is obvious and that the tooling to fill it didn't exist.&lt;/p&gt;

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

&lt;p&gt;Four primitives govern every agent action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent wants to act → SidClaw evaluates → Policy decides → Human approves (if needed) → Action executes → Trace recorded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; — Every agent is registered with an owner and scoped permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy&lt;/strong&gt; — Every action is evaluated against explicit rules (allow / approval_required / deny)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval&lt;/strong&gt; — High-risk actions surface a context-rich card to a human reviewer: what the agent wants to do, why it was flagged, the agent's reasoning, and the risk level. One-click approve or deny.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trace&lt;/strong&gt; — Every decision creates a tamper-proof audit trail with hash-chain integrity&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The SDK wraps your existing tools. No changes to your agent logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AgentIdentityClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;withGovernance&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sidclaw/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AgentIdentityClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIDCLAW_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.sidclaw.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-agent-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Wrap any async function with governance&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withGovernance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send_email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data_classification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;confidential&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Now this call is governed:&lt;/span&gt;
&lt;span class="c1"&gt;// - Policy says "allow"? Executes immediately.&lt;/span&gt;
&lt;span class="c1"&gt;// - Policy says "approval_required"? Waits for human approval.&lt;/span&gt;
&lt;span class="c1"&gt;// - Policy says "deny"? Throws ActionDeniedError. No email sent.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;customer@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Follow-up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sidclaw&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SidClaw&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sidclaw.middleware.generic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;with_governance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GovernanceConfig&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SidClaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-agent-id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@with_governance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;GovernanceConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_classification&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidential&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;email_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  13 framework integrations
&lt;/h2&gt;

&lt;p&gt;SidClaw wraps whatever you're already using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain / LangGraph&lt;/strong&gt; — &lt;code&gt;governTools()&lt;/code&gt; wraps tool arrays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Agents SDK&lt;/strong&gt; — &lt;code&gt;governOpenAITool()&lt;/code&gt; wraps function tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel AI SDK&lt;/strong&gt; — &lt;code&gt;governVercelTools()&lt;/code&gt; wraps tool objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI&lt;/strong&gt; — &lt;code&gt;governCrewAITool()&lt;/code&gt; wraps task tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic AI&lt;/strong&gt; — &lt;code&gt;governance_dependency()&lt;/code&gt; for tool functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; — &lt;code&gt;GovernanceMCPServer&lt;/code&gt; proxy wraps any MCP server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composio, Claude Agent SDK, Google ADK, LlamaIndex&lt;/strong&gt; — built-in support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack &amp;amp; Telegram&lt;/strong&gt; — approve/deny directly from chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — governance checks in CI pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both TypeScript (npm) and Python (PyPI).&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it right now
&lt;/h2&gt;

&lt;p&gt;The fastest way — 60 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-sidclaw-app my-agent
&lt;span class="nb"&gt;cd &lt;/span&gt;my-agent
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a working governed agent with 3 demo tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;search_docs&lt;/code&gt; — allowed instantly&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;send_email&lt;/code&gt; — requires your approval&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;export_data&lt;/code&gt; — blocked by policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or try our live demos without installing anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://demo.sidclaw.com" rel="noopener noreferrer"&gt;Atlas Financial&lt;/a&gt; — AI customer support with email approval (FINRA)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://demo-devops.sidclaw.com" rel="noopener noreferrer"&gt;Nexus DevOps&lt;/a&gt; — Infrastructure scaling with deployment approval&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://demo-health.sidclaw.com" rel="noopener noreferrer"&gt;MedAssist Health&lt;/a&gt; — Clinical AI with physician approval (HIPAA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each demo uses real SidClaw governance. The policy evaluation, approval workflow, and audit traces are 100% authentic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The backstory: built in one session
&lt;/h2&gt;

&lt;p&gt;Here's the part that might interest the AI/dev community: the entire SidClaw platform — API, dashboard, documentation site, landing page, three vertical demos, TypeScript SDK, Python SDK, 13 integrations, 705 tests, production deployment — was built with tenant isolation, hash-chain audit trails, RBAC, Stripe billing, and one-click deploy. We went from market research to live production fast!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;SidClaw is &lt;strong&gt;free during early access&lt;/strong&gt;. The Apache 2.0 SDK is open-source forever. The platform has visible pricing (Free / Starter CHF 199/mo / Business CHF 999/mo / Enterprise) but everything is free right now.&lt;/p&gt;

&lt;p&gt;We're looking for design partners — especially teams in financial services, healthcare, and platform engineering who are deploying AI agents and need governance before the August 2026 EU AI Act deadline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://sidclaw.com" rel="noopener noreferrer"&gt;sidclaw.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://docs.sidclaw.com" rel="noopener noreferrer"&gt;docs.sidclaw.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/sidclawhq/platform" rel="noopener noreferrer"&gt;github.com/sidclawhq/platform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SDK (npm): &lt;a href="https://www.npmjs.com/package/@sidclaw/sdk" rel="noopener noreferrer"&gt;@sidclaw/sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SDK (PyPI): &lt;a href="https://pypi.org/project/sidclaw/" rel="noopener noreferrer"&gt;sidclaw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live demo: &lt;a href="https://demo.sidclaw.com" rel="noopener noreferrer"&gt;demo.sidclaw.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'd love your feedback. Try a demo. Star the repo. Tell us what's missing.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
