Skip to main content
Glama

Security Scan

scan
Read-onlyIdempotent

Run a full AI supply chain security audit to return an AI-BOM, detecting package dependencies, CVEs, and config risks without executing code.

Instructions

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

    Point it at a target with one of:
      • repo_url     — a public git repo URL (cloned + scanned, no checkout)
      • config_path  — a local project / 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

TableJSON 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. Mutually exclusive with 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.
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

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +}
  2. 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"
      +}
  3. 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."
  4. 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"
      +}
  5. Addedv0.88.4
  6. Removedv0.88.1
  7. Addedv0.87.1
  8. Removedv0.87.0
  9. 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."
  10. Changed1 schema field changedv0.85.0
    • addedInput schema / additionalProperties
      Added value: +false
  11. Addedv0.84.5

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that the scan is fully static — repo/image contents are 'parsed, never executed', shallow-cloned to a temp dir then deleted — whether network lookups happen (OSV/GHSA/NVD unless offline), and that an incomplete scan is returned as an error result whose body is still JSON. These are exactly the operational traits annotations cannot express.

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 action, then a scannable bullet list of targets, then behavior, then returns. It is somewhat long, but nearly every sentence carries distinct information; only the returns paragraph slightly overlaps with what the output schema already provides.

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?

Complete for a 23-parameter tool with an output schema: it explains target selection, discovery fallback, network/offline posture, mutation-free execution, gating semantics via fail/warn severity, and the summary-vs-paged-full result model. Nothing an agent needs to choose arguments or interpret a response 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 the baseline is 3, but the description adds cross-parameter semantics: the mutually exclusive repo_url/config_path relationship, the package+ecosystem pairing, the auto-discovery default when no target is given, and how result_id/section/offset/limit compose into paging. That linkage is meaningfully more than the per-parameter 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 and resource — 'Run a full AI supply chain security scan and return an AI-BOM' — and enumerates the five target modes it accepts. It never names a sibling (e.g. generate_sbom or policy_check), so an agent must infer differentiation from the target list alone rather than being routed explicitly.

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 concrete when-to-use guidance via the bulleted target list, notes the mutually exclusive relationship with config_path, and explains the no-target auto-discovery fallback. It also documents the paged follow-up pattern (result_id + section). It stops short of exclusions against sibling tools, so it lands at 4 rather than 5.

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