Skip to main content
Glama

Thirty seconds, no AWS account needed

pip install cloud-audit

cloud-audit agent-blast --demo          # a hijacked Bedrock Agent, two threat models, one screen
cloud-audit demo --save demo.json       # a full sample scan, then explore it offline:
cloud-audit blast-radius --report demo.json --resource arn:aws:iam::123456789012:role/support-bot-ticket-role
cloud-audit simulate     --report demo.json --fix aws-iam-018
cloud-audit exposure     --report demo.json

The sample account is invented. Everything derived from it (attack chains, root causes, breach cost, security graph, agent reach) is produced by the same engines a real scan uses.

With credentials, the real thing is one command and read-only. The AWS-managed SecurityAudit policy covers every check (permissions):

cloud-audit scan                         # default profile and region
cloud-audit scan --verify                # plus IAM policy-simulator proof for escalation paths
cloud-audit agent-blast --verify         # then: what your agents can reach, simulator-confirmed

Related MCP server: agent-bom

agent-blast: what a hijacked AI agent can reach

An AI agent in AWS is a bundle of IAM identities: the role the agent runs as, the execution roles of the Lambda functions behind its tools, the roles of its knowledge bases, gateways and sandboxes. When the agent is hijacked, the attacker acts with those identities. agent-blast answers what that means, per agent, under two threat models:

Threat model

What the attacker has

What is in reach

Identity takeover

the credentials of a role the agent runs as (sandbox escape, metadata-service read, leaked session)

the full role: privilege-escalation methods, AssumeRole hops, data

Behaviour takeover

nothing but a prompt (indirect prompt injection through a document, a ticket, a web page)

what the agent's tools can do, bounded by the tools' own execution roles

Real output for the sample agent (cloud-audit agent-blast --demo -a support-bot):

support-bot (bedrock_agent, eu-central-1)
├── A hijacked tool (tool: create-ticket) can escalate to account admin via PassRole+Lambda
├── status: PREPARED
├── Identity takeover (attacker holds the role's credentials)
│   └── support-bot-agent-role arn:aws:iam::123456789012:role/support-bot-agent-role
│       └── no escalation path; 3 reach(es) from policy grants, 1 on named resources (see Reach)
│           (risk 0/100, 1 nodes)
├── Behaviour takeover (prompt injection: the agent's tools, their roles)
│   ├── search-docs action_group_lambda -> support-bot-search-role
│   │   ├── 3 OpenAPI path(s) in apiSchema; state ENABLED
│   │   └── no escalation path; 4 reach(es) from policy grants, 4 on named resources (see Reach)
│   ├── create-ticket action_group_lambda -> support-bot-ticket-role
│   │   ├── 2 function(s) in functionSchema; state ENABLED
│   │   ├── reaches Account Takeover in 1 hop(s) via PassRole+Lambda (risk 72/100)
│   │   └── escalation: PassRole+Lambda
│   └── product-docs knowledge_base -> support-bot-kb-role
│       ├── 1 S3 data source(s)
│       └── no escalation path; 2 reach(es) from policy grants, 2 on named resources (see Reach)
├── Reach (13 action/resource pairs)
│   ├── tool: search-docs secretsmanager:GetSecretValue on
│   │   arn:aws:secretsmanager:eu-central-1:123456789012:secret:prod/db-credentials-Ab12Cd
│   │   unverified read secret values
│   ├── tool: create-ticket sts:AssumeRole on arn:aws:iam::123456789012:role/ops-admin unverified
│   │   assume IAM roles
│   ├── tool: create-ticket lambda:InvokeFunction on * unverified invoke Lambda functions
│   ├── tool: search-docs s3:PutObject on arn:aws:s3:::company-backups-2024/* unverified write S3
│   │   objects
│   ├── support-bot-agent-role s3:GetObject on arn:aws:s3:::kb-product-docs/* unverified read the
│   │   agent's knowledge base
│   ├── tool: search-docs s3:GetObject on arn:aws:s3:::company-backups-2024/* unverified read S3
│   │   objects
│   ...
├── Tags
│   ├── OWASP Agentic: ASI02 Tool Misuse and Exploitation, ASI03 Identity and Privilege Abuse,
│   │   ASI05 Unexpected Code Execution
│   └── MITRE ATLAS: AML.T0034 Cost Harvesting, AML.T0040 AI Model Inference API Access, AML.T0053
│       AI Agent Tool Invocation, AML.T0086 Exfiltration via AI Agent Tool Invocation
└── Simulated, not executed: identity policies, the attached permissions boundary and SCPs are
    evaluated by the IAM policy simulator; resource-based policies of the targets, RCPs and VPC
    endpoint policies are not. Tool reach is an upper bound set by the tool's role; what the tool
    code does with its inputs is narrower.

The story the output tells: the support bot itself is harmless, but a document that tricks it into calling create-ticket runs code under a role that can pass an admin role to a new Lambda. The search-docs tool, meant to read product docs, can also read the production database secret and write into the backups bucket. Every line names the identity, the action and the resource, so the fix is a policy statement, not a debate.

The same engine covers AgentCore. For the sample gateway (--demo -a tools-gw) the headline is a cross-agent one:

tools-gw (agentcore_gateway, eu-central-1)
├── tool: crm-sync can write into agent 'support-bot' knowledge base (RAG poisoning): arn:aws:s3:::kb-product-docs/*
├── inbound authorizer: NONE; policy engine: none
...
│   ├── tool: crm-sync s3:PutObject on arn:aws:s3:::kb-product-docs/* unverified write into agent
│   │   'support-bot' knowledge base (RAG poisoning)
...
├── Coverage notes
│   └── tool 'erp-mcp' (gateway_target_mcp_server): backend identity unknown, not assessed - remote
│       MCP server; credential provider: OAUTH

What agent-blast reads (all list/get, no charge):

  • Bedrock Agents: the agent resource role, every action group at the DRAFT version resolved to its Lambda and the Lambda's execution role, knowledge bases resolved to their S3 data-source buckets.

  • AgentCore: runtime role and network mode, gateway role with authorizer, policy engine and every target (Lambda, remote MCP server, API Gateway, OpenAPI, Smithy) with its credential provider, code interpreter and browser execution roles.

  • IAM policies of exactly those identities (inline, attached, group), kept raw: action, resource, effect, whether a Condition is present. Conditions are flagged, never guessed. The simulator decides.

Then, per identity: the 64 privilege-escalation methods, AssumeRole hops through the trust graph, and every data, secret, lateral, code-execution and model-invocation grant matched against concrete resources. A knowledge-base bucket is always a concrete target, even behind s3:* on *, and write access to it is reported as RAG poisoning. Anything the scanner could not read (a denied region, a tool without an IAM identity) is a coverage note, never a silent pass.

--verify asks iam:SimulatePrincipalPolicy about every concrete pair, with the context an attacker really has (no MFA on the session, TLS transport), and marks each reach PROVEN, DENIED (with the policy layer that denied: SCP, permissions boundary) or not asserted. Output formats: tree, json, markdown. The MCP server exposes the same report as get_agent_blast.

A full scan

cloud-audit scan runs 110 read-only checks across 25 AWS services, correlates the findings into attack chains, ranks the fixes by how many chains they break and prices the exposure. This is the sample account (cloud-audit demo), rendered by the same code as a real scan and trimmed for length:

┌─────── Health Score ───────┐
│ 15 / 100                   │
└────────────────────────────┘
  Provider             AWS
  Account              123456789012
  Regions              eu-central-1
  Resources scanned    80
  Checks passed        14
  Checks failed        6
  Attack chains        3
  Risk exposure        $572K - $12.5M  (IBM/Verizon data)
┌───────────────────────── Attack Chains (3 detected) ─────────────────────────┐
│   CRITICAL      PassRole Escalation to Admin (support-bot-ticket-role)       │
│                 Principal 'support-bot-ticket-role' has iam:PassRole and     │
│                 can create resources with privileged roles via:              │
│                 PassRole+Lambda. The attacker passes an admin role to a      │
│                 service, then uses that service to execute code with admin   │
│                 privileges.                                                  │
│                 Fix: Scope iam:PassRole for 'support-bot-ticket-role' to     │
│                 specific role ARNs                                           │
│                 Risk: $250K - $5.0M                                          │
│                                                                              │
│   CRITICAL      Internet-Exposed Admin Instance                              │
│                 i-0abc123def456789, sg-0a1b2c3d4e5f67890                     │
│                 Instance i-0abc123def456789 is reachable from the internet   │
│                 via open security group and has admin IAM role               │
│                 'prod-admin-role'. An attacker can reach the instance,       │
│                 access IMDS credentials, and gain full admin access to the   │
│                 AWS account.                                                 │
│                 Fix: Restrict security group sg-0a1b2c3d4e5f67890 to         │
│                 specific IPs (effort: LOW).                                  │
│                 Risk: $62K - $625K                                           │
│                                                                              │
│   CRITICAL      CI/CD to Admin Takeover                                      │
│                 Role 'github-deploy-role' trusts an OIDC provider without    │
│                 restricting the 'sub' claim AND has admin permissions. Any   │
│                 repository on the CI/CD platform can assume this role and    │
│                 gain full AWS admin access.                                  │
│                 Fix: Add 'sub' condition to the trust policy (effort:        │
│                 LOW).                                                        │
│                 Risk: $125K - $1.2M                                          │
└──────────────────────────────────────────────────────────────────────────────┘
┌────────────── Remediation Plan (fix 3 things, break 3 chains) ───────────────┐
│    #  Fix                             Effort     Chains   Findings  Risk Red │
│    1  Restrict security groups        LOW             1          1  $62.5K - │
│    2  Add OIDC 'sub' condition to     LOW             1          1  $125K -  │
│       trust policies                                                         │
│    3  Remove IAM privilege            MEDIUM          1          1  $250K -  │
│       escalation paths                                                       │
└──────────────────────────────────────────────────────────────────────────────┘
┌─────────────────── Quick Wins (break CRITICAL chains now) ───────────────────┐
│ 1. aws ec2 revoke-security-group-ingress --group-id sg-0a1b2c3d4e5f67890     │
│ --protocol tcp --port 22 --cidr 0.0.0.0/0                                    │
│    Breaks: AC-01 (Internet-Exposed Admin Instance)                           │
│                                                                              │
│ 2. aws iam update-assume-role-policy --role-name github-deploy-role          │
│ --policy-document file://trust-with-sub.json                                 │
│    Breaks: AC-07 (CI/CD to Admin Takeover)                                   │
└──────────────────────────────────────────────────────────────────────────────┘

Preview a fix before touching anything. simulate removes the findings a check would fix and recomputes score, chains and exposure offline:

$ cloud-audit simulate --report demo.json --fix aws-iam-018

Simulation: Apply Remove IAM privilege escalation paths

┌────────────────────────────── Impact Analysis ───────────────────────────────┐
│   Metric                        Before                After          Delta   │
│   Health Score                  15/100               35/100            +20   │
│   Attack Chains                      3                    2             -1   │
│   Findings                           6                    5             -1   │
│   Risk Exposure         $572K - $12.5M      $187.5K - $1.9M           -85%   │
└──────────────────────────────────────────────────────────────────────────────┘

Chains broken (1):
  CRITICAL  PassRole Escalation to Admin (support-bot-ticket-role)  -> GONE

Chains remaining (2):
  CRITICAL  Internet-Exposed Admin Instance
  CRITICAL  CI/CD to Admin Takeover

Next recommended fix: Restrict security groups -> breaks 1 more chain(s)

Walk outward from any resource to see what its compromise reaches:

$ cloud-audit blast-radius --report demo.json --resource arn:aws:iam::123456789012:role/support-bot-ticket-role

┌────────────────────────────────────── Blast Radius ──────────────────────────────────────┐
│ Compromise of role/support-bot-ticket-role leads to Account Takeover via 2 hop(s).       │
│ Resource: arn:aws:iam::123456789012:role/support-bot-ticket-role                         │
│ Reachable: 3 | Paths to impact: 1 | Risk score: 72/100                                   │
└──────────────────────────────────────────────────────────────────────────────────────────┘

role/support-bot-ticket-role - IAM Role (assumed compromised)
├── Account Takeover - Full AWS admin (via grants admin, type=exploit) <high-value>
└── arn:aws:s3:::company-backups-2024 - S3 bucket (reachable via admin) (via s3:GetObject +
    ListBucket, type=data) <high-value>

Available fixes (from scan findings):
  - aws-iam-018 Role 'support-bot-ticket-role' can escalate via PassRole+Lambda (breaks chain, effort=MEDIUM)
  - aws-s3-001 Bucket 'company-backups-2024' has Block Public Access disabled (breaks chain, effort=LOW)

--format json drops straight into the open browser visualizer at blast-audit.haitmg.pl; --format mermaid gives a diagram for a wiki page. exposure ranks every node of the security graph by internet reachability and escalation:

$ cloud-audit exposure --report demo.json -n 6
   Score    Type              Label                       Why
      60    iam_role          prod-admin-role             internet-reachable
      41    internet          Internet                    internet-reachable
      41    ec2               i-0abc123def456789          internet-reachable
      41    security_group    sg-0a1b2c3d4e5f67890        internet-reachable
      20    iam_role          support-bot-ticket-role     escalation
      20    iam_role          support-bot-search-role     linked to others

What's inside

Capability

Size

Command

Configuration checks, each with an AWS CLI and Terraform fix

110 checks, 25 services: IAM, S3, EC2, VPC, RDS, KMS, CloudTrail, CloudWatch, GuardDuty, Config, Lambda, ECS, EFS, SSM, Secrets Manager, DynamoDB, Backup, Inspector, Security Hub, WAF, Bedrock, SageMaker, Bedrock AgentCore, Data Perimeter, account

scan, list-checks

IAM privilege escalation

64 methods in 9 categories: IAM self-mutation, credential access, PassRole to a service, Lambda code modification, trust-policy abuse, permission-boundary bypass, resource-policy abuse, compute hijack, lateral AssumeRole (BFS over the trust graph)

scan (aws-iam-018)

Attack chains

31 rules correlating findings and live relationships (EC2 to role, Lambda to role, OIDC to policy) into paths with MITRE ATT&CK references and a priority fix

scan

Root causes and quick wins

groups findings by the fix that removes them and ranks by chains broken

scan

What-If

before/after score, chains and exposure for any set of checks, offline

simulate --fix

Blast radius

forward BFS from an EC2 instance, IAM role or user, Lambda, S3 bucket or secret; JSON contract for the visualizer

blast-radius

Exposure ranking

every security-graph node scored by internet reachability and escalation

exposure

AI agents

inventory of Bedrock Agents and AgentCore runtimes, gateways, code interpreters, browsers with their IAM identities and tools; two-threat-model reach; OWASP Agentic and MITRE ATLAS tags; simulator proof

agent-blast

Proof Mode

iam:SimulatePrincipalPolicy on escalation paths (broad) and on concrete (principal, action, resource) triples (agent-blast)

scan --verify, agent-blast --verify

Threat feed

10 detectors of active abuse, each tied to a documented 2025-2026 incident pattern, versioned as a rules pack

threat-feed

Data perimeter

5 checks on resource policies: confused deputy and cross-organization exposure, evaluating condition values

scan (aws-dp-*)

AgentCore configuration

6 checks: code interpreter and runtime network mode, MMDSv2, memory KMS, gateway authorizer, gateway policy engine

scan (aws-agc-*)

Breach cost

USD range per finding and per chain with the public source behind each number

scan

Compliance

6 frameworks with per-control evidence: CIS AWS v3.0, SOC 2 Type II, ISO 27001:2022, HIPAA, NIS2, BSI C5:2020

scan --compliance, list-frameworks

Drift and trend

diff two scans with exit codes; posture history with sparklines

diff, trend

Coverage gaps

a read the scanner was denied is reported as "not assessed", never as a pass

every command

Outputs

console, JSON, HTML report, SARIF (GitHub Code Scanning), Markdown

scan --format

MCP server

7 read-only tools for Claude Code, Cursor and any MCP client, including get_agent_blast

cloud-audit-mcp

The ten threat-feed detectors, as cloud-audit threat-feed --list prints them (rules pack 2026-Q2):

Pattern

Severity

What it catches

TF-001

MEDIUM

SES recently verified identity (phishing setup precursor)

TF-002

HIGH

Public Lambda Function URL (AuthType=NONE)

TF-003

CRITICAL

AWS-attached credential quarantine policy

TF-004

CRITICAL

Leaked-credentials scanner user-agent observed in CloudTrail

TF-005

HIGH

Recently-created IAM role with cryptomining-style compute access

TF-006

HIGH

EC2 or AgentCore using IMDSv1 / MMDSv1 (SSRF credential theft vector)

TF-007

MEDIUM

CI/CD role at risk of whoAMI confusion attack

TF-008

HIGH

CloudTrail tampering precursor (logging stopped or delivery failing)

TF-009

HIGH

IAM Roles Anywhere trust anchor with external CA

TF-010

HIGH

AmazonDataZoneFullAccess attached to a non-admin principal

Proof Mode: simulated, not guessed

Static analysis of IAM policies over-reports. Proof Mode asks AWS's own authorization engine, iam:SimulatePrincipalPolicy, which is read-only and carries no per-call charge.

  • scan --verify checks every detected escalation path. verified: true means the simulator allowed every required action; false means it denied one (the path is very likely a false positive); null means not asserted, with the reason in verification_detail.

  • agent-blast --verify checks every concrete (principal, action, resource) reach, supplies the context an attacker with stolen or assumed credentials has, and names the layer that denied.

What the simulator evaluates as of 2026-07-30: identity policies, the attached permissions boundary, the organization's SCPs including their condition keys, and the context keys you supply. What it does not: resource control policies, VPC endpoint policies, role chaining, and resource-based policies for IAM roles. cloud-audit says so on every verified line. A true proves the permission exists. It does not prove an end-to-end attack; nothing is executed.

Reports

cloud-audit scan --format html     -o report.html     # client-ready
cloud-audit scan --format sarif    -o results.sarif   # GitHub Code Scanning
cloud-audit scan --format json     -o report.json     # machine-readable, feeds every offline command
cloud-audit scan --format markdown -o report.md       # PR comments
cloud-audit scan --compliance cis_aws_v3 --format html -o cis.html
cloud-audit agent-blast --format markdown -o agents.md

CI/CD

- run: pip install cloud-audit
- run: cloud-audit scan --format sarif --output results.sarif
- uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: results.sarif

--quiet exits with a code only: 0 clean, 1 findings, 2 error. Gate on severity with --min-severity high. cloud-audit diff old.json new.json --quiet exits 1 on new findings, so a daily scan catches ClickOps drift. The repository is also a composite GitHub Action (gebalamariusz/cloud-audit@v0). Ready-made workflows: basic scan, daily diff, post-deploy.

Installation

pip install cloud-audit                               # pip (recommended)
pipx install cloud-audit                              # isolated
uvx --from cloud-audit cloud-audit scan               # no install
docker run ghcr.io/gebalamariusz/cloud-audit scan     # Docker (also on Docker Hub: haitmg/cloud-audit)

Docker with credentials:

docker run -v ~/.aws:/home/cloudaudit/.aws:ro ghcr.io/gebalamariusz/cloud-audit scan

Python 3.10 to 3.13. Dependencies: boto3, typer, rich, pydantic, jinja2, pyyaml, mcp.

AWS permissions

Read-only. Attach the AWS-managed SecurityAudit policy; it covers every check, the IAM escalation analysis, the agent inventory and Proof Mode:

aws iam attach-role-policy --role-name auditor \
  --policy-arn arn:aws:iam::aws:policy/SecurityAudit

cloud-audit never modifies your infrastructure. simulate, blast-radius, exposure, diff, trend and agent-blast run locally against a saved scan and make no AWS calls; --verify adds simulator calls only. Regions where a service does not exist are skipped; regions where the scanner is denied a read are listed as coverage gaps.

MCP server

Seven read-only tools for AI assistants: scan_aws, get_findings, get_attack_chains, get_remediation, get_health_score, list_checks, get_agent_blast.

claude mcp add cloud-audit -- uvx --from cloud-audit cloud-audit-mcp

Then ask: "scan my AWS account and tell me what my Bedrock agents could reach if hijacked".

cloud-audit scan -R                                      # show remediation inline
cloud-audit scan --profile prod --regions eu-central-1   # profile / region
cloud-audit scan --regions all                           # all enabled regions
cloud-audit scan --role-arn arn:aws:iam::...:role/audit  # cross-account
cloud-audit scan --export-fixes fixes.sh                 # every CLI fix as a script
cloud-audit scan --categories security,cost              # skip reliability/performance checks
cloud-audit agent-blast -a support-bot --profile prod --verify

Defaults live in .cloud-audit.yml (regions, min_severity, exclude_checks, time-boxed suppressions). Environment variables (CLOUD_AUDIT_REGIONS, CLOUD_AUDIT_MIN_SEVERITY, ...) override the file; CLI flags override everything. See the configuration guide.

Documentation

Full documentation at haitmg.pl/cloud-audit: getting started, agent-blast, attack chains, IAM escalation, blast radius, Proof Mode, threat feed, data perimeter, AgentCore, compliance, and the full check reference.

Commercial support

cloud-audit is free and stays free. If you want a human on the findings, the author offers professional services:

  • Scanner output review (free): send your cloud-audit, Prowler or Security Hub output, get a short written review of what actually matters and what to fix first

  • AWS security audit: full account audit with a prioritized report and ready-to-apply fixes

  • AI agent access review: what your Bedrock and AgentCore agents can reach, with the policy changes to narrow it

  • Remediation support: Terraform and IAM changes, verified against your workloads

  • Palo Alto VM-Series on AWS: architecture and security review (GWLB/TGW, HA, routing)

Details: haitmg.pl/cloud-audit-support or email kontakt@haitmg.pl.

Development

git clone https://github.com/gebalamariusz/cloud-audit.git
cd cloud-audit
pip install -e ".[dev]"
pytest -q && ruff check src/ tests/ && mypy src/

See CONTRIBUTING.md to add a check. Releases in CHANGELOG.md.

License

MIT - Mariusz Gebala / HAIT

Available Tools

7 tools
get_agent_blastA

What can a hijacked AI agent reach in this AWS account?

For every Bedrock Agent, AgentCore runtime, gateway or sandbox found by the last scan (or the one matching agent by name, id or ARN substring), returns a Markdown report under two threat models: identity takeover (the attacker holds the agent role's credentials) and behaviour takeover (prompt injection steering the agent's tools, bounded by the tools' execution roles), with data, secret, lateral and code-execution reach and OWASP Agentic / MITRE ATLAS tags. Computed from the saved scan, no AWS calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden, and it does so well: it discloses 'no AWS calls,' 'computed from the saved scan,' the Markdown output format, the two threat models, and the scoping rule by last scan or agent substring. Minor gaps remain around what happens if no saved scan exists or whether the agent parameter filters or overrides, but the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a useful framing question and then a dense, content-rich sentence. Every clause adds diagnostic value: scope, threat models, reach categories, tags, and the no-AWS-calls guarantee. It is slightly long but not padded, and the structure helps an agent parse the tool's purpose quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, return-value details are already covered. The description provides the essential context: source of data, scoping, threat models, output format, and the fact that no AWS calls are made. The only meaningful omission is explicit prerequisite/error behavior when no saved scan exists, but this is adequately implied by 'last scan.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must document the single 'agent' parameter. It does: 'matching ``agent`` by name, id or ARN substring' explains how the value is interpreted, and the overall phrasing implies the default unfiltered case covers all agents found by the last scan. It does not explicitly state empty-string behavior, but it mostly compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: it 'returns a Markdown report' of what a hijacked Bedrock Agent can reach, under two named threat models. It clearly separates itself from scan_aws by stating 'no AWS calls' and from sibling get_* tools by focusing specifically on agent blast radius. An agent can tell exactly what this tool computes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: after a scan exists, when you want agent-centred reach analysis, because it is 'computed from the saved scan' and makes 'no AWS calls.' However, it never names alternatives such as get_attack_chains, get_findings, or get_remediation, nor does it state when not to choose this tool. Context is clear, but exclusions and alternatives are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_attack_chainsA

Get all detected attack chains from the last scan.

Attack chains are correlated findings that form exploitable attack paths. Each chain includes a narrative, priority fix, and breach cost estimate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description bears full burden. It discloses the return contents but does not mention any behavioral traits like temporary exclusivity, authorization requirements, or potential staleness. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no wasted words. Front-loads the core action and then clarifies what attack chains are. Very efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, presence of output schema, and no annotations, the description covers the return value sufficiently. Minor gaps: no mention of ordering, limit, or whether chains from multiple scans are aggregated, but 'from the last scan' provides temporal context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, and schema coverage is 100%. Baseline for zero parameters is 4, and description adds no extra param info, which is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it gets all detected attack chains from the last scan, defines attack chains as correlated findings forming exploitable paths, and distinguishes from siblings like get_findings by specifying the unique content (narrative, priority fix, breach cost estimate).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage after a scan but does not provide explicit guidance on when to use this tool instead of siblings like get_findings or scan_aws. No exclusions or alternatives mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_findingsA

Get findings from the last scan, optionally filtered.

Each finding includes check ID, severity, resource, description, and estimated breach cost.

Args: severity: Filter by severity (critical, high, medium, low) service: Filter by AWS service prefix (e.g. "iam", "s3", "ec2", "vpc") limit: Maximum number of findings to return (default: 20)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
serviceNo
severityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes output fields but does not disclose behavioral traits such as whether results are cached, what happens if no scans exist, or read-only nature. Mutation or destructive potential is not addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description includes a docstring-style Args section which is clear but slightly verbose. It could be more concise by integrating parameter info into a single sentence. Still, it is structured and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is an output schema, the description need not explain return format entirely, but it does list output fields. It lacks details on pagination, error handling, or behavior when filters are omitted. Overall, it is mostly complete for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explains each parameter: severity filter, service filter, and limit with default. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves findings from the last scan with optional filters, and lists specific data fields. This distinguishes it from sibling tools like get_health_score or list_checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating optional filters but provides no explicit guidance on when to use this tool versus alternatives like get_attack_chains or get_remediation. Sibling tools are listed but not compared.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_health_scoreA

Get the current health score and risk exposure summary.

Returns the 0-100 health score, finding counts by severity, attack chain count, and total estimated risk exposure in USD.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description acknowledges it is a read operation returning data, but does not disclose potential side effects or requirements (e.g., authentication, data freshness). It is acceptable for a simple read-only tool but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundant information. Front-loaded with the action, then specifies outputs. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of output schema, the description covers basic purpose and returns. However, it misses context like whether the health score is real-time or cached, or if prior scanning (via 'scan_aws') is necessary. Adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so the description cannot add param info. It does add value by explaining the return structure, which is helpful given an output schema exists, earning a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current health score and risk exposure summary, listing specific outputs (score, finding counts, attack chain count, estimated risk). This distinguishes it from sibling tools that focus on individual components.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus siblings like 'get_findings' or 'get_attack_chains'. It does not mention prerequisites, such as whether a scan is required first, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_remediationA

Get remediation details (CLI command + Terraform code) for a specific check.

Returns copy-paste ready AWS CLI command and Terraform HCL snippet to fix the finding.

Args: check_id: The check ID (e.g. "aws-iam-001", "aws-s3-001", "aws-vpc-002")

ParametersJSON Schema
NameRequiredDescriptionDefault
check_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description details the output format (copy-paste ready CLI and HCL). It does not disclose error handling, authentication needs, or behavior on invalid IDs, but it is adequate for a straightforward read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loads the purpose, and provides examples without superfluous information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists (not shown), the description sufficiently explains what the tool returns. It covers the essential context for a simple retrieval tool, though it could mention the output format types.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds concrete examples for check_id (e.g., 'aws-iam-001'), clarifying the expected format beyond the schema's type definition alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's purpose: retrieving remediation details (CLI command + Terraform code) for a specific check. It distinguishes from sibling tools like list_checks and get_findings by focusing on remediation actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates the tool is used for a specific check ID, providing examples. While it does not explicitly state when not to use it or compare to alternatives, the context is clear for a simple retrieval tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_checksA

List all available security checks (no AWS credentials needed).

Returns check IDs with their categories and services.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states that no AWS credentials are needed (auth requirement) and that the return includes check IDs, categories, and services. This is fairly transparent for a read-only list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no wasted words. The key information is front-loaded, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no annotations, and an output schema (not detailed here but exists), the description is largely complete. It covers purpose, auth requirements, and return content. Could potentially mention that the response is not paginated or that results are static, but these are minor omissions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% coverage, so the description need not add parameter information. Baseline 3 applies, and the description does not add meaningful parameter semantics beyond what the schema shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all available security checks, specifies no AWS credentials are needed, and indicates the return content (check IDs, categories, services). It distinguishes from sibling tools like scan_aws or get_findings by being a simple listing operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for browsing available checks but does not explicitly provide when-to-use or when-not-to-use guidance, nor does it compare with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_awsA

Run an AWS security scan and return a summary.

Scans your AWS account for security misconfigurations, detects attack chains, and estimates breach cost risk.

Args: profile: AWS CLI profile name (default: "default") regions: Comma-separated AWS regions to scan (default: profile region) min_severity: Minimum finding severity: critical, high, medium, low

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNodefault
regionsNo
min_severityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses the scan scope (misconfigurations, attack chains, breach cost) but omits potential side effects, authentication needs, or rate limits. It implies a read-only operation but does not explicitly state it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose and includes an Args section. It is relatively concise, though the Args list could be integrated into a single paragraph to reduce redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists (not shown) and 0 required parameters, the description covers the main purpose well. However, it lacks details on the summary content and how it relates to sibling tools, slightly reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds full meaning: profile as AWS CLI profile, regions as comma-separated, min_severity with value list. This compensates completely for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Run an AWS security scan and return a summary', specifying it scans for misconfigurations, attack chains, and breach cost. This differentiates from siblings like get_findings or get_attack_chains which are more granular.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs siblings. The description implies it's for a broad scan, but does not mention when not to use it or suggest alternatives like get_findings for specific details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev2.5.0
    • Addedget_agent_blast
  2. 6 tool updatesv2.2.1
    • Addedget_attack_chains
    • Addedget_findings
    • Addedget_health_score
    • Addedget_remediation
    • Addedlist_checks
    • Addedscan_aws
  3. 6 tool updatesv2.2.0
    • Removedget_attack_chains
    • Removedget_findings
    • Removedget_health_score
    • Removedget_remediation
    • Removedlist_checks
    • Removedscan_aws
  4. 6 tool updatesv1.0.1
    • First observedget_attack_chains
    • First observedget_findings
    • First observedget_health_score
    • First observedget_remediation
    • First observedlist_checks
    • First observedscan_aws

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clear, distinct role: scanning, listing checks, retrieving findings, health scores, attack chains, remediation, and agent blast radius. No two tools overlap in purpose; even get_health_score and get_findings differ (summary vs. detailed list).

Naming Consistency5/5

All tools follow a consistent verb_noun pattern: scan_aws, list_checks, get_findings, get_health_score, get_attack_chains, get_remediation, get_agent_blast. The verbs (scan, list, get) are used predictably, and the nouns clearly indicate the resource.

Tool Count5/5

Seven tools is ideal for the domain of AWS security scanning: they cover the entire workflow from initiating a scan to viewing results, details, and remediation. Each tool is necessary and there is no bloat.

Completeness4/5

The tool set covers the full lifecycle: scan, list checks, get findings, get health score, get attack chains, get remediation, and even a specialized agent blast tool. The only minor gap is that there is no direct tool to initiate a specific check or re-scan a particular resource, but the existing tools allow agents to achieve the core goals.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A local-first AWS security tool that uses graph theory to discover attack paths (e.g., Internet → Role → DB) and prioritize remediations. It allows agents to perform read-only security audits and generate Terraform fixes without data exfiltration.
    15
    4
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    agent-bom v0.105.0 is an open security scanner and self-hosted control plane for AI, MCP, and cloud infrastructure. The default scan profile in MCP server mode exposes 8 MCP tools. Additional profiles provide inventory, findings, compliance, graph, and runtime workflows.
    8
    445 PyPI
    31
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Security MCP server with 300+ rules for AI-generated code. Scans Next.js, Supabase, Clerk, Stripe, Prisma, Hono, GraphQL and 20+ modules. Zero config, runs locally.
    39
    331 npm
    5
    Apache 2.0