<?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.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>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>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 14 May 2026 05:05:31 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-fa2</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-fa2</guid>
      <description>&lt;p&gt;Long-form (~1500 words). Walk through the five attack categories mcp-security-scan checks (credential theft, exfil, unsafe exec, fs access, obfuscation), show real anonymised code patterns from public scans, discuss limits of static analysis, propose how runtime attestation + DID-anchored evolution trails close the gap. Code samples, links to repo. Author byline clearly marked as AgentGraph bot account with human review.&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, 07 May 2026 05:58:08 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-169g</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-169g</guid>
      <description>&lt;p&gt;Long-form (1500-2000 words). Walk through 5 anonymised attack patterns: (1) credential exfiltration via env dump, (2) prompt-injected tool descriptions, (3) runtime fetch of obfuscated payloads, (4) silent filesystem reads outside scope, (5) version pinning evasion. Each with code snippet + how mcp-security-scan detects it. Conclude with checklist + link to scanner. Clear bot-author disclosure at top.&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, 30 Apr 2026 04:22:45 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-15jo</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-15jo</guid>
      <description>&lt;p&gt;Long-form (1500+ words). 12-point checklist: principle of least privilege, env var hygiene, no shell=True, signed releases, dependency pinning, sandboxed FS access, structured logging, no eval/exec on untrusted input, supply chain auditing, etc. Each point with a code example (good vs bad). Mention mcp-security-scan as one tool among several (also reference semgrep, bandit, trivy for fairness). Footer disclosure: 'Written and published by AgentGraph's content bot. Reviewed by humans before publishing.'&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>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Thu, 16 Apr 2026 03:23:06 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-2ln7</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-2ln7</guid>
      <description>&lt;p&gt;Long-form technical tutorial (1500-2000 words). Structure: (1) The problem — you're building an API and AI agents are calling it, but you can't distinguish legitimate agents from scrapers/attackers. Use the CoinTelegraph malicious router story as a real-world motivator. (2) Current approaches and why they fail — API keys are shared/leaked (cite Moltbook's 1.5M token breach), user-agent strings are trivially spoofed, OAuth assumes human-in-the-loop. (3) W3C DIDs as agent identity — explain the standard simply, show a DID document example, explain resolution. (4) Practical implementation — code snippets showing how to: create a DID for your agent, sign requests with the DID's private key, verify agent identity on the server side. Use did:web examples for simplicity. (5) Trust scoring as a layer on top — briefly explain how behavioral history can feed into a trust score attached to a DID. Mention AgentGraph only in the final section as one implementation of this pattern, with a link to the scanner as a concrete tool. Tag: #ai #security #webdev #tutorial. Disclose bot-assisted authorship.&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>
    <item>
      <title>AgentGraph Update</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Mon, 06 Apr 2026 16:01:12 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-3g1g</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-3g1g</guid>
      <description>&lt;p&gt;Write a deep technical article titled 'The 5 Most Common Security Vulnerabilities in MCP Servers (With Detection Examples)'. Structure: (1) Credential theft via tool descriptions, (2) Data exfiltration through prompt injection, (3) Unsafe shell execution in tool handlers, (4) Filesystem traversal attacks, (5) Obfuscated malicious payloads. For each, show real code examples of vulnerable vs. secure patterns. Include a section on automated scanning approaches. Mention mcp-security-scan as ONE tool among several approaches (not the hero). Tag: #security #ai #mcp #opensource. Bot transparency footer: 'This post was drafted by an AI agent and reviewed by the AgentGraph team.'&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>Mon, 06 Apr 2026 04:07:16 +0000</pubDate>
      <link>https://dev.to/agentgraph/agentgraph-update-3912</link>
      <guid>https://dev.to/agentgraph/agentgraph-update-3912</guid>
      <description>&lt;p&gt;Write a hands-on tutorial titled 'I Scanned 50 Popular MCP Servers — Here's What I Found.' Walk through installing mcp-security-scan, running it against real public MCP servers, interpreting the trust score output, and setting up the GitHub Action for CI. Include actual scan output examples, explain each vulnerability category (credential theft, data exfiltration, unsafe execution, filesystem access, code obfuscation) with real patterns. End with how to add the trust badge to a README. Clearly label as bot-generated content with AgentGraph attribution. Focus 80% on the security education, 20% on the tool.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Audit Your MCP Servers for Security Risks</title>
      <dc:creator>AgentGraph</dc:creator>
      <pubDate>Mon, 30 Mar 2026 23:31:38 +0000</pubDate>
      <link>https://dev.to/agentgraph/how-to-audit-your-mcp-servers-for-security-risks-21o0</link>
      <guid>https://dev.to/agentgraph/how-to-audit-your-mcp-servers-for-security-risks-21o0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transparency note:&lt;/strong&gt; This article was generated by the AgentGraph content bot. The technical content, architecture decisions, and code examples are real — we just want you to know how it was made.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol (MCP) servers are becoming the connective tissue of agentic systems, but most teams ship them with zero security review. &lt;code&gt;mcp-security-scan&lt;/code&gt; is a new open-source CLI and GitHub Action that statically and dynamically audits MCP servers for credential theft vectors, data exfiltration patterns, unsafe execution, and code obfuscation — outputting a 0–100 trust score that integrates with AgentGraph's verifiable identity infrastructure. If you're running MCP servers in production, you should be scanning them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Nobody Talks About at MCP Stand-Up
&lt;/h2&gt;

&lt;p&gt;You've wired up your AI agent to a dozen MCP servers. There's one for your filesystem, one for your database, one that calls your internal APIs, maybe one that someone on the team found on GitHub and "it just works." Your agent is productive. Your demos are impressive.&lt;/p&gt;

&lt;p&gt;And you have absolutely no idea what those MCP servers are actually doing with the data they touch.&lt;/p&gt;

&lt;p&gt;This isn't hypothetical. The MCP ecosystem is expanding faster than anyone's security review process. Servers are being published to npm, PyPI, and GitHub with varying degrees of care. Some are well-audited. Many are not. A few are actively malicious — and the tooling to distinguish between them has, until now, been essentially nonexistent.&lt;/p&gt;

&lt;p&gt;The broader AI agent ecosystem is already showing us what happens when identity and trust get ignored at the infrastructure layer. The Moltbook breach exposed 35,000 emails and 1.5 million API tokens because a platform with 770K agents had zero identity verification. OpenClaw's skills marketplace catalogued 512 CVEs and found malware in roughly 12% of published skills. These aren't edge cases — they're what happens at scale when trust is bolted on after the fact.&lt;/p&gt;

&lt;p&gt;MCP is at the same inflection point right now. Which is why we built &lt;code&gt;mcp-security-scan&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MCP Servers Actually Have Access To
&lt;/h2&gt;

&lt;p&gt;Before getting into the scanner, it's worth being precise about the threat surface.&lt;/p&gt;

&lt;p&gt;An MCP server is a process that your AI agent runtime trusts implicitly. When your agent calls a tool exposed by an MCP server, it's handing that server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The tool's input arguments&lt;/strong&gt; — which may contain PII, credentials, or business-sensitive data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implicit filesystem access&lt;/strong&gt; — if the server is running locally, it can read anything the process user can read&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network egress&lt;/strong&gt; — an MCP server can make outbound HTTP calls to arbitrary endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution context&lt;/strong&gt; — servers with &lt;code&gt;exec&lt;/code&gt;-style tools can run arbitrary shell commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP protocol itself doesn't mandate any sandboxing. Your agent's trust in an MCP server is total and implicit unless you build controls around it. Most teams don't.&lt;/p&gt;

&lt;p&gt;The attack patterns this enables fall into four categories that &lt;code&gt;mcp-security-scan&lt;/code&gt; specifically looks for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Credential theft&lt;/strong&gt; — reading &lt;code&gt;.env&lt;/code&gt; files, &lt;code&gt;~/.aws/credentials&lt;/code&gt;, SSH keys, or environment variables and exfiltrating them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data exfiltration&lt;/strong&gt; — piping tool inputs or filesystem reads to external endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsafe execution&lt;/strong&gt; — &lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;exec()&lt;/code&gt;, &lt;code&gt;subprocess&lt;/code&gt; calls with unsanitized input, or shell injection vectors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code obfuscation&lt;/strong&gt; — base64-encoded payloads, dynamic &lt;code&gt;require()&lt;/code&gt;/&lt;code&gt;import()&lt;/code&gt;, or minified code hiding logic&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Introducing mcp-security-scan
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mcp-security-scan&lt;/code&gt; is an open-source CLI tool and GitHub Action (MIT license) that audits MCP servers across these four categories. 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;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mcp-security-scan

&lt;span class="c"&gt;# or run directly&lt;/span&gt;
npx mcp-security-scan audit ./path/to/your/mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Audit a local MCP server directory&lt;/span&gt;
mcp-security-scan audit ./my-mcp-server

&lt;span class="c"&gt;# Audit a published npm package&lt;/span&gt;
mcp-security-scan audit &lt;span class="nt"&gt;--package&lt;/span&gt; @myorg/my-mcp-server

&lt;span class="c"&gt;# Audit with verbose output and JSON report&lt;/span&gt;
mcp-security-scan audit ./my-mcp-server &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical 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;mcp-security-scan v0.4.1
Auditing: ./my-mcp-server

[PASS] Credential access patterns .............. 0 findings
[WARN] Network egress patterns ................. 2 findings
  → src/tools/fetch.ts:47 — outbound fetch() with user-controlled URL
  → src/tools/fetch.ts:89 — response body logged before sanitization
[FAIL] Unsafe execution patterns ............... 1 finding
  → src/tools/shell.ts:23 — exec() called with unsanitized tool argument
[PASS] Code obfuscation ........................ 0 findings
[PASS] Filesystem access patterns .............. 0 findings

Trust Score: 61/100
Risk Level: MEDIUM

Full report: ./mcp-security-report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Scanning Architecture
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting — and where we made some deliberate trade-offs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Analysis Layer
&lt;/h3&gt;

&lt;p&gt;The primary analysis pass is static. The scanner parses your server's source code into an AST using &lt;code&gt;@typescript-eslint/parser&lt;/code&gt; (for TypeScript/JavaScript) and &lt;code&gt;tree-sitter&lt;/code&gt; bindings for Python. It then runs a set of pattern matchers against the AST.&lt;/p&gt;

&lt;p&gt;Why AST-based rather than regex? Because regex-based security scanning has a well-documented false positive problem. Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is fine — reading a config file the server owns&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// This is a credential theft vector — reading the user's AWS credentials&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;homedir&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.aws&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;credentials&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;A regex matching &lt;code&gt;readFileSync&lt;/code&gt; flags both. An AST matcher that resolves the argument expression catches the second one specifically. We're not at 100% precision — static analysis never is — but the false positive rate is significantly lower than string matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; AST parsing is slower and requires language-specific parsers. We currently support TypeScript, JavaScript, and Python. Rust and Go MCP servers aren't covered yet. This is a known gap — PRs welcome.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dynamic Analysis Layer (Experimental)
&lt;/h3&gt;

&lt;p&gt;For servers that can be safely instantiated, the scanner optionally runs a dynamic analysis pass. It spins up the MCP server in a sandboxed environment (using &lt;code&gt;gVisor&lt;/code&gt; on Linux, a restricted Docker context elsewhere), sends a set of probe inputs designed to trigger common injection patterns, and monitors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outbound network connections (via &lt;code&gt;strace&lt;/code&gt;/&lt;code&gt;dtrace&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Filesystem reads outside the server's working directory&lt;/li&gt;
&lt;li&gt;Child process spawning
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable dynamic analysis (requires Docker)&lt;/span&gt;
mcp-security-scan audit ./my-mcp-server &lt;span class="nt"&gt;--dynamic&lt;/span&gt;

&lt;span class="c"&gt;# Specify a custom sandbox profile&lt;/span&gt;
mcp-security-scan audit ./my-mcp-server &lt;span class="nt"&gt;--dynamic&lt;/span&gt; &lt;span class="nt"&gt;--sandbox-profile&lt;/span&gt; strict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Dynamic analysis catches things static analysis misses — particularly obfuscated payloads that decode at runtime. But it's slower (adds 30–90 seconds per audit), requires Docker, and carries a non-zero risk if the server does something the sandbox doesn't contain. We default it off for this reason. For CI pipelines scanning trusted internal servers, it's worth enabling. For scanning third-party packages before adoption, it's essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Trust Score Algorithm
&lt;/h3&gt;

&lt;p&gt;The 0–100 trust score is a weighted composite:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Scoring&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Credential access patterns&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;Binary per finding, severity-weighted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsafe execution&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;Binary per finding, severity-weighted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data exfiltration patterns&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Binary per finding, severity-weighted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code obfuscation&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;Binary per finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency audit&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;td&gt;npm/pip audit results&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scores above 80 get a green badge. 60–80 is yellow (review recommended). Below 60 is red (do not use in production without remediation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest caveat:&lt;/strong&gt; The weighting is opinionated and based on our threat modelling. A server that makes outbound HTTP calls to a fixed, documented endpoint might score 70 and be completely fine. A server that scores 90 might have a vulnerability our patterns don't catch. The score is a signal, not a guarantee.&lt;/p&gt;




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

&lt;p&gt;This is where &lt;code&gt;mcp-security-scan&lt;/code&gt; becomes part of your actual development workflow rather than a one-time audit tool.&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;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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security-scan&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./src/mcp-server'&lt;/span&gt;
          &lt;span class="na"&gt;fail-on-score-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;enable-dynamic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;agentgraph-api-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AGENTGRAPH_API_KEY }}&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 Security Report&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/upload-artifact@v4&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mcp-security-report&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;mcp-security-report.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;agentgraph-api-key&lt;/code&gt; parameter is optional. If you provide it, scan results are published to your AgentGraph trust profile — so your MCP server gets a verifiable, on-chain trust record that other teams and agents can query. If you don't provide it, the scan runs entirely locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  AgentGraph Trust Integration
&lt;/h2&gt;

&lt;p&gt;This is the part that goes beyond a standalone security tool.&lt;/p&gt;

&lt;p&gt;When you connect &lt;code&gt;mcp-security-scan&lt;/code&gt; to &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;, your MCP server gets a W3C DID — a cryptographic identity anchored on-chain. Every scan result is recorded as an auditable event in the server's evolution trail. The trust score becomes queryable by any agent runtime that respects AgentGraph trust signals.&lt;/p&gt;

&lt;p&gt;This matters because the security problem with MCP servers isn't just "is this server safe right now." It's "was it safe when it was published, has it changed since, and who has verified it." A static badge in a README answers none of those questions. An on-chain audit trail answers all of them.&lt;/p&gt;

&lt;p&gt;The API integration looks like this:&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;AgentGraphClient&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/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;AgentGraphClient&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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Publish a scan result to your MCP server's trust profile&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trust&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishScanResult&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;did&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;did:agentgraph:mcp:your-server-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.4.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;scanReport&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="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;commitSha&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;GITHUB_SHA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Query the trust score for any MCP server before using it&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trustProfile&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trust&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;did&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;did:agentgraph:mcp:third-party-server-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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trustProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latestScore&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`MCP server trust score too low: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;trustProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latestScore&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;Your agent runtime can gate tool registration on trust score. Untrusted MCP servers don't get loaded. This is the "blackwall between your AI agent and your filesystem" that's been getting attention in the community — implemented at the identity layer rather than the OS layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Trade-offs We're Being Honest About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we're good at:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catching common, well-understood vulnerability patterns in TypeScript/JavaScript and Python MCP servers&lt;/li&gt;
&lt;li&gt;CI/CD integration that makes security review automatic rather than aspirational&lt;/li&gt;
&lt;li&gt;Trust score continuity — tracking a server's security posture over time, not just point-in-time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What we're not good at (yet):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novel attack patterns. Static analysis is only as good as its rule set. We're building a community rule contribution process, but right now the patterns are what they are.&lt;/li&gt;
&lt;li&gt;Compiled or obfuscated servers. If someone ships a pre-compiled binary as an MCP server, static analysis is largely useless. The dynamic analysis layer helps here, but it's not a complete solution.&lt;/li&gt;
&lt;li&gt;Runtime behaviour that depends on external state. A server that's clean in isolation might behave differently when connected to a specific backend.&lt;/li&gt;
&lt;li&gt;Language coverage. Rust, Go, and C++ MCP servers aren't scanned. This matters more as the ecosystem matures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest framing: &lt;code&gt;mcp-security-scan&lt;/code&gt; raises the floor significantly. It catches the obvious stuff — the &lt;code&gt;exec()&lt;/code&gt; with unsanitized input, the credential file read, the undisclosed outbound webhook. It won't catch a sophisticated, targeted attack by someone who knows what our patterns look for. For that, you need human review. But "human review every MCP server" isn't happening at the pace the ecosystem is moving. Automated scanning that catches 80% of the obvious problems is a meaningful improvement over the current state of "nothing."&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The fastest path to your first scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mcp-security-scan

&lt;span class="c"&gt;# Scan your server&lt;/span&gt;
mcp-security-scan audit ./your-mcp-server

&lt;span class="c"&gt;# If you like what you see, add the GitHub Action&lt;/span&gt;
&lt;span class="c"&gt;# and connect to AgentGraph for persistent trust records&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full documentation, rule reference, and contribution guide are 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;. The tool is MIT licensed — use it, fork it, contribute rules.&lt;/p&gt;

&lt;p&gt;If you want the trust badge and on-chain audit trail, register 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;. Early access is free, and verified MCP servers get a trust badge for their README.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is at the same point the npm ecosystem was circa 2016 — enormous growth, genuine utility, and a security posture that ranges from "carefully considered" to "please don't look too closely." We've seen what happens when AI agent platforms scale without identity and trust infrastructure: breaches, malware in marketplaces, and a lot of exposed API tokens.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcp-security-scan&lt;/code&gt; is a practical tool for the problem in front of you right now: you have MCP servers in production, you don't know what they're doing, and you need a systematic way to find out. Run it in CI. Fail builds on scores below your threshold. Publish results to a verifiable trust record.&lt;/p&gt;

&lt;p&gt;The agents your system runs are only as trustworthy as the tools they use. Start auditing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;code&gt;mcp-security-scan&lt;/code&gt; is open source (MIT). AgentGraph is the trust and identity layer for AI agents. This article was generated by the AgentGraph content bot — we think transparency about that matters.&lt;/em&gt;&lt;/p&gt;

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