<?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: AgentGraph</title>
    <description>The latest articles on DEV Community by AgentGraph (@agentgraph).</description>
    <link>https://dev.to/agentgraph</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%2F3834436%2F1d8762b6-bc6f-4358-a444-4c831c30f2bd.png</url>
      <title>DEV Community: AgentGraph</title>
      <link>https://dev.to/agentgraph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agentgraph"/>
    <language>en</language>
    <item>
      <title>How to Audit Your MCP Servers for Security Risks</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 16 Jul 2026 17:49:54 +0000</pubDate>
      <link>https://dev.to/agentgraph/how-to-audit-your-mcp-servers-for-security-risks-4keh</link>
      <guid>https://dev.to/agentgraph/how-to-audit-your-mcp-servers-for-security-risks-4keh</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; MCP servers run with surprising access to your filesystem, environment variables, and network — and most developers ship them without any security review. &lt;code&gt;mcp-security-scan&lt;/code&gt; is an open-source CLI and GitHub Action that checks for credential theft, data exfiltration, and unsafe execution patterns, outputting a 0-100 trust score. It's free, MIT-licensed, and takes about 30 seconds to run.&lt;/p&gt;




&lt;p&gt;If you've wired up an MCP server to Claude or another agent runtime, you've probably not thought too hard about what that server can actually do. That's normal. You were focused on getting the tool calls working.&lt;/p&gt;

&lt;p&gt;But MCP servers run in a privileged position. They sit between your agent and the outside world, and they can read files, make network requests, spawn subprocesses, and access environment variables. The Model Context Protocol spec doesn't define a security model — it defines a communication protocol. What happens inside your server is entirely up to you.&lt;/p&gt;

&lt;p&gt;That gap is where &lt;code&gt;mcp-security-scan&lt;/code&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the scanner actually checks
&lt;/h2&gt;

&lt;p&gt;The tool runs static analysis on your MCP server source code (TypeScript, Python, and JavaScript supported) and looks for six categories of risk:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credential theft patterns&lt;/strong&gt; — environment variable reads that touch anything matching &lt;code&gt;*_KEY&lt;/code&gt;, &lt;code&gt;*_SECRET&lt;/code&gt;, &lt;code&gt;*_TOKEN&lt;/code&gt;, &lt;code&gt;*_PASSWORD&lt;/code&gt;, or &lt;code&gt;*_CREDENTIAL&lt;/code&gt;. Not all of these are bugs, but they should be visible. If your weather tool is reading &lt;code&gt;STRIPE_SECRET_KEY&lt;/code&gt;, that's worth knowing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data exfiltration&lt;/strong&gt; — outbound HTTP calls from inside tool handlers. Again, not inherently bad. But a tool that's supposed to format a string shouldn't be POSTing to an external endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unsafe execution&lt;/strong&gt; — &lt;code&gt;exec()&lt;/code&gt;, &lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;subprocess.run()&lt;/code&gt;, &lt;code&gt;child_process.spawn()&lt;/code&gt;, and similar. These are the ones that keep security people up at night. An MCP tool that eval's user-supplied input is a remote code execution waiting to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filesystem access&lt;/strong&gt; — reads and writes outside the working directory. Particularly dangerous when the agent is passing file paths that come from user input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code obfuscation&lt;/strong&gt; — high-entropy strings, base64-encoded payloads, minified code shipped without source maps. These aren't automatically malicious, but they're a signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency confusion risks&lt;/strong&gt; — package names that shadow popular packages, or dependencies pulled from unusual registries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @agentgraph/mcp-security-scan ./my-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @agentgraph/mcp-security-scan
mcp-security-scan ./my-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python projects work the same way — the scanner detects the runtime from &lt;code&gt;package.json&lt;/code&gt; or &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Output looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AgentGraph MCP Security Scanner v0.4.1
Scanning: ./my-mcp-server

[PASS] No credential theft patterns detected
[WARN] 3 outbound HTTP calls in tool handlers (lines 47, 112, 203)
[FAIL] eval() usage detected in tools/execute.ts (line 89)
[WARN] Filesystem read outside working directory (tools/reader.ts, line 34)
[PASS] No obfuscated code detected
[PASS] Dependencies look clean

Trust Score: 61/100

Issues requiring attention:
  HIGH   eval() in tool handler — potential RCE vector
  MEDIUM Filesystem traversal — validate paths before use
  LOW    Outbound HTTP in 3 handlers — document or restrict

Run with --json for machine-readable output
Run with --fix for suggested remediations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The trust score integrates directly with &lt;a href="https://agentgraph.co/?utm_source=agentgraph_bot&amp;amp;utm_medium=devto&amp;amp;utm_campaign=security_scanner" rel="noopener noreferrer"&gt;AgentGraph&lt;/a&gt;'s trust badge system, so if you're publishing an MCP server for others to use, you can attach a verified score to your README.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GitHub Action
&lt;/h2&gt;

&lt;p&gt;Drop this in &lt;code&gt;.github/workflows/security.yml&lt;/code&gt;:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MCP Security Scan&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&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;Run MCP Security Scan&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agentgraph-co/mcp-security-scan@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./&lt;/span&gt;
          &lt;span class="na"&gt;fail-below&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;70&lt;/span&gt;
          &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sarif&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;Upload SARIF results&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mcp-security-scan.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;fail-below&lt;/code&gt; threshold is configurable. We default to 70 for most projects — below that, you have at least one HIGH or several MEDIUMs that haven't been addressed. The SARIF output means findings show up natively in GitHub's Security tab, which is useful if you're already using CodeQL or similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture decisions (and what we got wrong)
&lt;/h2&gt;

&lt;p&gt;Building a security scanner for something as loosely-defined as MCP servers involved some choices worth being upfront about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static analysis vs. dynamic analysis.&lt;/strong&gt; We chose static. Dynamic analysis would catch more — you'd actually run the server and observe its behavior. But it's dramatically harder to do safely. Running arbitrary MCP server code in a sandbox to observe what it does is the kind of thing that requires real infrastructure. Static analysis misses obfuscated runtime behavior, but it's fast, safe, and works in CI without any special setup.&lt;/p&gt;

&lt;p&gt;The trade-off: a sufficiently motivated bad actor can evade static analysis. If someone really wants to hide malicious behavior, they'll encode it in a way that pattern-matching won't catch. We know this. The scanner isn't a guarantee — it's a baseline that catches the obvious stuff and raises the cost of shipping something obviously dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regex vs. AST parsing.&lt;/strong&gt; For the first version, we used regex patterns for Python and a lightweight AST walk for TypeScript/JavaScript. Regex is fast and easy to maintain, but it produces false positives. A comment that says &lt;code&gt;# don't use eval()&lt;/code&gt; will still trigger the eval check. We're migrating the Python analyzer to use &lt;code&gt;ast&lt;/code&gt; module parsing in v0.5, which will cut false positives significantly.&lt;/p&gt;

&lt;p&gt;This is the thing about security tooling: false positives erode trust in the tool itself. If developers learn to ignore the warnings, the scanner becomes noise. We'd rather have fewer, higher-confidence findings than comprehensive but noisy output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust score math.&lt;/strong&gt; The 0-100 score is a weighted sum. HIGH findings cost 25 points each (capped at 2), MEDIUM findings cost 10 points each (capped at 3), LOW findings cost 3 points each. Starting from 100, you can floor at 0 but not go negative. This is... fine. It's not a sophisticated risk model. But it produces numbers that feel intuitively right for the cases we tested, and it's transparent enough that developers can understand why their score is what it is.&lt;/p&gt;

&lt;p&gt;We considered a more sophisticated model — CVSS-style scoring with exploitability and impact dimensions. We decided against it for v1 because the complexity wasn't justified by the signal quality of static analysis. When you're doing AST pattern matching, you don't actually know if that &lt;code&gt;eval()&lt;/code&gt; call is reachable from a tool handler or buried in dead code. Pretending you have CVSS-level precision would be misleading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP security is messier than it looks
&lt;/h2&gt;

&lt;p&gt;The Moltbook breach earlier this year exposed 1.5 million API tokens. That incident wasn't an MCP-specific attack, but the attack surface is similar: a platform that aggregates agent tools and credentials, with insufficient verification of what those tools actually do.&lt;/p&gt;

&lt;p&gt;OpenClaw's skills marketplace had 12% of submissions flagged for malware in their last public audit. That's not a rounding error. That's one in eight tools doing something it shouldn't.&lt;/p&gt;

&lt;p&gt;The problem is that MCP servers are easy to write and increasingly easy to publish. The friction between "I built a thing" and "other people's agents are running my thing" is very low. That's good for the ecosystem's growth. It's bad for security.&lt;/p&gt;

&lt;p&gt;The Traceforce launch on HN this week (company-wide security monitoring for AI apps) is hitting the same problem from the enterprise end. They're watching what AI apps do at runtime. We're catching issues before deployment. Both approaches are necessary — the question of "is this agent doing what it claims to do" doesn't have a single answer at a single layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the API for custom integrations
&lt;/h2&gt;

&lt;p&gt;If you want to integrate the scanner into something beyond a standard CI pipeline, there's a REST API:&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;MCPSecurityScanner&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;@agentgraph/mcp-security-scan&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;scanner&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;MCPSecurityScanner&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;AGENTGRAPH_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// optional — enables trust badge publishing&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;failBelow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="p"&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;credentials&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;exfiltration&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;execution&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;filesystem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&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;node_modules&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;**/*.test.ts&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="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./my-mcp-server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Trust Score: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustScore&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Findings: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="k"&gt;for &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;finding&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&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="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&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="nx"&gt;finding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;line&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="c1"&gt;// Publish to AgentGraph trust registry (requires API key)&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&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;badge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishTrustBadge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Badge URL: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Embed in README: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API key is only needed if you want to publish results to the AgentGraph trust registry and get a verified badge for your README. Scanning itself is entirely local — nothing leaves your machine without the API key configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the scanner won't catch
&lt;/h2&gt;

&lt;p&gt;Being honest about limitations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime behavior.&lt;/strong&gt; If your server loads a malicious plugin at runtime from a URL that isn't in the source code, static analysis won't see it. This is a known gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logic bugs.&lt;/strong&gt; The scanner doesn't understand what your tool is supposed to do. If your tool is supposed to read files and it reads files, that's a WARN, not a FAIL — even if the specific files it reads are sensitive. You need a human to evaluate whether the behavior is appropriate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supply chain attacks in dependencies.&lt;/strong&gt; We check package names for obvious confusion attacks, but we don't run a full audit of your dependency tree. Use &lt;code&gt;npm audit&lt;/code&gt; or &lt;code&gt;pip-audit&lt;/code&gt; for that — they're better tools for that specific job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obfuscated malice.&lt;/strong&gt; A determined attacker who encodes their payload in a way that looks like a base64 config string will probably get through. We flag high-entropy strings, but the false positive rate on that check is high enough that many projects will tune it down.&lt;/p&gt;

&lt;p&gt;The scanner is a floor, not a ceiling. It catches the stuff that shouldn't be there at all — the &lt;code&gt;eval()&lt;/code&gt; calls, the credential reads in tools that don't need credentials, the outbound HTTP calls that weren't in the README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting a trust badge for your MCP server
&lt;/h2&gt;

&lt;p&gt;If you're publishing an MCP server — on npm, PyPI, or anywhere else — running the scanner and publishing your score takes about two minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcp-security-scan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--publish&lt;/span&gt; &lt;span class="nt"&gt;--api-key&lt;/span&gt; &lt;span class="nv"&gt;$AGENTGRAPH_API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a badge like this in your README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;![AgentGraph Trust Score&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://agentgraph.co/badge/your-server-id.svg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;](https://agentgraph.co/server/your-server-id)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The badge links to a public audit page showing what was scanned, what version, and what the findings were. It updates automatically when you push new code through the GitHub Action.&lt;/p&gt;

&lt;p&gt;This is the piece that connects to the broader AgentGraph project. The scanner is useful standalone. But the trust badge is what makes the score meaningful to someone who's deciding whether to run your MCP server against their data.&lt;/p&gt;




&lt;p&gt;The repo is at &lt;a href="https://github.com/agentgraph-co/mcp-security-scan" rel="noopener noreferrer"&gt;github.com/agentgraph-co/mcp-security-scan&lt;/a&gt; — MIT licensed, PRs open. We're particularly interested in contributions around the Python AST analyzer and additional check categories.&lt;/p&gt;

&lt;p&gt;For the broader trust infrastructure context — DIDs, trust scoring, agent identity — that's at &lt;a href="https://agentgraph.co/?utm_source=agentgraph_bot&amp;amp;utm_medium=devto&amp;amp;utm_campaign=security_scanner" rel="noopener noreferrer"&gt;agentgraph.co&lt;/a&gt;. The scanner is one piece of it. The goal is a world where you can look at any agent or MCP server and have a real answer to "should I trust this thing."&lt;/p&gt;

&lt;p&gt;Right now, the answer to that question is usually "I don't know, the README looked fine." That's not good enough.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was generated with AI assistance and reviewed by the AgentGraph team. We're committed to being transparent about that.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 09 Jul 2026 17:36:51 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-32d5</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-32d5</guid>
      <description>&lt;p&gt;🤖 Auto-generated technical article by AgentGraph's content bot (disclosure at top). Long-form (~1500 words). Break down the 5 vectors mcp-security-scan checks: credential theft patterns, data exfil signatures, unsafe exec (shell/eval), filesystem scope, code obfuscation. For each: what we look for, a real-ish code example of a red flag, weight in the score. Close with GitHub Action YAML snippet + how the score maps to an AgentGraph badge. SEO target: 'MCP server security', 'trust score MCP'.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 02 Jul 2026 04:23:57 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-13n2</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-13n2</guid>
      <description>&lt;p&gt;Bot-disclosed banner. Long-form (1500-2000 words) walking through 5 concrete attack patterns in MCP servers — credential harvesting via env vars, prompt-injected tool descriptions, silent filesystem traversal, obfuscated payloads in package post-install, exfil via DNS. For each: code sample, why static scanners miss it, how mcp-security-scan flags it. Include CLI examples and GitHub Action snippet. Close with AgentGraph trust badge.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 25 Jun 2026 00:36:38 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-3ofd</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-3ofd</guid>
      <description>&lt;p&gt;Long-form technical post (1500-2000 words). Walk through methodology of mcp-security-scan, share aggregate findings (X% had hardcoded creds, Y% had unsafe shell exec, Z% obfuscated code), provide a checklist devs can run themselves. Include code snippets, the CLI install command, GitHub Action YAML. End with note that trust scores integrate with AgentGraph badges. Disclose at top: 'Written and published by the AgentGraph bot account — methodology and data are real.'&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 18 Jun 2026 00:45:29 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-32ll</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-32ll</guid>
      <description>&lt;p&gt;Long-form (~1500 words). Structure: (1) Why 'it sounds right' isn't trust. (2) The four primitives of agent trust: verifiable identity (W3C DIDs), tamper-evident evolution history, third-party security attestation (mcp-security-scan as example), social/transitive trust scoring. (3) Worked example: an MCP server author goes from anonymous repo to badge-bearing verified agent in 5 minutes. (4) Open standards we build on (DSNP, AIP, DID-core). Disclose bot authorship in TL;DR. Heavy on code samples and diagrams.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 11 Jun 2026 01:01:28 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-2mlj</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-2mlj</guid>
      <description>&lt;p&gt;Long-form (1500+ words) technical guide: the 5 attack classes mcp-security-scan checks for (credential theft, data exfil, unsafe exec, filesystem access, code obfuscation), with concrete code examples of vulnerable vs safe patterns. Show how to add the GitHub Action in 3 lines of YAML. Final section: how the trust score connects to AgentGraph badges (soft mention). Header disclosure: 'This post was drafted by AgentGraph's content bot and reviewed by our team.'&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>You can't tell if an MCP server is safe before you install it. So I built a scanner you don't have to trust.</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Sat, 06 Jun 2026 17:24:30 +0000</pubDate>
      <link>https://dev.to/agentgraph/you-cant-tell-if-an-mcp-server-is-safe-before-you-install-it-so-i-built-a-scanner-you-dont-have-5dok</link>
      <guid>https://dev.to/agentgraph/you-cant-tell-if-an-mcp-server-is-safe-before-you-install-it-so-i-built-a-scanner-you-dont-have-5dok</guid>
      <description>&lt;p&gt;Most MCP servers and agent tools execute code, hold API keys, or run with broad permissions. There's no easy way to check if one is safe before you wire it into your stack — you're basically running &lt;code&gt;curl | bash&lt;/code&gt; and hoping.&lt;/p&gt;

&lt;p&gt;So we built a free scanner. Paste any GitHub repo at &lt;code&gt;agentgraph.co/check/{owner}/{repo}&lt;/code&gt; (no login) and you get a grade plus the actual findings: hardcoded secrets, unsafe exec, missing auth, dependency risks, OWASP-style flags.&lt;/p&gt;

&lt;p&gt;We've scanned ~950 agent/MCP repos so far. The honest headline: most use unsafe code-execution patterns, and high-severity findings show up even in popular, well-maintained projects.&lt;/p&gt;

&lt;p&gt;The part I actually care about: &lt;strong&gt;you don't have to trust our verdict.&lt;/strong&gt; Every scan emits an Ed25519-signed "trust envelope" you can verify yourself against our published JWKS — the score, the per-source methodology, all of it. Two SDKs do the verification client-side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentgraph-sdk      &lt;span class="c"&gt;# Python&lt;/span&gt;
npm i agentgraph-trust          &lt;span class="c"&gt;# JS/TS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;agentgraph_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentGraphClient&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;AgentGraphClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://agentgraph.co&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;did:web:...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# checks the signature + freshness locally
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there's a GitHub Action so a scan runs in CI and drops the grade as a PR comment:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agentgraph-co/trust-scan-action@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's free, no signup, no secret. Try it on something you actually use — curious what people find.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>CTEF v0.3.2 — the substrate gate just closed for cross-framework agent trust</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Wed, 27 May 2026 21:06:36 +0000</pubDate>
      <link>https://dev.to/agentgraph/ctef-v032-the-substrate-gate-just-closed-for-cross-framework-agent-trust-2c0a</link>
      <guid>https://dev.to/agentgraph/ctef-v032-the-substrate-gate-just-closed-for-cross-framework-agent-trust-2c0a</guid>
      <description>&lt;p&gt;If you build agent-to-agent infrastructure, you've probably hit the cross-framework trust problem: how does an MCP agent verify a claim emitted by an x402 service, attested to by an ERC-8004 identity contract, with a behavioral history from a third-party observer?&lt;/p&gt;

&lt;p&gt;You can't ask each framework to extend the others. You can't ship a shared authority server (that's the thing the architecture is trying to avoid). You can't just trust JSON-Schema validation (semantically equivalent payloads can serialize to different bytes, and signature verification breaks).&lt;/p&gt;

&lt;p&gt;The answer that fell out of 18 months of working-group convergence: &lt;strong&gt;a substrate-layer canonical form that every framework can emit and every consumer can verify&lt;/strong&gt;, with zero cross-framework knowledge required.&lt;/p&gt;

&lt;p&gt;CTEF v0.3.2 publishes that substrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in v0.3.2
&lt;/h2&gt;

&lt;p&gt;Six normative additions, each driven by a partner-thread interop incident:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Depth-first proof-stripping&lt;/strong&gt; (corpollc/qntm#7) — implementations MUST recurse into nested chain objects when stripping proofs, not just top-level. Caught when ArkForge's gateway-verdict envelope failed to verify under three otherwise-conformant implementations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authority chain composition: scope-narrowing-only&lt;/strong&gt; (qntm#7) — composed authority claims can ONLY narrow scope, never widen. This closes the privilege-escalation surface that motivated the EU AI Act Article 12 audit-trail framing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale-action policy&lt;/strong&gt; (A2A #1734) — explicit semantics for what happens when an attestation references a state that has rotated. No more silent acceptance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required-vs-informational field discipline&lt;/strong&gt; (A2A #1672) — every field in the envelope has a normative classification. Conformance harnesses fail-closed on missing required fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavioral claim_type with TTL-cap MUST&lt;/strong&gt; — when an attestation carries behavioral evidence (e.g. Dominion Observatory's empirical trust scoring), the TTL is normatively capped to prevent stale-behavior poisoning of long-running agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;claim_subtype: tier_upgrade&lt;/code&gt; registry first entry&lt;/strong&gt; — ArkForge's &lt;code&gt;tier_upgrade_proof&lt;/code&gt; fixture lands as the first reference implementation of the authority-claim registry pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The substrate-evidence density
&lt;/h2&gt;

&lt;p&gt;The bar a substrate spec needs to clear before it's actually a substrate (and not just a proposal) is empirical byte-match across multiple independent implementations. The v0.3.2 publish window crosses two such bars:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JCS canonicalization × vector sets:&lt;/strong&gt; 5 independent JCS implementations validated against 4 distinct vector sets — &lt;strong&gt;20/20 cells byte-identical, 265 byte-for-byte agreements&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Lang&lt;/th&gt;
&lt;th&gt;CTEF/APS (14)&lt;/th&gt;
&lt;th&gt;AP2 OMH v0 (7)&lt;/th&gt;
&lt;th&gt;privacy_class v0.1 (13)&lt;/th&gt;
&lt;th&gt;per-chain envelope v0 (19)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rfc8785@0.1.4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python (Trail of Bits / William Woodruff)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;canonicalize@3.0.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript (Erdtman; Rundgren contributor)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gowebpki/jcs@v1.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cyberphone/json-canonicalization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java (Rundgren — &lt;strong&gt;RFC 8785 reference&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;serde_jcs@0.2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rust (seritalien)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;cyberphone/json-canonicalization&lt;/code&gt; is Anders Rundgren's reference implementation cited in RFC 8785 itself. When the RFC author's own reference Java impl produces byte-identical output to a Python library, a JavaScript package, a Go module, and a Rust crate — across four independently-authored vector sets covering 53 distinct canonicalization edge cases — the cross-runtime determinism question is closed concretely.&lt;/p&gt;

&lt;p&gt;The substrate is reproducible in-tree at &lt;a href="https://github.com/agentgraph-co/agentgraph/tree/v0.3.3-cross-extension-matrix/tests/cross-impl" rel="noopener noreferrer"&gt;&lt;code&gt;agentgraph-co/agentgraph/tests/cross-impl/&lt;/code&gt;&lt;/a&gt; — single-file runner per language, run any one and get 53/53 PASS or a divergence report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementations × byte-match validation:&lt;/strong&gt; 10 independent implementations have all reproduced the CTEF v0.3.2 reference vectors:&lt;/p&gt;

&lt;p&gt;AgentGraph (substrate maintainer) · APS · AgentID · @nobulex/crypto · HiveTrust · msaleme/red-team-blue-team-agent-fabric · Foxbook · Dominion Observatory · ArkForge · AlgoVoi (chopmob-cloud).&lt;/p&gt;

&lt;p&gt;No coordination. Each implementation built independently, validated independently, produced identical canonical bytes.&lt;/p&gt;

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

&lt;p&gt;A relying-party agent in 2026 doesn't get to pick the framework its counterparty was built on. An A2A agent might need to verify a claim chain that started life as an x402 settlement-retention anchor, was attested by an ERC-8004 identity registration, and was carried forward into a Dominion Observatory behavioral-trust update — all four ecosystems, four independent emitters, one substrate.&lt;/p&gt;

&lt;p&gt;CTEF v0.3.2 lets each of those emitters speak its own protocol semantics on top of byte-equivalent canonical attestations. The consuming agent verifies the JCS_hash + signature against the substrate. If it passes, the claim is verifiable regardless of which framework emitted it.&lt;/p&gt;

&lt;p&gt;The architectural pattern: every framework can be a substrate emitter without any framework being authoritative.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;v0.3.2 is the last byte-match-led publish.&lt;/strong&gt; The substrate is solved — 5 implementations × 53 vectors × 4 author sets is the bar, and the bar has been cleared. What comes next composes ON TOP of that substrate, not against it.&lt;/p&gt;

&lt;p&gt;The Consilium pass (aeoess + 8 implementers, substrate window through Jun 5, normative outputs before Jul 1) is the next coordination layer. Five candidate problems are on the table: semantic divergence under byte-match identity, live-state admissibility at commit, cross-jurisdictional receipt portability, legacy receipt format migration, and real-world deployment patterns. Substrate-cred density via byte-match is load-bearing for first-time integrators — it stays in place — but the field has more to give than another stamp on a property that already holds.&lt;/p&gt;

&lt;p&gt;v0.3.3 (mid-June) lands the &lt;strong&gt;cross-extension URN-layer matrix&lt;/strong&gt; — a row-per-URN-namespace table that binds substrate emitters to claim_type, evidenceType, and live fixture sets. &lt;strong&gt;Four of seven rows are already PR-accepted&lt;/strong&gt; by maintainers (AlgoVoi, Arian, Erik Newton on Concordia, ArkForge open question). Remaining rows scaffolded for PRs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;urn:erc8004:identity&lt;/code&gt; (cryptographic identity)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:mycelium:trail&lt;/code&gt; (behavioral continuity, argentum-core)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:x402:audit-chain&lt;/code&gt; (settlement-retention authority)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:nobulex:receipt&lt;/code&gt; (behavioral continuity, Nobulex AAIF)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:observatory:eval&lt;/code&gt; (behavioral, Dominion)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:foxbook:leaf&lt;/code&gt; (cryptographic identity)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urn:concordia:attestation&lt;/code&gt; (third-party authority)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;v0.4 (Q3 2026) opens APP↔CTEF composability and the Trust Policy Manifest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the spec
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spec: agentgraph.co/docs/ctef-v0-3-2&lt;/li&gt;
&lt;li&gt;Conformance vectors: &lt;code&gt;/.well-known/cte-test-vectors.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Interop harness: &lt;code&gt;/.well-known/interop-harness.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: github.com/agentgraph-co/agentgraph&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain a framework that emits trust-relevant attestations, the v0.3.3 cross-extension matrix branch is open for PRs.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>standards</category>
      <category>protocols</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 21 May 2026 05:14:31 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-3c5o</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-3c5o</guid>
      <description>&lt;p&gt;[🤖 Bot-authored, human-reviewed — disclosed in header] Long-form technical post (1500-2000 words) directly responding to the trending r/LangChain thread. Cover: (1) the impersonation problem in multi-agent graphs, (2) why framework-level identity (LangGraph node IDs, CrewAI roles) isn't portable, (3) W3C DIDs + AIP as a protocol-level fix, (4) code example: assigning a DID to a LangChain agent and verifying peer agents via AgentGraph. Include diagrams. End with onboarding link.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We scanned 26,302 x402 endpoints. 0.41% implement the protocol correctly.</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Tue, 12 May 2026 17:37:36 +0000</pubDate>
      <link>https://dev.to/agentgraph/we-scanned-26302-x402-endpoints-041-implement-the-protocol-correctly-iji</link>
      <guid>https://dev.to/agentgraph/we-scanned-26302-x402-endpoints-041-implement-the-protocol-correctly-iji</guid>
      <description>&lt;p&gt;We just published &lt;em&gt;State of Agent Security 2026&lt;/em&gt; — a measurement of what's actually shipping across the five major AI agent distribution surfaces: Coinbase x402 Bazaar, OpenClaw skill marketplace, the official MCP Registry, npm/PyPI agent packages, and a sample of AI-generated Solidity from Microsoft-backed Dreamspace.&lt;/p&gt;

&lt;p&gt;The pattern is consistent across surfaces, and the numbers are worse than I expected when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Targets scanned&lt;/th&gt;
&lt;th&gt;Critical/high findings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x402 Bazaar (Coinbase)&lt;/td&gt;
&lt;td&gt;26,302 endpoints&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;only 0.41% implement the spec-required header&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw skill marketplace&lt;/td&gt;
&lt;td&gt;sample of public skill repos&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 in 3 scoring F&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official MCP Registry&lt;/td&gt;
&lt;td&gt;300 servers&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;55.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm agent packages&lt;/td&gt;
&lt;td&gt;sample of &lt;code&gt;crew-ai-*&lt;/code&gt;, &lt;code&gt;langchain-*&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;82.6%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI agent packages&lt;/td&gt;
&lt;td&gt;sample&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That x402 number is the one I keep coming back to. The protocol is specifically how agents are supposed to pay other agents — Coinbase shipped it on Base L2 specifically for agentic commerce. Out of 26,302 advertised endpoints, &lt;strong&gt;107&lt;/strong&gt; serve the header the spec requires. The agent-payment surface that's supposed to power autonomous agent commerce is 99.59% empty.&lt;/p&gt;

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

&lt;p&gt;Half the report is the data above. The other half is the substrate underneath: an open wire format for trust evidence that any implementation can validate against any other implementation, byte-for-byte.&lt;/p&gt;

&lt;p&gt;CTEF (Composable Trust Evidence Format) v0.3.1, frozen April 24 2026. RFC 8785 (JCS) canonicalization, Ed25519 signatures (JWS RFC 7515), closed &lt;code&gt;claim_type&lt;/code&gt; set &lt;code&gt;{identity, transport, authority, continuity}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eight independent implementations now byte-match the same wire format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AgentGraph&lt;/strong&gt; (Python) — substrate maintainer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Passport System / APS&lt;/strong&gt; (Python) — publishes bilateral-delegation + rotation-attestation fixtures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AgentID&lt;/strong&gt; (Python) — identity layer, live on &lt;code&gt;/verify&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@nobulex/crypto&lt;/code&gt;&lt;/strong&gt; (TypeScript) — 4/4 against AgentGraph + 10/10 against APS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HiveTrust&lt;/strong&gt; (Python) — continuity layer, HAHS schema&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArkForge Trust Layer&lt;/strong&gt; (Python) — enforcement gateway, live at &lt;code&gt;trust.arkforge.tech&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;msaleme clean-room canonicalizer&lt;/strong&gt; (Python) — substrate verifier, 19/19 via &lt;code&gt;trailofbits/rfc8785.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foxbook&lt;/strong&gt; (TypeScript) — identity layer, &lt;code&gt;did:foxbook:{ULID}&lt;/code&gt; DID method&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five independent Python canonicalizers + two independent TypeScript canonicalizers + one clean-room reference all producing byte-identical output against the published fixtures.&lt;/p&gt;

&lt;p&gt;The point of this exercise: RFC 8785 JCS proves language-agnostic in practice, not just by design. Any one-sided drift fires against seven witnesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters now
&lt;/h2&gt;

&lt;p&gt;Three things collided on the same April 2026 news cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Alchemy CEO Nikil Viswanathan&lt;/strong&gt; went on the record saying &lt;em&gt;"crypto is the global infrastructure for money that agents need"&lt;/em&gt; — and that &lt;em&gt;"computers operate the internet and humans use it; agents will operate finance."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coinbase's x402 protocol&lt;/strong&gt; for agent-to-agent payment went live on Base L2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft's Dreamspace&lt;/strong&gt; started shipping AI-generated Solidity into production-adjacent environments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And &lt;strong&gt;EU AI Act Article 12 enforcement begins August 2 2026&lt;/strong&gt; — cryptographic, machine-checkable audit logs become mandatory for high-risk AI systems serving the EU market. &lt;strong&gt;82 days.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent infrastructure is being built faster than the trust gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read it / reproduce it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Report:&lt;/strong&gt; &lt;a href="https://agentgraph.co/state-of-agent-security-2026" rel="noopener noreferrer"&gt;https://agentgraph.co/state-of-agent-security-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF (full litepaper):&lt;/strong&gt; &lt;a href="https://agentgraph.co/state-of-agent-security-2026-v1.pdf" rel="noopener noreferrer"&gt;https://agentgraph.co/state-of-agent-security-2026-v1.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live test vectors:&lt;/strong&gt; &lt;a href="https://agentgraph.co/.well-known/cte-test-vectors.json" rel="noopener noreferrer"&gt;https://agentgraph.co/.well-known/cte-test-vectors.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility scripts&lt;/strong&gt; (mirrored in two independent repos): &lt;code&gt;verify-aps-byte-match.mjs&lt;/code&gt; + &lt;code&gt;verify-ctef-byte-match.mjs&lt;/code&gt; — &lt;code&gt;git clone&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;, verify locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The substrate scans, the methodology, the eight-impl byte-match conformance set — all reproducible from your terminal in under 5 minutes. There is no AgentGraph-private side channel.&lt;/p&gt;

&lt;p&gt;Happy to answer questions in the comments — particularly on methodology, the canonicalization spec, or how your framework (LangChain, CrewAI, AutoGen, AGT, etc.) could plug into the trust layer through the published bridge packages.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 23 Apr 2026 05:17:36 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-267b</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-267b</guid>
      <description>&lt;p&gt;Deep technical post (2000+ words): threat model for MCP (credential theft, exfil, unsafe exec, FS access, obfuscation), methodology, aggregate findings with anonymised examples, how to run mcp-security-scan locally + in CI via GitHub Action. Soft mention that trust scores feed into AgentGraph badges. Clearly disclosed as bot-authored content from AgentGraph team.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We Scanned 231 OpenClaw Skills for Security Vulnerabilities — Here's What We Found</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Tue, 07 Apr 2026 01:47:45 +0000</pubDate>
      <link>https://dev.to/agentgraph/methodology-18ki</link>
      <guid>https://dev.to/agentgraph/methodology-18ki</guid>
      <description>&lt;p&gt;AI agents are running third-party code on your machine. Last week, &lt;a href="https://techcrunch.com/2026/04/04/anthropic-says-claude-code-subscribers-will-need-to-pay-extra-for-openclaw-support/" rel="noopener noreferrer"&gt;Anthropic announced extra charges for OpenClaw support in Claude Code&lt;/a&gt;, drawing fresh attention to the ecosystem. We wanted to answer a straightforward question: how safe are the most popular OpenClaw skills?&lt;/p&gt;

&lt;p&gt;We first published results from 25 repos. We have now expanded the scan to 231 repositories out of 2,007 discovered — nearly a 10x increase in coverage — and the picture has gotten worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Independent Trust Verification Matters Now
&lt;/h2&gt;

&lt;p&gt;Anthropic just temporarily banned OpenClaw's creator from accessing Claude (&lt;a href="https://techcrunch.com/2026/04/10/anthropic-temporarily-banned-openclaws-creator-from-accessing-claude/" rel="noopener noreferrer"&gt;TechCrunch, April 10&lt;/a&gt;). Whether you agree with their decision or not, it highlights a structural gap: platform trust is revocable. There's no independent way to verify whether an AI agent or tool is safe to use.&lt;/p&gt;

&lt;p&gt;That's why we built &lt;strong&gt;&lt;a href="https://agentgraph.co/check" rel="noopener noreferrer"&gt;agentgraph.co/check&lt;/a&gt;&lt;/strong&gt; — a free, instant safety checker for any AI agent, MCP server, or skill. Paste a URL, get a letter grade. The result is a cryptographically signed attestation that you can verify yourself. No platform controls the score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;We used AgentGraph's &lt;a href="https://github.com/agentgraph-co/agentgraph" rel="noopener noreferrer"&gt;open-source security scanner&lt;/a&gt; to analyze 231 OpenClaw skill repositories from GitHub (out of 2,007 discovered). The scanner inspects source code for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardcoded secrets&lt;/strong&gt; (API keys, tokens, passwords in source)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsafe execution&lt;/strong&gt; (subprocess calls, eval/exec, shell=True)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File system access&lt;/strong&gt; (reads/writes outside expected boundaries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data exfiltration patterns&lt;/strong&gt; (outbound network calls to unexpected destinations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code obfuscation&lt;/strong&gt; (base64-encoded payloads, dynamic imports)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also detects positive signals: authentication checks, input validation, rate limiting, and CORS configuration. Each repo receives a trust score from 0 to 100.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results Summary
&lt;/h2&gt;

&lt;p&gt;All 231 repositories scanned successfully. The aggregate numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repos discovered&lt;/td&gt;
&lt;td&gt;2,007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repos scanned&lt;/td&gt;
&lt;td&gt;231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total findings&lt;/td&gt;
&lt;td&gt;14,350&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;6,192&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;8,045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repos with critical findings&lt;/td&gt;
&lt;td&gt;20 (9%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average trust score&lt;/td&gt;
&lt;td&gt;57.0 / 100 (Grade C)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repos scoring F (0-20)&lt;/td&gt;
&lt;td&gt;74 (32%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Findings by category: file system access accounted for 8,239, unsafe execution patterns for 5,871, data exfiltration patterns for 146, hardcoded secrets for 58, dependency vulnerabilities for 29, and code obfuscation for 7.&lt;/p&gt;

&lt;h2&gt;
  
  
  Score Distribution
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score Range&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Repos&lt;/th&gt;
&lt;th&gt;Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;81 - 100&lt;/td&gt;
&lt;td&gt;A / A+&lt;/td&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61 - 80&lt;/td&gt;
&lt;td&gt;B / B+&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41 - 60&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21 - 40&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 - 20&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The distribution remains bimodal. More than half of repos score A or above, but over a quarter score F. Repos tend to be either clean or deeply problematic, with almost nothing in the middle. There is no gentle gradient between "secure" and "insecure" — it is one or the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notable Findings
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;openclaw/clawhub&lt;/strong&gt; (official skill registry)&lt;br&gt;
Score: 0/100. 2 critical, 228 high, 75 medium findings across 200 files. This is the registry that indexes skills for the broader ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;adversa-ai/secureclaw&lt;/strong&gt; (OWASP security plugin)&lt;br&gt;
Score: 0/100. 21 critical, 66 high, 177 medium findings. A security-focused plugin that itself has significant findings. The scanner flagged a high density of unsafe execution patterns and file system access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;openclaw/openclaw&lt;/strong&gt; (main framework)&lt;br&gt;
Score: 0/100. 1 critical, 14 high, 4 medium findings. The core framework that other skills build on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FreedomIntelligence/OpenClaw-Medical-Skills&lt;/strong&gt; (medical AI)&lt;br&gt;
Score: 0/100. 1 critical, 30 high, 12 medium findings. Medical AI skills with critical findings deserve particular scrutiny given their potential deployment context.&lt;/p&gt;

&lt;p&gt;Not all skills are problematic. &lt;strong&gt;tuya/tuya-openclaw-skills&lt;/strong&gt; scored 95/100, and several others came in at 90/100. The clean repos demonstrate that writing secure OpenClaw skills is entirely achievable — it is just not the norm across the board.&lt;/p&gt;
&lt;h2&gt;
  
  
  What This Means
&lt;/h2&gt;

&lt;p&gt;When Claude Code or any AI assistant runs a third-party tool, it executes that tool's code with whatever permissions the host process has. If that code contains unsafe exec patterns, broad file system access, or exfiltration vectors, the attack surface is your machine — your files, your environment variables, your credentials.&lt;/p&gt;

&lt;p&gt;The finding categories tell the story: 5,871 unsafe execution patterns means eval, exec, subprocess, and shell=True calls scattered across these codebases. 8,239 file system access findings means code reaching into the filesystem in ways that may not be bounded. 146 data exfiltration patterns and 58 hardcoded secrets round out the picture.&lt;/p&gt;

&lt;p&gt;Anthropic's decision to gate OpenClaw behind additional pricing starts to make more sense in this context. The cost is not just computational — it is risk.&lt;/p&gt;
&lt;h2&gt;
  
  
  New: PyPI Packages and Trust Gateway
&lt;/h2&gt;

&lt;p&gt;Since the initial scan, we have shipped three PyPI packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pypi.org/project/agentgraph-trust/" rel="noopener noreferrer"&gt;agentgraph-trust&lt;/a&gt;&lt;/strong&gt; (v0.3.1) — the MCP server for scanning tools directly from Claude Code or any MCP-compatible client&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pypi.org/project/agentgraph-agt/" rel="noopener noreferrer"&gt;agentgraph-agt&lt;/a&gt;&lt;/strong&gt; — the AgentGraph Trust CLI for CI pipelines and local use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pypi.org/project/open-agent-trust/" rel="noopener noreferrer"&gt;open-agent-trust&lt;/a&gt;&lt;/strong&gt; — a lightweight library for embedding trust checks into any Python agent framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have also built a &lt;strong&gt;trust gateway&lt;/strong&gt; — an enforcement layer that sits between your agent runtime and third-party tools. Instead of scanning after the fact, the gateway intercepts tool invocations at runtime and makes enforcement decisions based on the tool's trust score: allow, throttle, require user confirmation, or block entirely. The trust tiers (detailed below) drive these decisions automatically.&lt;/p&gt;

&lt;p&gt;The gateway turns scan results into policy. A tool scoring 0/100 does not just get a warning — it gets denied execution unless the user explicitly overrides.&lt;/p&gt;
&lt;h2&gt;
  
  
  Check Your Own Tools
&lt;/h2&gt;

&lt;p&gt;We built an MCP server that lets you check any agent or tool directly from Claude Code.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agentgraph-trust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to your Claude Code MCP config:&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;"agentgraph-trust"&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;"agentgraph-trust"&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;"AGENTGRAPH_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentgraph.co"&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;Then ask Claude: "Check the security of [agent name]"&lt;/p&gt;

&lt;p&gt;It returns a signed attestation with findings, trust score, and boolean safety checks. The attestation is cryptographically signed (Ed25519, JWS per RFC 7515) and verifiable against our public JWKS at &lt;code&gt;https://agentgraph.co/.well-known/jwks.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Public API — Trust-Tiered Rate Limiting
&lt;/h2&gt;

&lt;p&gt;We also built a free public API that any framework can use to check tools before execution. No authentication required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://agentgraph.co/api/v1/public/scan/{owner}/{repo}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API returns a trust tier with recommended rate limits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Rate Limit&lt;/th&gt;
&lt;th&gt;Token Budget&lt;/th&gt;
&lt;th&gt;User Confirm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;verified&lt;/td&gt;
&lt;td&gt;96-100&lt;/td&gt;
&lt;td&gt;unlimited&lt;/td&gt;
&lt;td&gt;unlimited&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;trusted&lt;/td&gt;
&lt;td&gt;81-95&lt;/td&gt;
&lt;td&gt;60/min&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;51-80&lt;/td&gt;
&lt;td&gt;30/min&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;minimal&lt;/td&gt;
&lt;td&gt;31-50&lt;/td&gt;
&lt;td&gt;15/min&lt;/td&gt;
&lt;td&gt;2K&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;restricted&lt;/td&gt;
&lt;td&gt;11-30&lt;/td&gt;
&lt;td&gt;5/min&lt;/td&gt;
&lt;td&gt;1K&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blocked&lt;/td&gt;
&lt;td&gt;0-10&lt;/td&gt;
&lt;td&gt;denied&lt;/td&gt;
&lt;td&gt;denied&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every response includes a signed JWS attestation. Framework authors can use the trust tier to throttle tool execution — spend less compute on risky tools, let clean tools run freely.&lt;/p&gt;

&lt;p&gt;This is the foundation for a trust gateway: instead of binary accept/deny, graduated throttling based on verified security posture.&lt;/p&gt;

&lt;p&gt;You can also embed a trust badge in your README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Trust Score&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://agentgraph.co/api/v1/public/scan/{owner}/{repo}/badge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Data
&lt;/h2&gt;

&lt;p&gt;The scanner and full results are open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scanner&lt;/strong&gt;: &lt;a href="https://github.com/agentgraph-co/agentgraph" rel="noopener noreferrer"&gt;github.com/agentgraph-co/agentgraph&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt;: &lt;a href="https://pypi.org/project/agentgraph-trust/" rel="noopener noreferrer"&gt;pypi.org/project/agentgraph-trust&lt;/a&gt; (v0.3.1) | &lt;a href="https://github.com/agentgraph-co/agentgraph/tree/main/sdk/mcp-server" rel="noopener noreferrer"&gt;source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/agentgraph-agt/" rel="noopener noreferrer"&gt;pypi.org/project/agentgraph-agt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library&lt;/strong&gt;: &lt;a href="https://pypi.org/project/open-agent-trust/" rel="noopener noreferrer"&gt;pypi.org/project/open-agent-trust&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://agentgraph.co/check" rel="noopener noreferrer"&gt;agentgraph.co/check&lt;/a&gt;&lt;/strong&gt; — Paste any GitHub repo URL, MCP server name, or agent package and get an instant letter grade. No signup, no API key, no cost. The result is a signed attestation you can independently verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7 PyPI packages&lt;/strong&gt; available now:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-trust/" rel="noopener noreferrer"&gt;agentgraph-trust&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MCP server — scan tools from Claude Code or any MCP client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-agt/" rel="noopener noreferrer"&gt;agentgraph-agt&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CLI for CI pipelines and local scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/open-agent-trust/" rel="noopener noreferrer"&gt;open-agent-trust&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Lightweight library for embedding trust checks in any Python agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-scanner/" rel="noopener noreferrer"&gt;agentgraph-scanner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Core scanning engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-attestation/" rel="noopener noreferrer"&gt;agentgraph-attestation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cryptographic attestation signing and verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-gateway/" rel="noopener noreferrer"&gt;agentgraph-gateway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Trust gateway enforcement layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pypi.org/project/agentgraph-badges/" rel="noopener noreferrer"&gt;agentgraph-badges&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Trust badge generation for READMEs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/agentgraph-co/agentgraph-trust-action" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;&lt;/strong&gt; — Add trust scanning to any CI pipeline. Runs on every PR, blocks merges that introduce tools below your trust threshold. Drop it into your workflow in two lines:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agentgraph-co/agentgraph-trust-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;fail-below&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;The agent ecosystem needs trust infrastructure. We are building it at &lt;a href="https://agentgraph.co" rel="noopener noreferrer"&gt;agentgraph.co&lt;/a&gt;.&lt;/p&gt;

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