Skip to main content
Glama

For AppSec teams and developers who run Claude Code, Cursor, Codex or any MCP client: see which agents, MCP servers, tools and packages are installed, which are vulnerable, and what each one can reach. Local scans need no account.

Quick start

From the repository you want to inspect, with uv installed:

uvx agent-bom scan . --no-discover -f html -o agent-bom-report.html

Open agent-bom-report.html for inventory, findings and fix guidance. Run the same scan again later and agent-bom prints what changed since the last one. No MCP configuration in the project? Package findings still apply. No project handy? Run uvx agent-bom scan --demo --offline for a bundled sample; Exit 1 is expected there because the sample trips the security gate. A non-zero exit can mean a security gate or incomplete assessment; inspect the report and coverage (exit codes, what a scan does and does not establish, first-run guide).

Related MCP server: agent-audit

From laptop to team to org

Where

Start with

You get

On your laptop

uvx agent-bom scan . · claude mcp add agent-bom -- uvx agent-bom mcp server

Findings with fixes, a delta on every rescan, and agent-bom as a tool inside your coding agent (MCP server, plugins)

In your team

uses: koda-ai-studio/agent-bom@v0 on pull requests and a weekly schedule:

A PR gate with a findings comment and SARIF in code scanning, plus a weekly rescan that catches new CVEs in unchanged code (GitHub Action)

Across your org

agent-bom up locally, then Docker Compose or the Helm chart from oci://ghcr.io/koda-ai-studio/charts/agent-bom

Retained scans, one graph of agents, MCP servers, packages and credentials, SSO and audit, in your own infrastructure (self-host)

Why an AI supply-chain BOM

Agents and MCP servers ship without an inventory. A CVE in an AI package, a poisoned tool description or an over-scoped credential matters by what the agent that loads it can reach. A package SBOM stops at packages; agent-bom records the chain and keeps the evidence for every edge.

1. Inventory

2. Correlate

3. Act

Agents, MCP servers, tools, packages, models, credential references and cloud resources, read-only

One graph: agent → MCP server → tool → package → credential → data, each edge with its source

Fix, gate CI, block poisoned tool calls, rescan to verify

Fictional sample estate. Dashed use, credential and access links are configured or modeled, not observed at runtime; path analysis covers the collected snapshot only. The AWS badge describes environment membership; these sample agents have no recorded execution host or model endpoint. Agent, hosting and model context.

Findings map to OWASP LLM Top 10, OWASP Agentic Top 10, OWASP MCP Top 10, MITRE ATLAS, EU AI Act and NIST AI RMF; control mappings are investigation context, not certification.

What you get

Start with the workflow you need. An individual developer can scan, inspect findings and verify fixes without a shared control plane or a compliance workflow. Teams can add retained scans and shared inventory; organizations can add identity, audit review and governance when needed. These are adoption paths, not separate editions or permissions. See the deployment chooser.

Offering

What it includes

Cost

Start

CLI, CI and exports

Local and CI scans; SARIF, CycloneDX, SPDX, JSON and HTML exports; check pre-install gate; GitHub Action

Free, Apache-2.0; no account

First run

Self-hosted control plane

API and dashboard on Compose or Helm with PostgreSQL, SSO/OIDC, roles, tenant isolation, audit chain, lake evidence import and executive briefs

Free, Apache-2.0; your infrastructure

Self-host · Helm

MCP server and agent plugins

agent-bom mcp server tool profiles; Claude Code and Codex plugins; OpenClaw and Cortex Code skills

Free; runs locally

MCP server · Plugins

Hosted service and support

No managed cloud offering today. Community support on GitHub; security reports follow published response targets, not a contractual SLA

—

Product boundaries · Support model

What it covers

Area

What you get

AI agents and MCP

Agents, MCP servers, tools and credentials from local configs and agent frameworks, linked to what they can reach.

Models and AI platforms

Supported OpenAI, Hugging Face, Ollama, MLflow and W&B assets, with available model provenance beside dependencies and agent context.

Runtime

An MCP proxy and gateway that alert on poisoned tools and injected results, or block them with --injection-mode enforce.

SBOM, AI-BOM and Agent-BOM

Software SBOMs in CycloneDX or SPDX. CycloneDX AI components carry collected model metadata. Native agent-bom JSON connects agents, MCP servers, tools, credential references and packages.

Dependencies

Lockfiles and manifests across Python, JavaScript, Go, Java, .NET, Rust and more, matched against OSV, GitHub advisories and NVD with KEV and EPSS.

Code

Findings imported from any SARIF producer, plus native analysis of AI code (prompt-injection sinks, guardrails, tool exposure) and whether your code reaches the vulnerable function.

Containers and IaC

Images scanned in bounded memory and time; Dockerfile, Terraform, Kubernetes, Helm and compose risks with exact lines in SARIF.

Cloud and data platforms

Read-only collection from AWS, Azure, GCP, Kubernetes, Databricks and Snowflake, with provider-specific posture checks and graph context. Per-lane rule counts are generated from code in the capability matrix.

GPU and AI infrastructure

AI workloads on CoreWeave, Nebius, Lambda, RunPod, Vast.ai and Crusoe; GPU containers and Kubernetes GPU nodes. Collection depth varies by provider.

Generate a BOM from a project, or inspect an agent inventory with sample data:

agent-bom scan --project . -f cyclonedx -o sbom.cdx.json
agent-bom scan --project . -f spdx -o sbom.spdx.json
agent-bom scan --demo --offline -f json -o agent-bom.json

Model metadata appears when the source supplies it. A BOM is an inventory, not proof of safe execution or complete collection.

Area

Integrations

AI clients + IDEs

Claude, Codex, Cursor, GitHub Copilot, Windsurf, Cortex Code, Gemini CLI, JetBrains AI, Junie, Amazon Q, Cline, Roo Code, Continue, Zed, Goose, Snowflake CLI, Docker MCP Toolkit, Tabnine, Sourcegraph Cody, Aider, Void, Aide, Trae, Pieces, OpenClaw, mcp-cli

AI platforms + model hubs

OpenAI, Hugging Face, Ollama, MLflow, W&B, Langfuse, LangSmith

GPU + neo clouds

CoreWeave, Nebius, Lambda, RunPod, Vast.ai, Crusoe, GPU containers + K8s GPU nodes

Hyperscalers + Kubernetes

AWS, Azure, GCP, Kubernetes

Data + vector stores

Snowflake, Databricks, Supabase, Pinecone, Qdrant, Weaviate, Chroma, Milvus

Identity + SaaS + dev

Okta, GitHub Actions, Vercel, Microsoft Entra ID, Jira, ServiceNow, Slack, Jamf

Evidence out

ClickHouse, BigQuery, S3, GCS, Azure Blob, Jira tickets, Slack alerts, Vanta, Drata, OCSF syslog

Product names and logos are trademarks of their owners, used only to identify supported evidence sources. Their use does not imply endorsement or partnership.

Investigate context and exposure

Which agent uses the vulnerable component? What could it reach? What evidence supports that path? Correlate retained scans by exact, tenant-scoped identities and trace the recorded blast radius from each agent through its MCP servers to packages, findings, credentials and data stores. Each relationship keeps its source and evidence kind. Agent kind, platform, execution host and model links are separate facts: an environment badge does not say where an agent runs.

From agent to verified fix: select Document Intake Agent → inspect CVE-2023-4863 (high, KEV-listed) and the evidence on each arrow → take the proposed remediation → rescan the changed pin and compare snapshots. The comparison verifies the changed input, not a running deployment.

Am I affected by a new CVE? Match it against stored scans, including CVEs only NVD has published. You get affected assets with their patch target, possibly affected distro packages to verify, and the blast radius (walkthrough):

agent-bom db update                                   # refresh OSV, NVD, KEV and EPSS
agent-bom db advisory affected CVE-2026-109618        # most recent saved scan
agent-bom db advisory affected CVE-2026-109618 --report <scan-report.json> --format json   # a JSON report written by an earlier scan

From an MCP client, the read-only affected_assets tool (graph and full profiles) takes the same advisory_id. In CI, run uvx agent-bom db update before the GitHub Action step (its auto-update-db default only refreshes feeds older than seven days). To explain a finding to your team, create an impact brief with affected assets, source receipts, evidence gaps and the next action.

One package, three parsed inputs. A repository pin, an image SBOM and a modeled Kubernetes workload resolve to one pillow@9.0.0. The image inventory and the deployment occurrence stay separate nodes; the advisory receipt is open.

Real parsers, modeled infrastructure; a graph path does not prove exploitation.

Repository. Source imports, deployment configuration and CI traced to a published container and its vulnerable packages:

Cloud. A public API gateway into a vulnerable workload, its role and a PII bucket:

Context, correlation and reachability · Run the reference lab · Reproduce these screenshots

Open the sample graph

Try the demo in your browser: a read-only copy of the UI on labelled sample data, with no install and no backend. Scans, settings and sign-in are turned off there. To open the same graph locally:

pip install 'agent-bom[ui]==0.113.0'
agent-bom quickstart --run --offline

Run the server command it prints, then open its graph URL. Offline quickstart skips package-CVE lookup, so zero CVEs is not a clean verdict; use the bundled demo for advisory-backed findings or populate the advisory database.

Self-host in your environment

Your infrastructure, identity, database, and audit boundary. Start a local pilot from a published release checkout:

git clone --depth 1 --branch v0.113.0 https://github.com/koda-ai-studio/agent-bom.git && cd agent-bom
AGENT_BOM_IMAGE_TAG=0.113.0 docker compose up -d

Open http://localhost:3000, then Connections or New Scan. The pilot binds to loopback and retains state in a Docker volume. For cloud accounts, add a scoped read-only connection, verify access, then start a scan. Before sharing access, move to the authenticated deployment.

  • Scan with CLI or CI; export findings, SBOMs and reports.

  • Centralize inventory, graph evidence, remediation and compliance in your own control plane.

  • Enforce policy on selected live MCP tool calls through the proxy or gateway.

Deployment

First step

Result and next step

CLI or CI job

agent-bom scan --demo --offline -o report.json

Labelled sample findings in JSON; scan your own inventory or configure a CI gate.

Local API and dashboard

agent-bom quickstart --run --offline

Sample report and persisted graph; run the printed loopback server command and open its graph URL.

Docker Compose pilot

Release checkout and docker compose up -d above

Loopback API/UI with retained state; connect a read-only source and run a scan.

Authenticated single host

Platform Compose setup

Login-gated API/UI and PostgreSQL; configure TLS, identity, secrets and backups before sharing access.

Kubernetes / EKS

Helm deployment

Control plane in your cluster; provision role-separated secrets and storage, then validate authentication and health.

Modes can be combined:

Mode

What it does

Start

Scan

Collect inventory and findings on demand or in CI; retain reports and graph evidence.

First run

Fleet inventory

Endpoints or collectors sync inventory to the control plane; review last-seen evidence.

Fleet sync

MCP server

agent-bom mcp server exposes security tools to an MCP client.

Tool profiles

Runtime proxy

Wrap selected local stdio MCP servers to inspect tool calls; verify decisions in the audit trail.

Proxy setup

Runtime gateway

Relay selected remote MCP traffic through a shared service; validate client auth, policy and upstream connectivity.

Gateway setup

  • Sources describes recorded evidence: local scans, fleet inventory, cluster scans, CI/CD, imported evidence, or mixed sources. It does not select a deployment type or enable runtime enforcement. Demo data marks labelled sample inventory.

  • Assets are inventoried resources; Findings are detections on those resources; Issues group related findings for investigation or remediation.

  • Affected assets counts distinct resources only when that count is available. One finding may belong to several security areas, so area counts must not be summed. Repeated observations across scans are shown separately.

Preview and community deployment paths have separate support boundaries.

Docker pilot guide · Compose with PostgreSQL · Choose a deployment · Enterprise controls · Connect cloud accounts

Integrations

In Claude Code:

/plugin marketplace add koda-ai-studio/agent-bom
/plugin install agent-bom@agent-bom

In Codex, run codex plugin marketplace add koda-ai-studio/agent-bom, then install agent-bom-local from the Plugins Directory. Both plugins run the pinned agent-bom release locally and send nothing to an agent-bom service.

Ask

Skill

"Is this project safe to ship?"

checkup: one verdict and the three fixes that matter most

"Am I affected by CVE-2025-29927?"

affected: affected or not found in what was scanned, never "safe"

"What have my agents been doing?"

activity: MCP usage, unused servers, risky commands from local session history

"Are my agent settings too permissive?"

audit-mcp and audit-skills

"Give me an AI-BOM"

bom: CycloneDX or SPDX for this machine, a project, an image or a cloud account

Add /plugin install agent-bom-guard@agent-bom to block malicious and typosquatted package installs before Claude runs them. All skills and their permissions · Guard details

Use CLI or GitHub Action, REST API, or MCP; export SARIF, CycloneDX, SPDX, JSON and HTML. Cloud connectors and fleet sync collect inventory; proxy and gateway deployments add runtime evidence.

For other MCP clients, run agent-bom mcp server. Start with eight focused tools in the default profile. Choose an MCP profile for graph, cloud, runtime or audit work. Try three investigations: affected agents, exposure receipts and a before/after scan comparison. Import existing scanner reports without replacing their source evidence.

Check a dependency before installing it with uvx agent-bom check requests@2.33.0 --ecosystem pypi. Add pre-commit and CI setup for repeated checks.

Proxy, gateway and fleet · Integration capability matrix · MCP client setup · Smithery setup and manifest

Trust and evidence

Discovery uses read-only access by default. Explicit disk side-scans create temporary cloud resources. Missing evidence stays unavailable or partial; control mappings are not audit certification.

Persisted runtime, proxy and gateway activity retains source receipts and bounded time windows in the graph. Exact inventory references can bind records; unresolved identities and collection gaps remain explicit. Recorded activity does not prove execution or grant access. See the runtime evidence boundaries.

MITRE technique associations provide investigation context, not proof of an attack. ATLAS mapping receipts retain the weakness association and source catalog hashes; modeled graph paths do not establish observed execution or effective access.

Measured matcher proof · Product boundaries · Permissions · Threat model · Release verification · Graph data model

Contributing and support

Open in GitHub Codespaces

Start with the first PR guide or a good first issue. Ask in GitHub Discussions (or Discord), share feedback, or follow the maintainer path (review owners).

Contributing · Capabilities and roadmap · Support · Report an inaccurate finding · Apache-2.0

Source version: v0.113.1 · Latest release: v0.113.0 · Changelog

Available Tools

8 tools
checkPackage CVE CheckA
Read-onlyIdempotent
Inspect

Check a specific package for known CVEs before installing.

    Queries OSV.dev for vulnerabilities in the given package. Use this
    before installing an MCP server or dependency to verify it is safe.

    Args:
        package: Package name with optional version, e.g. "express@4.18.2",
                 "@modelcontextprotocol/server-filesystem@2025.1.14",
                 or just "requests" (resolves @latest).
        ecosystem: Package ecosystem — "npm", "pypi", "go", "cargo",
                   "maven", "nuget", "rubygems", "composer", "swift",
                   "pub", "hex", "conda", "deb", "apk", or "rpm".
                   Defaults to "npm".

    Returns:
        JSON with package, version, ecosystem, vulnerability count,
        and vulnerability details (id, severity, cvss, fix version, summary).
    
NameRequiredDescriptionDefault
offlineNoUse only the local advisory database. An explicit version is required; registry resolution and publication checks are disabled.
packageYesPackage name with optional version, e.g. 'express@4.18.2', '@modelcontextprotocol/server-filesystem@2025.1.14', or 'requests' (resolves @latest).
versionNoOptional package version when omitted from ``package`` (e.g. package='flask', version='0.12.2'). Prefer embedding in ``package`` as 'flask@0.12.2' or 'flask==0.12.2' when possible.
ecosystemNoPackage ecosystem: 'npm', 'pypi', 'go', 'cargo', 'maven', 'nuget', 'rubygems', 'composer', 'swift', 'pub', 'hex', 'conda', 'deb', 'apk', or 'rpm'.npm

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the safety profile is covered structurally. The description adds genuine value by disclosing the external dependency on OSV.dev (an outbound network query) and documenting the JSON return shape. No contradiction with annotations.

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 key purpose is front-loaded in the first line, followed by a tight context sentence and structured Args/Returns blocks. It earns its length with the OSV.dev source note, usage guidance, and return-format disclosure, with no filler.

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 rich annotations, an output schema, and 100% parameter coverage, the description covers what matters beyond structure: external data source, when to invoke, and expected return fields. The only minor gap is that the offline/version parameters are not surfaced in the description text, though the schema fully documents them.

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?

Schema description coverage is 100%, so all four parameters are already documented structurally and the baseline is 3. The description reinforces package/ecosystem with concrete examples but omits the offline and version parameters entirely from its Args section. It adds convenience, not new meaning, on top of the 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 opens with a precise 'Check a specific package for known CVEs before installing' — a specific verb, resource, and scoping constraint. It clearly separates this single-package advisory check from broad siblings like scan or registry_lookup by framing it as a targeted, pre-installation safety verification.

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?

'Use this before installing an MCP server or dependency to verify it is safe' gives an explicit trigger condition and intended moment of use. However, it does not name any alternative tools or state when NOT to use it, leaving an agent to infer the boundary against scan/policy_check/marketplace_check on its own.

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

complianceCompliance PostureA
Read-onlyIdempotent
Inspect

Return compliance posture with its source: the tenant's persisted evidence, or a labelled local scan.

    With completed scans in the control plane, ``summary`` is exactly
    ``/v1/compliance/summary``; ``framework`` adds ``/v1/compliance/{framework}``
    and ``control`` pages the driving finding ids from
    ``/v1/findings?framework=&control=``. Otherwise (or with
    source='local_scan') it scans local MCP configurations and labels that scope.
    
NameRequiredDescriptionDefault
imageNoLocal scan only: Docker image to scan, e.g. 'nginx:1.25'.
limitNoDriving finding ids per page.
cursorNodriving_findings.next_cursor from the previous page.
sourceNoauto: persisted tenant evidence when it exists, else a labelled local scan. persisted / local_scan force one.auto
controlNoPersisted only: page the finding ids driving this control.
frameworkNoPersisted only: add one framework's controls, e.g. 'soc2'.
tenant_idNoTenant scope for persisted compliance. Defaults to 'default'.default
config_pathNoLocal scan only: MCP client config directory. Auto-discovers if omitted.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the safe read-only, idempotent, open-world profile, so the description is not carrying the safety burden. It adds real behavioural context beyond that: the auto/persisted/local_scan resolution rule, that local results are labelled by scope, and that framework/control only apply to the persisted path.

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 first sentence is well front-loaded, but the rest is dense with internal REST paths such as ``/v1/compliance/summary`` and ``/v1/findings?framework=&control=`` that an agent does not need in order to choose or call the tool. It also refers to ``summary``, which is not a parameter name, creating ambiguity about whether these are inputs or output fields.

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?

With an output schema present, the description need not explain return values, and coverage for the 8 parameters is complete. The mode-selection logic is explained well; only the absence of sibling routing guidance and the missing mention of a local-scan cost/side-effect profile keep it short of full completeness.

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 100%, so a 3 is the baseline, but the description goes further by tying parameters together (framework adds one framework's controls, control pages the finding ids driving it, cursor derives from driving_findings.next_cursor) and by restricting framework/control to persisted mode. That is meaningfully more than the per-parameter schema text.

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

Purpose4/5

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

States a specific verb+resource: return compliance posture, and explicitly names the two modes (persisted tenant evidence vs. a labelled local scan). This differentiates it reasonably from scan/check siblings, though it never names those siblings directly to say which to prefer.

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?

Gives clear conditional guidance: with completed scans in the control plane the result comes from persisted evidence, otherwise (or when source='local_scan') it falls back to scanning local MCP configurations. It lacks any exclusion against the sibling tools (check, scan, policy_check), which is the main gap.

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

exposure_pathsExposure PathsA
Read-onlyIdempotent
Inspect

Return the attack-path queue in the dashboard's order, with why each path ranks where it does.

    Ranking is ``ranking.order`` (evidence tier, KEV, severity, evidence confidence,
    composite risk, credential count); every path carries ``rank``, ``evidenceTier``,
    ``isKev``, ``severity``, ``evidenceConfidence`` and ``rankingFactors``. Totals,
    filters and cursor pages match ``/v1/graph/attack-paths``. With ``result_id`` the
    paths are that session scan result's, unfiltered and labelled ``session_scan_result``.
    
NameRequiredDescriptionDefault
kevNoOnly paths through a known-exploited finding (true) or none (false).
viewNosummary (default): rank, risk, KEV, evidence tier, endpoints, finding/credential ids. full adds hops, relationships, nodes and edges.summary
limitNoMaximum ranked exposure paths to return.
cursorNopagination.next_cursor; keep the filters unchanged.
node_idNoAny graph node the path passes through.
scan_idNoOptional historical scan ID. Omit for the current tenant estate.
min_riskNoMinimum composite path risk (0-100).
result_idNoresult_id from a scan response in this session. Answers from that scan result instead of the persisted estate graph; omitted, the caller's newest scan result is consulted first.
target_idNoOnly paths ending at this graph node id.
tenant_idNoTenant scope. Defaults to 'default'.default
finding_idNoCVE, advisory or finding node id on the path.
source_typeNoEntrypoint entity type, e.g. 'agent'.
min_severityNoWorst on-path finding at least this severe.
credential_idNoCredential name or node id exposed on the path.
has_credentialNoOnly paths that do (true) or do not (false) expose a credential.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), so the description correctly spends its budget elsewhere: it discloses that cursor pages must keep filters unchanged and, importantly, that result_id answers are unfiltered and labelled 'session_scan_result' – a genuine gotcha the schema alone does not convey. It does not mention pagination limits beyond the schema or any rate/latency behavior, so not a 5.

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?

Front-loaded with the core behavior, then ranking order, then the result_id exception. Dense but every clause carries information; the backticked field-name list is slightly noisy but ties the prose to actual response keys.

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?

For a 15-parameter, fully documented read tool with an output schema, the description covers purpose, ordering, pagination, and the one mode switch that changes filtering semantics. Return shapes needn't be explained since an output schema exists. Missing only sibling routing guidance.

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?

Schema description coverage is 100% across all 15 parameters, so the baseline is 3 and the schema already carries per-filter meaning. The description adds only marginal semantics beyond it – chiefly that result_id bypasses the filters entirely, which the schema's wording does not make explicit.

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

Purpose4/5

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

States a specific verb+resource ('Return the attack-path queue') plus the non-obvious ordering guarantee (dashboard order, ranking.order composition). An agent knows exactly what it gets back. It does not explicitly distinguish itself from siblings like scan or intel_lookup, which is the only thing keeping it off a 5.

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?

Usage is implied rather than stated: the description explains what the queue is and the result_id override, but never says when to prefer this tool over scan/intel_lookup/remediate, nor when not to call it. The result_id note is the closest thing to a usage rule (use it for a session's in-flight scan result instead of the persisted estate graph).

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

generate_sbomGenerate SBOMA
Read-onlyIdempotent
Inspect

Generate a Software Bill of Materials (SBOM) for your AI agent setup.

    Discovers AI agents and MCP servers, extracts all package dependencies,
    and generates a standards-compliant SBOM.

    Args:
        format: SBOM format — "cyclonedx" (CycloneDX 1.7) or "spdx" (SPDX 3.0).
        config_path: Path to a specific MCP config directory.
                     If not provided, auto-discovers all local agent configs.

    Returns:
        JSON string containing the SBOM in the requested format.
    
NameRequiredDescriptionDefault
formatNoSBOM format: 'cyclonedx' (CycloneDX 1.7) or 'spdx' (SPDX 3.0).cyclonedx
config_pathNoPath to MCP client config directory. Auto-discovers all if omitted.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint, idempotentHint, and destructiveHint=false. The description adds that the tool discovers agents and servers, extracts dependencies, and generates a standards-compliant SBOM, which is consistent with read-only behavior.

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-loaded with the purpose, and uses a clear structure with bullet points for arguments and return. Every sentence contributes meaning.

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

Completeness5/5

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

Given the presence of an output schema (mentioned in signals) and two optional parameters, the description provides complete context: what the tool does, how parameters work, and the return format. No gaps.

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 100% for both parameters. The description adds value by specifying the exact format values ('cyclonedx' and 'spdx') and clarifying config_path auto-discovery behavior, which goes beyond the 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 generates a Software Bill of Materials (SBOM) for AI agent setups, with specific details on discovering agents, MCP servers, and extracting dependencies. It distinguishes itself from sibling tools like 'scan' or 'inventory' by focusing on SBOM generation.

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 explicitly states when to use the tool (to generate an SBOM) and explains config_path auto-discovery. However, it does not mention when not to use it or compare to alternatives among siblings.

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

intel_lookupThreat Intel Advisory LookupA
Read-onlyIdempotent
Inspect

Look up one advisory from the local threat-intel database.

NameRequiredDescriptionDefault
advisory_idYesCVE, GHSA, or OSV advisory ID, e.g. CVE-2024-1234 or GHSA-abcd-1234-wxyz.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description adds 'local threat-intel database' context, indicating no external fetch. No contradiction. However, it doesn't detail behavior on missing IDs or performance considerations.

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?

Single, well-structured sentence that is front-loaded and free of redundancy. Every word earns its place.

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 simplicity (1 param, output schema exists, annotations rich), the description is nearly complete. Minor gap: no mention of error handling or edge cases like invalid IDs, but output schema likely covers return structure.

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?

Schema coverage is 100%, and the schema's parameter description already provides detailed format guidance (e.g., 'CVE-2024-1234 or GHSA-abcd-1234-wxyz'). The tool description adds no new parameter-level information beyond 'one advisory,' so baseline 3 is appropriate.

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 'Look up one advisory from the local threat-intel database.' It specifies a specific verb (look up) and resource (advisory from a local database), distinguishing it from siblings like intel_match which likely handle multiple matches.

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 when a specific advisory ID is known, but lacks explicit guidance on when to use this tool versus alternatives like intel_match or intel_sources. No mention of when not to use or prerequisites.

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

policy_checkPolicy EvaluationA
Read-onlyIdempotent
Inspect

Evaluate a security policy against current scan results.

    Runs a scan, then evaluates the provided policy rules against the
    findings. Policies can gate on severity thresholds, CISA KEV status,
    AI risk flags, credential exposure, and denied packages.

    Args:
        policy_json: JSON string containing policy rules. Example:
            {"rules": [{"id": "no-critical", "severity_gte": "critical",
            "action": "fail"}, {"id": "no-kev", "kev": true, "action": "fail"}]}

    Returns:
        JSON with passed (bool), violations list, failure_count, and
        warning_count.
    
NameRequiredDescriptionDefault
policy_jsonYesJSON string containing policy rules, e.g. {"rules": [{"id": "no-critical", "severity_gte": "critical", "action": "fail"}]}.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations indicate read-only, non-destructive, and idempotent behavior. The description adds that it runs a scan and evaluates rules, and specifies the return structure (passed, violations, etc.), which is beyond annotation coverage.

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 is well-structured with summary, details, and return info, but is slightly verbose. Could be more concise while retaining key information.

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 single parameter and existence of output schema, the description covers the essential behavior and expected output. However, it lacks details on error handling or edge cases (e.g., invalid policy_json).

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?

With 100% schema coverage, the description still adds value by providing an illustrative example of the policy_json format and listing supported rule types (severity, KEV, etc.), enhancing understanding beyond the schema description.

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 it evaluates a security policy against current scan results, with a specific verb and resource. It distinguishes from sibling tools like 'compliance' or 'code_scan' by focusing on custom policy rules.

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 explains the tool's purpose but lacks explicit guidance on when to use it versus alternatives like 'check' or 'should_i_deploy'. It provides context on policy components but no when-not statements.

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

remediateRemediation PlanA
Read-onlyIdempotent
Inspect

Generate a remediation plan for vulnerabilities in your AI agent setup.

    Scans for vulnerabilities, then generates actionable fix commands for
    each affected package (npm install, pip install), credential scope
    reduction guidance, and reports on unfixable vulnerabilities.

    Args:
        config_path: Path to a specific MCP config directory.
                     If not provided, auto-discovers all local agent configs.
        image: Docker image reference to scan (e.g. "nginx:1.25").

    Returns:
        JSON with package_fixes (upgrade commands by ecosystem),
        credential_fixes (scope reduction steps), and unfixable items.
    
NameRequiredDescriptionDefault
imageNoDocker image to scan, e.g. 'nginx:1.25'.
config_pathNoPath to MCP client config directory. Auto-discovers all if omitted.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

The description fully discloses behavior: scanning for vulnerabilities, generating fix commands (npm install, pip install), credential scope reduction guidance, and reporting unfixable items. Annotations (readOnlyHint=true) align with generating instructions without executing them.

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 well-structured with clear sections (purpose, scanning, arguments, returns). It is slightly lengthy but each sentence provides relevant information.

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

Completeness5/5

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

Given the tool's complexity, the description covers all necessary aspects: scanning, fix generation, optional parameters, and return structure. Together with the input and output schema, the description is fully complete.

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?

Schema coverage is 100%, and the description adds minimal value beyond the schema. It clarifies behavior for config_path (auto-discovers if omitted) and image, but this is largely repetitive.

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's purpose: generating remediation plans for vulnerabilities in AI agent setups. It specifies scanning for vulnerabilities and producing fix commands, distinguishing it from sibling tools that focus on scanning alone.

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 provides clear context on when to use the tool (after vulnerabilities are found) and describes the optional parameters (config_path, image). However, it does not explicitly mention when not to use or compare to alternative tools.

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

scanSecurity ScanA
Read-onlyIdempotent
Inspect

Run a full AI supply chain security scan and return an AI-BOM.

Point it at a target with one of: • project_path — a local project / repo directory ("scan this repo"; must be inside home or AGENT_BOM_MCP_WORKSPACE_ROOTS) • repo_url — a public git repo URL (cloned + scanned, no checkout) • config_path — a local MCP-config directory • image — a Docker image • sbom_path — an existing CycloneDX/SPDX SBOM • package — a single package or MCP launch command (pair it with ecosystem when the spec names no launcher) With none of these, it auto-discovers local MCP clients (Claude Desktop, Cursor, Windsurf, VS Code Copilot, OpenClaw, etc.).

It extracts package dependencies, looks up CVEs (online via OSV.dev and advisory sources unless offline mode is requested or configured), assesses config security (credential exposure, tool access), computes blast radius, and returns structured results. Scanning is fully static and read-only — repository and image contents are parsed, never executed.

Returns: JSON. By default a bounded summary: counts (packages, agents, findings by severity/category), top findings, affected paths, and a result_id. Page any full-fidelity section with scan(result_id=..., section='findings', offset=0, limit=25). An incomplete scan (e.g. vulnerability source unavailable) is returned as an error result whose body is still JSON.

NameRequiredDescriptionDefault
imageNoDocker image to scan (e.g. 'nginx:1.25', 'ghcr.io/org/app:v1').
limitNoMaximum items per page of `section` (1-200).
detailNoJSON output only. 'summary' (default): counts, top findings, affected paths, and a result_id for paged follow-ups. 'full': the whole AI-BOM document, shortened structurally (still valid JSON, with _truncation metadata) if it exceeds the response budget.summary
enrichNoEnable NVD CVSS, EPSS probability, and CISA KEV enrichment.
offsetNoZero-based item offset into `section`.
policyNoPolicy object to evaluate alongside scan results, e.g. {"rules": [{"id": "no-critical", "severity_gte": "critical", "action": "fail"}]}.
offlineNotrue: use the local vulnerability DB only and skip registry, OSV, GHSA, and NVIDIA network lookups (requires a populated DB from `agent-bom db update`). false: query those sources online. Omitted: online unless the server operator set AGENT_BOM_OFFLINE or AGENT_BOM_VULN_DB_OFFLINE.
packageNoDirect package or MCP launch command to scan, e.g. 'npx @modelcontextprotocol/server-filesystem@2025.1.14' or '@modelcontextprotocol/server-filesystem'. A bare 'name@version' spec is assumed to be npm — pass ``ecosystem`` for anything else.
sectionNoSection of a stored result to page, e.g. 'findings', 'blast_radius', 'packages', 'exposure_paths'.
repo_urlNoPublic git repository URL to clone and scan, e.g. 'https://github.com/org/repo'. Maps the repo's dependencies, project structure, secrets, IaC, and AI/MCP usage into an AI-BOM. Static and read-only: the repository is shallow-cloned into a temporary directory, scanned without ever executing its code, then deleted. The fastest way to point this tool at a target — no local checkout required.
ecosystemNoEcosystem of ``package`` when the spec does not name a launcher: 'npm', 'pypi', 'go', 'cargo', 'maven', 'nuget', 'rubygems', 'composer', 'swift', 'pub', 'hex', 'conda', 'deb', 'apk', or 'rpm'. Omitted, the ecosystem is inferred from the spec (PEP 440 specifiers such as 'flask==0.12.2' are PyPI) and any assumption is reported in the result warnings.
result_idNoresult_id from a previous scan response. With it, no new scan runs: returns that result's summary, or one page of `section`.
sbom_pathNoPath to existing CycloneDX or SPDX JSON SBOM file to ingest.
scorecardNoEnrich packages with OpenSSF Scorecard scores (requires resolvable GitHub repos).
db_sourcesNoComma-separated DB sources to sync before scanning (e.g. 'nvd,ghsa,osv,epss,kev').
transitiveNoResolve transitive dependencies for npx/uvx packages.
config_pathNoLocal directory to scan — a project root or an MCP client config directory. Auto-discovers installed MCP clients if omitted unless no_discover=true. Same sandbox as project_path. Mutually exclusive with project_path and repo_url.
no_discoverNoDisable ambient host MCP-client discovery. Explicit repo/config, image, SBOM, and package targets are still scanned; use this for deterministic CI.
project_pathNoLocal project / repository directory to scan, e.g. the agent's current workspace checkout. Scans dependency manifests and lockfiles, project MCP configs, source AI usage, secrets (values redacted), IaC, and GitHub Actions, statically and read-only. Must resolve (symlinks followed) to an existing directory inside the user's home or a root listed in AGENT_BOM_MCP_WORKSPACE_ROOTS; traversal, symlink escapes, files, and missing paths are refused with AGENTBOM_MCP_VALIDATION_INVALID_PATH. Mutually exclusive with config_path and repo_url.
fail_severityNoReturn failure status if vulns at this severity or higher: critical, high, medium, low.
output_formatNoOutput format: 'json' (default), 'sarif', 'cyclonedx', 'spdx', 'junit', 'csv', or 'markdown'.json
warn_severityNoReturn warning status (gate_status=warn, exit 0) when vulns at this severity or higher exist. Use with fail_severity for two-tier CI gates, e.g. warn_severity='medium', fail_severity='critical'.
auto_update_dbNoExplicitly refresh the local vuln DB when older than the daily freshness target before scanning.
verify_integrityNoVerify package SHA-256/SRI hashes and SLSA provenance against registries.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

Despite annotations already declaring readOnly/idempotent/non-destructive, the description adds real behavioral context: static parsing with no code execution for repos and images, online OSV/registry lookups unless offline mode is requested or operator-configured, and the fact that an incomplete scan still returns JSON in an error result. It also notes secret values are redacted on output.

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?

Front-loaded with the action, then a bulleted target menu, then mechanics, then returns — a good structure for a 24-parameter tool. The Returns block partially restates the `detail`/`section` schema descriptions, which is mild redundancy but useful orientation before an agent opens the schema.

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

Completeness5/5

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

For a very high-complexity tool the description covers the selection decision, execution model, network/offline behavior, error semantics, and the summary-vs-paged result workflow. With an output schema present and full parameter descriptions, nothing an agent needs in order to call it correctly is missing.

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 100%, so baseline is 3; the description earns extra by organizing the target parameters into a mutually-exclusive selection menu, spelling out the project_path sandbox rule (home or AGENT_BOM_MCP_WORKSPACE_ROOTS) and the ecosystem inference default. Dozens of secondary parameters (enrich, scorecard, verify_integrity, output_format) are only covered by the schema.

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

Purpose4/5

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

Opens with a specific verb and resource ('Run a full AI supply chain security scan and return an AI-BOM') and enumerates the six target types it accepts, so an agent knows exactly what it does. It never contrasts itself with nearby siblings such as generate_sbom, check, or exposure_paths, so the boundary with those tools is left implicit.

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?

Gives clear invocation context: pick one target (with examples of the phrasing a user would use), and if none is given it falls back to ambient MCP-client discovery. It also explains the result_id paging path. It stops short of stating when to prefer a sibling tool over this one, which is the only missing piece.

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 updatev1.0.15
    • Changedexposure_paths1 field changed
      • addedInput schema / properties / result_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 128,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "result_id from a scan response in this session. Answers from that scan result instead of the persisted estate graph; omitted, the caller's newest scan result is consulted first.",
        +  "title": "Result Id"
        +}
  2. 1 tool updatev1.0.14
    • Changedscan2 fields changed
      • changedInput schema / properties / config_path / description
        Previous value: -"Local directory to scan — a project root or an MCP client config directory. Auto-discovers installed MCP clients if omitted unless no_discover=true. Mutually exclusive with repo_url."New value: +"Local directory to scan — a project root or an MCP client config directory. Auto-discovers installed MCP clients if omitted unless no_discover=true. Same sandbox as project_path. Mutually exclusive with project_path and repo_url."
      • addedInput schema / properties / project_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Local project / repository directory to scan, e.g. the agent's current workspace checkout. Scans dependency manifests and lockfiles, project MCP configs, source AI usage, secrets (values redacted), IaC, and GitHub Actions, statically and read-only. Must resolve (symlinks followed) to an existing directory inside the user's home or a root listed in AGENT_BOM_MCP_WORKSPACE_ROOTS; traversal, symlink escapes, files, and missing paths are refused with AGENTBOM_MCP_VALIDATION_INVALID_PATH. Mutually exclusive with config_path and repo_url.",
        +  "title": "Project Path"
        +}
  3. 2 tool updatesv1.0.12
    • Changedcompliance8 fields changed
      • changedInput schema / properties / config_path / description
        Previous value: -"Path to MCP client config directory. Auto-discovers all if omitted."New value: +"Local scan only: MCP client config directory. Auto-discovers if omitted."
      • addedInput schema / properties / control
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 64,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Persisted only: page the finding ids driving this control.",
        +  "title": "Control"
        +}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 512,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "driving_findings.next_cursor from the previous page.",
        +  "title": "Cursor"
        +}
      • addedInput schema / properties / framework
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 64,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Persisted only: add one framework's controls, e.g. 'soc2'.",
        +  "title": "Framework"
        +}
      • changedInput schema / properties / image / description
        Previous value: -"Docker image to scan, e.g. 'nginx:1.25'."New value: +"Local scan only: Docker image to scan, e.g. 'nginx:1.25'."
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Driving finding ids per page.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "default": "auto",
        +  "description": "auto: persisted tenant evidence when it exists, else a labelled local scan. persisted / local_scan force one.",
        +  "enum": [
        +    "auto",
        +    "persisted",
        +    "local_scan"
        +  ],
        +  "title": "Source",
        +  "type": "string"
        +}
      • addedInput schema / properties / tenant_id
        Added value: +{
        +  "default": "default",
        +  "description": "Tenant scope for persisted compliance. Defaults to 'default'.",
        +  "title": "Tenant Id",
        +  "type": "string"
        +}
    • Changedexposure_paths13 fields changed
      • addedInput schema / properties / credential_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 512,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Credential name or node id exposed on the path.",
        +  "title": "Credential Id"
        +}
      • changedInput schema / properties / cursor / description
        Previous value: -"Continue with pagination.next_cursor; keep the risk filter unchanged."New value: +"pagination.next_cursor; keep the filters unchanged."
      • addedInput schema / properties / finding_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 512,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "CVE, advisory or finding node id on the path.",
        +  "title": "Finding Id"
        +}
      • addedInput schema / properties / has_credential
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only paths that do (true) or do not (false) expose a credential.",
        +  "title": "Has Credential"
        +}
      • addedInput schema / properties / kev
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only paths through a known-exploited finding (true) or none (false).",
        +  "title": "Kev"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of ranked exposure paths to return."New value: +"Maximum ranked exposure paths to return."
      • changedInput schema / properties / min_risk / description
        Previous value: -"Minimum path risk score to include."New value: +"Minimum composite path risk (0-100)."
      • addedInput schema / properties / min_severity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "critical",
        +        "high",
        +        "medium",
        +        "low"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Worst on-path finding at least this severe.",
        +  "title": "Min Severity"
        +}
      • addedInput schema / properties / node_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 512,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Any graph node the path passes through.",
        +  "title": "Node Id"
        +}
      • addedInput schema / properties / source_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 64,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Entrypoint entity type, e.g. 'agent'.",
        +  "title": "Source Type"
        +}
      • addedInput schema / properties / target_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 512,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only paths ending at this graph node id.",
        +  "title": "Target Id"
        +}
      • changedInput schema / properties / tenant_id / description
        Previous value: -"Tenant ID for the graph snapshot. Defaults to 'default'."New value: +"Tenant scope. Defaults to 'default'."
      • addedInput schema / properties / view
        Added value: +{
        +  "default": "summary",
        +  "description": "summary (default): rank, risk, KEV, evidence tier, endpoints, finding/credential ids. full adds hops, relationships, nodes and edges.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "title": "View",
        +  "type": "string"
        +}
  4. 1 tool updatev1.0.11
    • Changedexposure_paths1 field changed
      • changedInput schema / properties / scan_id / description
        Previous value: -"Optional graph scan ID. Omit to use the latest snapshot."New value: +"Optional historical scan ID. Omit for the current tenant estate."
  5. 1 tool updatev1.0.10
    • Changedscan9 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "description": "JSON output only. 'summary' (default): counts, top findings, affected paths, and a result_id for paged follow-ups. 'full': the whole AI-BOM document, shortened structurally (still valid JSON, with _truncation metadata) if it exceeds the response budget.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "title": "Detail",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 25,
        +  "description": "Maximum items per page of `section` (1-200).",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offline / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / offline / default
        Previous value: -trueNew value: +null
      • changedInput schema / properties / offline / description
        Previous value: -"Use the local vulnerability DB only and skip registry, OSV, GHSA, and NVIDIA network lookups."New value: +"true: use the local vulnerability DB only and skip registry, OSV, GHSA, and NVIDIA network lookups (requires a populated DB from `agent-bom db update`). false: query those sources online. Omitted: online unless the server operator set AGENT_BOM_OFFLINE or AGENT_BOM_VULN_DB_OFFLINE."
      • removedInput schema / properties / offline / type
        Removed value: -"boolean"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based item offset into `section`.",
        +  "minimum": 0,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedInput schema / properties / result_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "result_id from a previous scan response. With it, no new scan runs: returns that result's summary, or one page of `section`.",
        +  "title": "Result Id"
        +}
      • addedInput schema / properties / section
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Section of a stored result to page, e.g. 'findings', 'blast_radius', 'packages', 'exposure_paths'.",
        +  "title": "Section"
        +}
  6. 1 tool update
    • Changedexposure_paths1 field changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 4096,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Continue with pagination.next_cursor; keep the risk filter unchanged.",
        +  "title": "Cursor"
        +}
  7. 78 tool updatesv1.0.5
    • Removedaccess_review
    • Removedai_inventory_scan
    • Removedaisvs_benchmark
    • Removedanalytics_query
    • Removedanomaly_scan
    • Removedapprove_exception
    • Removedaudit_integrity
    • Removedaudit_query
    • Removedblast_radius
    • Removedbrowser_extension_scan
    • Removedcis_benchmark
    • Removedcloud_inventory
    • Removedcloud_side_scan
    • Removedcode_scan
    • Removedcontext_graph
    • Removedcost_allocation
    • Removedcost_forecast
    • Removedcost_report
    • Removedcreate_ticket
    • Removedcredential_expiry
    • Removeddataset_card_scan
    • Removeddiff
    • Removeddrift_incidents
    • Removedfindings_triage
    • Removedfirewall_check
    • Removedfleet_scan
    • Removedgateway_status
    • Removedgpu_infra_scan
    • Removedgraph_correlate
    • Removedgraph_correlation_status
    • Removedgraph_export
    • Removedidentity_grant_jit
    • Removedidentity_issue
    • Removedidentity_revoke
    • Removedidentity_revoke_jit
    • Removedidentity_rotate
    • Removedingest_external_scan
    • Removedintel_daily_brief
    • Removedintel_match
    • Removedintel_sources
    • Removedinventory
    • Removedinventory_asset
    • Removedinventory_list
    • Removedinventory_summary
    • Removedkspm_cluster_posture
    • Removedlicense_compliance_scan
    • Removedlist_exceptions
    • Removedmarketplace_check
    • Removedmodel_file_scan
    • Removedmodel_provenance_scan
    • Removednhi_discover
    • Removedprompt_scan
    • Removedproxy_alerts
    • Removedproxy_status
    • Removedregistry_lookup
    • Removedregistry_sweep_scan
    • Removedrequest_exception
    • Removedrisk_campaign_workflow
    • Removedruntime_blueprint_drift
    • Removedruntime_blueprints
    • Removedruntime_correlate
    • Removedruntime_evidence_ingest
    • Removedruntime_production_index
    • Removedshield_break_glass
    • Removedshield_start
    • Removedshield_status
    • Removedshield_unblock
    • Removedshould_i_deploy
    • Removedskill_scan
    • Removedskill_trust
    • Removedskill_verify
    • Removedsync_ticket_status
    • Removedtool_risk_assessment
    • Removedtraining_pipeline_scan
    • Removedvector_db_scan
    • Removedverify
    • Removedwhere
    • Removedyoucom_search
  8. 1 tool updatev0.103.2
    • Changedruntime_evidence_ingest3 fields changed
      • removedInput schema / properties / operator_role
        Removed value: -{
        -  "default": "viewer",
        -  "description": "Operator role for this write action. Must be admin.",
        -  "title": "Operator Role",
        -  "type": "string"
        -}
      • removedInput schema / properties / operator_scopes
        Removed value: -{
        -  "default": "",
        -  "description": "Comma-separated operator scopes. Must include findings:write.",
        -  "title": "Operator Scopes",
        -  "type": "string"
        -}
      • removedInput schema / properties / reason
        Removed value: -{
        -  "default": "",
        -  "description": "Human audit reason for ingesting runtime evidence.",
        -  "title": "Reason",
        -  "type": "string"
        -}
  9. 5 tool updates
    • Addedgraph_correlate
    • Addedgraph_correlation_status
    • Changedinventory_list1 field changed
      • addedInput schema / properties / severity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Filter by the asset's highest directly linked finding severity.",
        +  "title": "Severity"
        +}
    • Changedruntime_evidence_ingest3 fields changed
      • addedInput schema / properties / operator_role
        Added value: +{
        +  "default": "viewer",
        +  "description": "Operator role for this write action. Must be admin.",
        +  "title": "Operator Role",
        +  "type": "string"
        +}
      • addedInput schema / properties / operator_scopes
        Added value: +{
        +  "default": "",
        +  "description": "Comma-separated operator scopes. Must include findings:write.",
        +  "title": "Operator Scopes",
        +  "type": "string"
        +}
      • addedInput schema / properties / reason
        Added value: +{
        +  "default": "",
        +  "description": "Human audit reason for ingesting runtime evidence.",
        +  "title": "Reason",
        +  "type": "string"
        +}
    • Changedtool_risk_assessment3 fields changed
      • addedInput schema / properties / allow_command_execution
        Added value: +{
        +  "default": false,
        +  "description": "Explicitly allow launching unblocked stdio server commands. False only connects to HTTP/SSE servers.",
        +  "title": "Allow Command Execution",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / timeout / maximum
        Added value: +60
      • addedInput schema / properties / timeout / minimum
        Added value: +0.1
  10. 6 tool updatesv0.102.0
    • Addedapprove_exception
    • Changedcheck1 field changed
      • addedInput schema / properties / offline
        Added value: +{
        +  "default": false,
        +  "description": "Use only the local advisory database. An explicit version is required; registry resolution and publication checks are disabled.",
        +  "title": "Offline",
        +  "type": "boolean"
        +}
    • Changedgateway_status4 fields changed
      • addedInput schema / properties / activity_cursor
        Added value: +{
        +  "default": "",
        +  "description": "Opaque cursor from a prior gateway_status activity response.",
        +  "title": "Activity Cursor",
        +  "type": "string"
        +}
      • addedInput schema / properties / activity_limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum activity events to return when include_activity is true.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "title": "Activity Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / include_activity
        Added value: +{
        +  "default": false,
        +  "description": "Include the durable, cursor-paged gateway activity feed.",
        +  "title": "Include Activity",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_self_posture
        Added value: +{
        +  "default": false,
        +  "description": "Include this deployment's tenant-scoped operator self-posture evidence.",
        +  "title": "Include Self Posture",
        +  "type": "boolean"
        +}
    • Addedlist_exceptions
    • Addedrequest_exception
    • Changedscan2 fields changed
      • changedInput schema / properties / config_path / description
        Previous value: -"Local directory to scan — a project root or an MCP client config directory. Auto-discovers all installed MCP clients if omitted. Mutually exclusive with repo_url."New value: +"Local directory to scan — a project root or an MCP client config directory. Auto-discovers installed MCP clients if omitted unless no_discover=true. Mutually exclusive with repo_url."
      • addedInput schema / properties / no_discover
        Added value: +{
        +  "default": false,
        +  "description": "Disable ambient host MCP-client discovery. Explicit repo/config, image, SBOM, and package targets are still scanned; use this for deterministic CI.",
        +  "title": "No Discover",
        +  "type": "boolean"
        +}
  11. 6 tool updatesv0.101.0
    • Changedblast_radius2 fields changed
      • addedInput schema / properties / scan_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional persisted scan scope.",
        +  "title": "Scan Id"
        +}
      • addedInput schema / properties / tenant_id
        Added value: +{
        +  "default": "default",
        +  "description": "Tenant scope for persisted findings. Defaults to 'default'.",
        +  "title": "Tenant Id",
        +  "type": "string"
        +}
    • Changedcis_benchmark1 field changed
      • changedInput schema / properties / region / description
        Previous value: -"AWS region (only for provider=aws). Defaults to us-east-1."New value: +"Optional AWS region scope. Omit to evaluate CIS across all enabled AWS regions."
    • Addedcloud_side_scan
    • Addedfindings_triage
    • Addedrisk_campaign_workflow
    • Addedyoucom_search
  12. 1 tool updatev0.99.0
    • Changedscan2 fields changed
      • addedInput schema / properties / ecosystem
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Ecosystem of ``package`` when the spec does not name a launcher: 'npm', 'pypi', 'go', 'cargo', 'maven', 'nuget', 'rubygems', 'composer', 'swift', 'pub', 'hex', 'conda', 'deb', 'apk', or 'rpm'. Omitted, the ecosystem is inferred from the spec (PEP 440 specifiers such as 'flask==0.12.2' are PyPI) and any assumption is reported in the result warnings.",
        +  "title": "Ecosystem"
        +}
      • changedInput schema / properties / package / description
        Previous value: -"Direct package or MCP launch command to scan, e.g. 'npx @modelcontextprotocol/server-filesystem@2025.1.14' or '@modelcontextprotocol/server-filesystem'."New value: +"Direct package or MCP launch command to scan, e.g. 'npx @modelcontextprotocol/server-filesystem@2025.1.14' or '@modelcontextprotocol/server-filesystem'. A bare 'name@version' spec is assumed to be npm — pass ``ecosystem`` for anything else."

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

Most tools target clearly distinct outputs: scan (full assessment), check (single package CVE lookup), compliance, policy_check, remediate, exposure_paths, intel_lookup. The main confusion is between scan and generate_sbom, since scan already returns an 'AI-BOM' and affected paths while generate_sbom returns a standards-compliant SBOM, plus mild overlap between check (OSV package CVEs) and intel_lookup (local advisories). Descriptions help but an agent could easily pick the wrong one for a 'give me an SBOM' request.

Naming Consistency3/5

Names are all snake_case (one word or two), so character style is uniform, but the verb/noun convention is mixed: bare verbs (scan, check, remediate), noun phrases (exposure_paths, compliance), and odd compounds (intel_lookup, policy_check). Readable in aggregate but not a predictable verb_noun pattern.

Tool Count4/5

Eight tools is a sensible scope for a supply-chain security server. Several tools (scan, remediation, policy_check, compliance, generate_sbom) internally re-run the same scan, so there is a bit of functional redundancy, but none feels wholly unjustified.

Completeness4/5

Covers discovery/scanning, package CVE check, SBOM export, compliance, attack-path ranking, policy gating, and remediation — a strong lifecycle. Gaps remain: no scan history/session listing, no diff/compare between scans, no finding suppression/waiver or credential inventory tool, and result paging is only reachable through scan.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A security scanner that evaluates installed MCP servers for vulnerabilities by aggregating findings from 16 scanning engines into detailed trust scores. It enables users to scan their local AI agent configurations or specific repository URLs for potential security risks.
    4
    21 PyPI
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Security scanner for MCP servers. Detects prompt injection, command injection, auth bypass, and excessive permissions across tools, resources, and prompts.
    19 npm
    3
    MIT