AI agent & MCP security

The security scanner for AI agents and MCP servers.

Attestral reads your MCP configs, system prompts, and tool descriptions, builds one system model, and reviews the agentic surfaces most scanners never look at. It models the cloud and Kubernetes your agent runs on too, so it can see the trust boundary between them. Findings map to NIST, ASVS, SOC 2, CIS, and OWASP Agentic, and land in a tamper-evident evidence chain.

Scan the MCP servers you've already installed.

$ pip install attestral
$ attestral scan --local

No account, no API key, fully offline. It reads the MCP configs your agents already use (Claude Desktop, Cursor, .mcp.json) and reviews every server it finds.

$ attestral scan examples/vulnerable-agent
  [CRITICAL] ATL-202  Tool fleet forms an exfiltration chain (lethal trifecta)  (model)
  [CRITICAL] ATL-108  Agent tool calls auto-approved with no human checkpoint  (mcp_server.shell)
  [CRITICAL] ATL-103  Shell-capable MCP server configured  (mcp_server.shell)
  [HIGH    ] ATL-207  Untrusted input can reach a sensitive action  (model)
  [HIGH    ] ATL-115  Remote server holds a downstream credential  (mcp_server.jira)
  [HIGH    ] ATL-105  MCP server auto-installs packages at launch  (mcp_server.web)
  [HIGH    ] ATL-ML-001  Prompt-injection text hidden in a tool description  (mcp_server.web)
  [MEDIUM  ] ATL-104  Secrets passed to MCP server via environment  (mcp_server.jira)
   and 8 more
6 components · 16 findings · 4 critical, 8 high, 4 medium

A design review of the vulnerable-agent example in the repo: two small config files, sixteen design findings, zero cloud credentials required. Three are fleet-level, including a lethal trifecta that only exists once you model all the servers together, and two are the prompt-injection payloads the built-in classifier catches by default. Point it at your own machine with attestral scan --local, or add --ml for the model-grade classifier tier.

PyPI v0.15.0 Python 3.10+ Zero required deps Runs fully offline Apache 2.0
0
security checks
high-signal, each with a fixture
0
clouds modeled
AWS · Azure · GCP · Kubernetes
0
frameworks mapped
OWASP · NIST · MITRE · CIS · SOC 2
0
review layers
deterministic · ML · LLM

The moat

It builds a model of your whole fleet, then reasons across it.

Not a config-by-config scan. Attestral ingests your MCP servers, prompts, cloud, and Kubernetes into one graph of components, edges, and trust boundaries. That is how it sees the path a single injected sentence can take: from an untrusted input, through a shell, across the boundary into your cloud. Hover a node to see its reach, or trace the attack path.

hover any node to see its reach
agent runtime cloud trust boundary orchestratoragent web-fetchnetwork jirasaas_data ops-shellshell notifymessaging deployshell s3 bucketcloud store iam rolecloud
trust boundary reach / dataflow attack path

Adversarial validation · attestral validate

It no longer just flags the path. It proves it holds.

A finding is an opinion. attestral validate takes the attack path it built from your system model and walks it over the model's own edges, proving whether it actually holds: entry, pivot, impact. The proof lands in the tamper-evident evidence chain, it scores the risk with an OWASP AIVSS agentic score (AARS), and it even proves the fix - the one change that closes the path, verified by re-synthesis. Watch one prove itself below, then open the fully interactive walker.

ATL-RT-INTERNAL · a prompt injection reaches exfiltration

entry
jira-reader
ingests untrusted input via saas_data
pivot
ops-shell
runs code via shell
impact
web-fetch
exfiltrates via network
PROVEN
TRAVERSABLE
chained · verify offline · OWASP AIVSS AARS 9.3

Don't take the demo's word for it. Paste your own config.

Drop in an .mcp.json or claude_desktop_config.json and seventeen of the agentic checks from the rule pack, the same typed matchers the engine runs, review it right here. Everything happens in this tab: the page makes no network request with what you paste. The CLI goes further, with the cloud packs, attack paths, prompt surfaces, and the evidence chain.

The example is examples/vulnerable-agent/.mcp.json from the repo, the same file the demo above scans.

$ attestral scan <pasted config>
waiting for a config. Load the example, or paste the mcpServers block your agent already uses.

Why not just Checkov or Trivy?

Keep using them. They are excellent at cloud infrastructure, and attestral is not out to replace them; it scans the same Terraform and Kubernetes with a solid CIS-grounded pack of its own. But those tools were built before agents had tools. They do not parse an .mcp.json, they cannot tell that a tool description is quietly asking the model to read your SSH key, and they have no concept of the trust boundary between an agent and the shell it can call. Attestral does one thing they structurally can't: it builds a system model of your whole agent fleet, so it catches the toxic flows that only exist across servers, where private data meets an exit and one injected sentence walks out with your secrets.

Capability Checkov · Trivy · tfsec Attestral
Cloud IaC misconfiguration Mature and deep. Their home turf. A CIS-grounded pack across AWS, Azure, GCP, and Kubernetes.
MCP server configs (shell access, transport, secrets) Not modeled. First-class components in the system model.
System prompts and tool descriptions Not parsed. Reviewed, and scored for prompt injection.
Agent-to-tool trust boundaries No concept of one. The center of the graph attestral builds.
Prompt injection in agentic text Out of scope. Local ML classifier, on by default, fully offline.
Toxic flows across the tool fleet (lethal trifecta) No fleet model. Named source and sink servers, mapped over the graph.
Memory poisoning & risky agent skills Not modeled. World-writable CLAUDE.md, vector stores, SKILL.md grants.
Runtime drift & tool rug-pulls Static only. Attested design compiles to a policy; drift is caught.
Known MCP CVEs & hook config-injection Not tracked. Vulnerable package versions and malicious .claude/settings.json hooks (CVE-2025-6514, CVE-2025-59536).
Tamper-evident audit evidence Report only. SHA-256 evidence chain you verify offline.

The honest version: run Checkov and Trivy for cloud depth, and run attestral for everything that lives above the infrastructure, the agent, its tools, and the prompts that drive them. It happens to cover the cloud underneath too.

183 checks, and the balance is the strategy.

We do not chase rule count. Every check earns its place with a real control and a fixture. The agentic and cross-boundary rules are the moat, the surfaces nobody else models; the cloud packs are deliberately good enough that you need no second scanner, never an arms race.

MCP / Agenticthe moat
0
Cross-boundaryreachability
0
AWSCIS-grounded
0
AzureCIS-grounded
0
GCPCIS-grounded
0
KubernetesPod Security
0

36 agentic and cross-boundary checks that are genuinely hard to copy, over 147 cloud checks across AWS, Azure, GCP, and Kubernetes, mapped to 21 framework families. Depth where it is the moat, parity where it just has to be solid.

The finding that lives in no single file.

Every server below is individually defensible, and a config-by-config scanner would wave them all through. The risk is compositional: the moment one agent session can read private data and reach an exit, a single injected sentence anywhere in its inputs becomes an exfiltration. Toggle the fleet and watch the pack's combination rules evaluate it live, using the same capability groups attestral scan applies to your real configs.

The exfiltration chain

reads private datanothing yet
reaches an exitnothing yet
toggle servers above

Command and control

executes commandsnothing yet
reaches the networknothing yet
toggle servers above

Fleet-level findings only: the per-server findings these toggles would also raise (a shell server is ATL-103 all by itself) are left out here to keep the composition visible. On a real scan the full attack path is also synthesized end to end, entry to pivot to impact.

Design review is where security is cheapest. It is also where the tooling is oldest.

The enterprise threat modeling market just consolidated into a single private-equity-owned vendor, priced for the Fortune 500 and built on decade-old architecture. Everyone else reviews designs in spreadsheets and wiki templates: slow, inconsistent, and with nothing to show an auditor. And the fastest-growing attack surface, AI agents and their tools, is the part legacy platforms understand least.

A security review you can't prove happened is an opinion, not a control.

For the teams who review before they ship.

Banks, insurers, and compliance teams under audit review architecture on purpose, because for them a flaw found after an agent reaches production is not a code fix. It is change management, re-certification, and an incident write-up. The same flaw caught in the design review is a one-line config change. Attestral is built for that review: it reads the agent design the way a security architect would, and it produces something an auditor can actually verify.

Grounded in real threats

Named, not hypothetical

The risks are cataloged: prompt injection and excessive agency in the OWASP Agentic and LLM top-tens, adversary tactics in MITRE ATLAS, the lethal trifecta across a tool fleet, live MCP CVEs like CVE-2025-6514. Attestral checks for the specific ones your design actually exposes.

Evidence, not assertions

What an auditor accepts

SOC 2 and NIST 800-53 want proof a control operated, not a claim that it exists. Findings carry those references and OWASP Agentic, and the hash-chained review is the artifact you hand over. The EU AI Act and model-risk expectations both push this diligence before a system ships, not after.

Design time and run time

And prove it stays true

A design review is only worth its paper if production still matches it. The reviewed model compiles to a runtime policy bound to the review's chain head, and attestral drift flags anything the review never saw. One attested artifact, checked at design time and verified in production.

Three layers. Nothing hidden.

Regulated buyers can't accept "the AI said so." Attestral separates what is deterministic from what is model-reasoned, and labels every finding with its origin.

Layer 1 · Deterministic

Typed rules over a unified model

Terraform, Kubernetes manifests, MCP configs, agent instructions, and system prompts become one graph of components, edges, and trust boundaries. A CIS-grounded pack of typed YAML rules fires against that graph, spanning AWS, Azure, GCP, Kubernetes, and the agentic surfaces nobody else models. There is no eval anywhere in the path, and an unknown matcher simply never matches.

Layer 2 · Reasoning

Local ML + LLM, clearly tagged

An optional local DeBERTa classifier scores agentic text surfaces (MCP tool descriptions, system prompts) for prompt injection, offline. A frontier model then reviews the same graph for design-level gaps rules can't express: trust-boundary violations, tool-permission escalation, handoff confusion. Both optional, both always labeled by origin.

Layer 3 · Evidence

A chain you can hand to an auditor

Findings, mitigations, and sign-offs get committed to a SHA-256 hash chain. Every finding carries its NIST 800-53, ASVS, SOC 2, and OWASP Agentic references. Export the review once and anyone can verify it offline, years later. Emit it as SARIF and the same findings land in your GitHub Security tab and right on the pull request.

$ attestral scan ./platform --fail-on high
  [CRITICAL] ATL-003  IAM policy grants wildcard actions  (aws_iam_policy.admin)
  [CRITICAL] ATL-103  Shell-capable MCP server configured  (mcp_server.shell)
  [HIGH    ] ATL-102  Filesystem MCP server rooted at a broad path  (mcp_server.filesystem)
7 components · 10 findings · chain head c31f8e…9bd4
$ attestral verify review.json
chain VALID

Layer 2 · reasoning

The risk that lives in the words, not a flag.

A shell flag is a boolean any matcher can catch. A tool description that quietly tells the model to read your SSH key and post it out is language, and no rule sees it. Attestral scores agentic text surfaces for prompt injection with a local classifier: a zero-dependency heuristic by default, an ONNX or DeBERTa tier once you install it, always offline. Load a description or paste your own, and watch it score in real time.

0.00
paste or load a description

A browser illustration of the heuristic signals. The shipped classifier is a fine-tuned DeBERTa model, see the ML layer explainer. Language risk is scored, never hard-blocked: it becomes a finding tagged origin: ml, so a human still decides.

One command, the whole loop.

From raw config to a runtime policy that catches drift. Scroll through the pipeline: every stage is a real step in a single attestral run, and nothing is hidden between them.

1
Ingest
2
Model
3
Review
4
Evidence
5
Compile
6
Drift

Built for the review board, not just the terminal.

On every change

CI on every pull request

Run the scan in CI and findings post to the GitHub Security tab and inline on the pull request as SARIF, so new risk is caught before merge instead of at the annual review.

Agent-native

MCP and agent coverage first

Tool servers, capability scopes, and multi-agent handoffs are first-class parts of the model, not an afterthought bolted onto a diagramming canvas.

Roadmap

Model import

Bring your existing threat models with you. Import from legacy platform exports and keep your review history, chain-sealed from day one. On the roadmap.

Tamper with the record. Watch it break.

Every finding commits to a SHA-256 chain: entry N hashes its own canonical JSON together with the hash of entry N-1, from a zero genesis. The head is the integrity commitment for the run. This recomputes live in your browser, the same construction attestral verify uses. Edit one entry and every hash after it stops matching.

chain VALID

The review is the policy. The policy is the proof.

This is the depth that makes a review audit-grade, not just a linter. Scanners stop at findings. Gateways enforce policies nobody reviewed. Attestral makes them the same artifact. The reviewed system model compiles into an mcp-guard runtime policy stamped with the review's chain head, and anything the review never saw counts as drift.

attestral scan

Attest

Terraform, Kubernetes, and MCP configs become one system model, reviewed against typed rules and (optionally) a local ML classifier and LLM reasoning. Findings are hash-chained.

attestral compile

Enforce

The reviewed model compiles to a default-deny policy. Denied capabilities carry the rule id that denied them, filesystem roots narrow to what was reviewed, and the policy header binds to the review's chain head.

attestral drift

Prove

Runtime telemetry gets diffed against the compiled policy. An unattested server, a denied invocation, an out-of-scope path: each one is a drift finding. Deployment and review can no longer quietly diverge.

$ attestral compile ./platform -o policy.yaml
wrote policy.yaml · default deny · 1 allowed, 3 denied
  [DENY ] shell  (denied by attested design review: ATL-103)
$ attestral drift policy.yaml events.jsonl --fail-on-drift
  [CRITICAL] DRF-001  Unattested server observed at runtime  (mcp_server.jira-sync)
  [HIGH    ] DRF-003  Filesystem access outside attested roots  (mcp_server.docs)
DRIFT: deployment no longer matches the attested design

Then the policy watches. Drift gets caught.

The attested design compiled to a default-deny policy. Now runtime telemetry is diffed against it. Watch the events stream in: what the review saw passes, and what it never saw is drift, each tagged with the rule that caught it. This is the loop no scanner and no gateway closes on its own.

compiled policy · default deny
jiraALLOW
filesystemALLOW
webALLOW
shellDENY
bound to review chain head c31f8e…9bd4

Every finding cites a real control.

A finding is not an opinion with a severity attached. Each one maps to a named framework an auditor already recognizes, so the review is evidence, not assertion. Attestral spans the agentic frameworks nobody else covers and the cloud controls everybody expects.

Agentic

OWASP LLM & Agentic Top 10

Prompt injection, excessive agency, and the tool-fleet risks specific to agents.

Adversary model

MITRE ATLAS

Adversarial ML tactics and techniques, mapped to the surfaces Attestral reviews.

Federal

NIST 800-53

Access control, system integrity, and the control families audits are built on.

Cloud

CIS Benchmarks

The essential AWS, Azure, GCP, and Kubernetes checks, each grounded in a real control.

Attestation

SOC 2

Proof a control operated, not a claim it exists. The evidence chain is the artifact.

Verification

OWASP ASVS

Application security verification requirements, cited per finding where they apply.

Attestral Labs

Security built for the agentic era, not bolted onto it.

Agents got tools before anyone secured them. The industry's answer was to bolt an agent tab onto scanners built for a pre-agent world. Attestral is built the other way around: a system model of the agent, its tools, and the cloud they can reach comes first, and everything else follows from that graph.

Be #1, uncontested

Agentic security is our identity

MCP, prompt injection, tool poisoning, excessive agency, the OWASP Agentic and MITRE ATLAS surfaces. Depth here is the moat, and it is where we invest first.

Structurally uncopyable

Architecture, not a linter

One system model lets us reason about agent-to-cloud reachability, secrets crossing a boundary, proven attack paths, and compile-to-policy drift. You cannot match that by adding rules.

Parity, not volume

Your cloud, covered too

Around 150 high-signal CIS checks across AWS, Azure, GCP, and Kubernetes. Good enough that most teams need no second scanner, never an arms race.

Open source, forever. The core is Apache 2.0 and always will be. The vision is a single artifact that carries a design from review, to proof, to runtime policy, so that "is this agent safe" stops being an opinion and becomes something anyone can verify. See the work on GitHub.

Start in sixty seconds.

No account, no server, no API key. The whole attest → prove → enforce → detect loop runs on your laptop, under Apache 2.0.

$ pip install attestral
$ attestral scan ./my-project              # attest: one system model, reviewed
$ attestral verify review.json           # prove: chain VALID
$ attestral compile ./my-project -o policy.yaml  # enforce: default-deny policy
$ attestral drift policy.yaml events.jsonl  # detect: runtime vs. reviewed design

Gate every deploy in CI with the GitHub Action:

# .github/workflows/drift.yml
- uses: attestral-labs/attestral@v1
  with:
    policy: policy.yaml
    events: events.jsonl