Skip to main content

skillguard-core

Security scanner for AI agent skills. Wraps NVIDIA SkillSpector and Cisco skill-scanner, fuses their findings into a verdict, and reports via JSON, SARIF, or CI exit codes. Apache-2.0.

Part of SkillGuard — continuous trust for AI agent skills. Hosted drift monitoring and CI policy live at skillguard.dev.

How it works

The scanner follows a deterministic pipeline — no agent framework on the hot path:

fetch → engines → fuse → (optional: semantic review) → report
  1. Ingest (ingest/fetcher.py) — Fetches a skill from a local directory, Git URL, or zip URL. A directory of skills (subdirs with SKILL.md) is scanned in batch with a progress bar.

  2. Engines (engines/) — Runs two open-source scanners as subprocesses:

    • NVIDIA SkillSpector — Heuristic+LLM-aware static analysis
    • Cisco skill-scanner — Policy-based static analysis
    • Runners are injectable — unit tests work without real binaries.
  3. Fusion (engines/fusion.py) — Conservative scoring: takes the max of the engine's risk score and individual finding severities. Verdicts: safe (<30), caution (30–69), dangerous (≥70). Partial engine failures are surfaced but don't block the verdict.

  4. Semantic review (semantic/reviewer.py) — Optional Deep Agents pass triggered on caution and dangerous verdicts (not safe). Supports Anthropic natively or any OpenAI-compatible provider via LLM_API_KEY + LLM_BASE_URL.

  5. Report — The ScanReport dataclass (pipeline/scan.py) is storage-agnostic: no database, no persistence — the private repo plugs in a store.

Install

# Scanner engines (required)
uv tool install git+https://github.com/NVIDIA/skillspector.git
uv tool install git+https://github.com/cisco-ai-defense/skill-scanner.git

# CLI
pipx install skillguard-core                          # from PyPI (once published)
pipx install "git+https://github.com/AI-Provenance/skillguard-core.git@v0.1.5"  # from git

For LLM review, install with the ai extra:

pipx install "skillguard-core[ai]"

Usage

# Single skill
skillguard scan ./my-skill                 # human output
skillguard scan ./my-skill --json          # machine output
skillguard scan ./my-skill --sarif         # SARIF 2.1.0

# Directory of skills (batch)
skillguard scan ./skills                   # progress bar + summary
skillguard scan ./skills -v                # verbose: stream results as they complete
skillguard scan ./skills -w 8              # 8 parallel workers (default: CPU count)

# LLM review (second opinion on caution/dangerous verdicts)
skillguard scan ./my-skill --use-llm       # needs ANTHROPIC_API_KEY or LLM_API_KEY+LLM_BASE_URL

Exit codes: 0 safe · 1 caution · 2 dangerous · 3 inconclusive/error.

LLM Provider Setup

Anthropic (native structured output):

export SKILLGUARD_ANTHROPIC_API_KEY=sk-ant-...
export SKILLGUARD_SEMANTIC_MODEL=claude-sonnet-4-5  # default

Any OpenAI-compatible provider (Ollama, vLLM, Groq, DeepSeek, etc.):

export SKILLGUARD_LLM_API_KEY=sk-...
export SKILLGUARD_LLM_BASE_URL=https://api.groq.com/openai/v1
export SKILLGUARD_SEMANTIC_MODEL=llama-3.3-70b

GitHub Action

name: Scan skills
on: [push, pull_request]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install scanner engines
        run: |
          pipx install git+https://github.com/NVIDIA/skillspector.git
          pipx install git+https://github.com/cisco-ai-defense/skill-scanner.git

      - uses: AI-Provenance/skillguard-core@v0.1.5
        with:
          path: skills/
          fail-on: dangerous    # or "caution" to fail on any warning
          workers: "8"           # parallel workers (default: CPU count)
          use-llm: "true"        # optional: LLM review of caution/dangerous verdicts
        env:
          # Bring your own key — never pass secrets as `with:` inputs.
          # Anthropic:
          SKILLGUARD_ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          # Model used for LLM review — always match it to your provider
          # (the Anthropic default is claude-sonnet-4-5):
          SKILLGUARD_SEMANTIC_MODEL: claude-sonnet-4-5
          # or any OpenAI-compatible provider:
          # SKILLGUARD_LLM_API_KEY: ${{ secrets.SKILLGUARD_LLM_API_KEY }}
          # SKILLGUARD_LLM_BASE_URL: https://api.groq.com/openai/v1
          # SKILLGUARD_SEMANTIC_MODEL: llama-3.3-70b

      # Uploads the SARIF to GitHub Code Scanning. The action itself only
      # stores skillguard.sarif as a workflow artifact for download/debug.
      - name: Upload SARIF
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: skillguard.sarif

The action stores skillguard.sarif at the workspace root as a workflow artifact (for download/debug). The separate codeql-action/upload-sarif step above is what actually feeds results into GitHub Code Scanning. use-llm: "true" installs the ai extra and enables LLM review; SKILLGUARD_SEMANTIC_MODEL must match your provider — without a key in the environment the scan still runs with the deterministic engines only.

Development

uv venv && source .venv/bin/activate
uv pip install -e ".[ai,dev]"
pytest -v                 # unit tests (no scanner binaries required)
pytest -m integration -v  # requires real scanner binaries

Metadata

Release files for skillguard-core 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for skillguard-core 0.1.5
File Size Uploaded
skillguard_core-0.1.5.tar.gz 128.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for skillguard-core 0.1.5
File Interpreter ABI Platform
skillguard_core-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 151.6 kB

Release files / skillguard_core-0.1.5.tar.gz

Download URL skillguard_core-0.1.5.tar.gz
Size 128.5 kB
Tags Source
SHA-256 checksum
How to use checksums
cd6fa4fe2fb7a6b902c64dcb43c25855e4ab76237ba09f1584e2cf0c4ab14e9a
BLAKE2b-256 checksum
How to use checksums
b05e6715fe90db0ecbd9a5019806a877b0196bf2dd25702782179c72e25253ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / skillguard_core-0.1.5-py3-none-any.whl

Download URL skillguard_core-0.1.5-py3-none-any.whl
Size 23.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
80f4b8c1292d1c0a855e0db3046de6128cc62597235e245c018bb5c3fbff983f
BLAKE2b-256 checksum
How to use checksums
99090232eefc666f36fe62148c98e86f5677bf694c7da436bc4453a6d53c1222
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page