Skip to main content
Glama

Security Scan

scan
Read-onlyIdempotent

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

Instructions

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.

Input Schema

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

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.0.14
    • 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"
      +}
  2. Changed9 schema fields changedv1.0.10
    • 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"
      +}
  3. Changed2 schema fields changedv0.102.0
    • 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"
      +}
  4. Changed2 schema fields changedv0.99.0
    • 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."
  5. Changed2 schema fields changedv0.89.2
    • changedInput schema / properties / config_path / description
      Previous value: -"Path to MCP client config directory. Auto-discovers all if omitted."New 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."
    • addedInput schema / properties / repo_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Public 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.",
      +  "title": "Repo Url"
      +}
  6. Addedv0.88.4
  7. Removedv0.88.1
  8. Addedv0.87.1
  9. Removedv0.87.0
  10. Changed1 schema field changedv0.86.5
    • changedInput schema / properties / auto_update_db / description
      Previous value: -"Explicitly refresh the local vuln DB if stale (>7 days) before scanning."New value: +"Explicitly refresh the local vuln DB when older than the daily freshness target before scanning."
  11. Changed1 schema field changedv0.85.0
    • addedInput schema / additionalProperties
      Added value: +false
  12. Addedv0.84.5

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.