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.4"  # 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.4
        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 }}
          # or any OpenAI-compatible provider:
          # SKILLGUARD_LLM_API_KEY: ${{ secrets.SKILLGUARD_LLM_API_KEY }}
          # SKILLGUARD_LLM_BASE_URL: https://api.groq.com/openai/v1

      - name: Upload SARIF
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: skillguard.sarif

The action outputs skillguard.sarif at the workspace root, compatible with GitHub Code Scanning. use-llm: "true" installs the ai extra and enables LLM review; 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.4

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.4
File Size Uploaded
skillguard_core-0.1.4.tar.gz 128.1 kB Details

Built distribution (wheel)

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

Total release size: 151.1 kB

Release files / skillguard_core-0.1.4.tar.gz

Download URL skillguard_core-0.1.4.tar.gz
Size 128.1 kB
Tags Source
SHA-256 checksum
How to use checksums
672b5f702288df654775148ed3f296e2d8261125fe0ff85574aa45dd29a08892
BLAKE2b-256 checksum
How to use checksums
48b0fb553cb7c68a1bd2f7df4e7e82f8e4373c1ff91472e58417d54b4b6b6514
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.4-py3-none-any.whl

Download URL skillguard_core-0.1.4-py3-none-any.whl
Size 23.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dce1ffa3a6cf5aad80b47be64f74b201f2cdd0fef684b4eaf20e7057eddd25d5
BLAKE2b-256 checksum
How to use checksums
60a64f2221d00ac1b4b7d5756f427629c3c92edf1d0e8e1ab73ec63a1c992c73
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

0.1.5

2 release files

This release

0.1.4 This release

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