SkillSpector

June 24, 2026 · View on GitHub

Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, and security risks before installing agent skills.

Python 3.12+ License: Apache 2.0

Overview

AI agent skills (used by Claude Code, Codex CLI, Gemini CLI, etc.) execute with implicit trust and minimal vetting. Research shows that 26.1% of skills contain vulnerabilities and 5.2% show likely malicious intent.

SkillSpector helps you answer: "Is this skill safe to install?"

Documentation

  • Development guide — Architecture, package layout, and how to extend the analyzer pipeline.
  • Pi extension — Install SkillSpector as a Pi tool for scanning skills from inside agent sessions.

Features

  • Multi-format input: Scan Git repos, URLs, zip files, directories, or single files
  • 68 vulnerability patterns across 17 categories: prompt injection, data exfiltration, privilege escalation, supply chain, excessive agency, output handling, system prompt leakage, memory poisoning, tool misuse, rogue agent, anti-refusal, trigger abuse, dangerous code (AST), taint tracking, YARA signatures, MCP least privilege, and MCP tool poisoning
  • Two-stage analysis: Fast static analysis + optional LLM semantic evaluation
  • Live vulnerability lookups: SC4 queries OSV.dev for real-time CVE data with automatic offline fallback
  • Multiple output formats: Terminal, JSON, Markdown, and SARIF reports
  • Risk scoring: 0-100 score with severity labels and clear recommendations
  • Baseline / false-positive suppression: Accept known findings via a glob-rule or fingerprint baseline so re-scans surface only new issues (docs)

Quick Start

Installation

Create and activate a virtual environment first (all make targets assume the venv is active). Use uv or pip; the Makefile uses uv if available, otherwise pip.

Quick install with uv (no clone required):

uv tool install git+https://github.com/NVIDIA/skillspector.git
# Update later: uv tool update skillspector

From source:

# Clone the repository
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector

# Create and activate virtual environment
uv venv .venv && source .venv/bin/activate
# or: python3 -m venv .venv && source .venv/bin/activate

# Install for production use
make install

# Or install with development dependencies
make install-dev

Docker (no Python required)

Run SkillSpector without installing Python by building it locally from the included Dockerfile. The image is based on the Docker Official Python 3.12-slim-bookworm image.

Build the image:

make docker-build
# or: docker build -t skillspector .

Scan a local directory by mounting your current directory into /scan, the container's working directory:

docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm

Scan with LLM analysis by passing credentials with a local .env file:

cat > .env <<'EOF'
SKILLSPECTOR_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
EOF
docker run --rm \
  -v "$PWD:/scan" \
  --env-file .env \
  skillspector scan ./my-skill/

Or pass credentials directly from your shell environment:

docker run --rm \
  -v "$PWD:/scan" \
  -e SKILLSPECTOR_PROVIDER=anthropic \
  -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
  skillspector scan ./my-skill/

Write a report to the host filesystem by writing to the mounted directory:

docker run --rm \
  -v "$PWD:/scan" \
  skillspector scan ./my-skill/ --no-llm --format json --output report.json

Optional alias for repeated static scans:

alias skillspector-docker='docker run --rm -v "$PWD:/scan" skillspector'
skillspector-docker scan ./my-skill/ --no-llm

Basic Usage

# Scan a local skill directory
skillspector scan ./my-skill/

# Scan a single SKILL.md file
skillspector scan ./SKILL.md

# Scan a Git repository
skillspector scan https://github.com/user/my-skill

# Scan a zip file
skillspector scan ./my-skill.zip

Output Formats

# Terminal output (default) - pretty formatted
skillspector scan ./my-skill/

# JSON output - machine readable
skillspector scan ./my-skill/ --format json --output report.json

# Markdown output - for documentation
skillspector scan ./my-skill/ --format markdown --output report.md

# SARIF output - for CI/CD integration and IDE tooling
skillspector scan ./my-skill/ --format sarif --output report.sarif

Suppressing False Positives (baseline)

Suppress known/accepted findings so the risk score reflects only un-triaged issues and re-scans surface only new findings. See the suppression guide for the full reference.

# Accept all current findings into a baseline (run once), then commit it.
skillspector baseline ./my-skill/ -o .skillspector-baseline.yaml

# Scan against the baseline — only NEW findings are reported and scored.
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml

# Review what was suppressed (still excluded from the score).
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml --show-suppressed

A baseline can also use drift-tolerant glob rules (by rule id, file path, or message) — see .skillspector-baseline.example.yaml.

LLM Analysis

For the best results, configure an OpenAI-compatible LLM endpoint for semantic analysis. Pick a provider with SKILLSPECTOR_PROVIDER; each ships its own bundled default model. SkillSpector also works against local OpenAI-compatible servers (Ollama, vLLM, llama.cpp) and managed inference gateways.

Provider (SKILLSPECTOR_PROVIDER)Credential env varEndpointDefault model
openaiOPENAI_API_KEY (+ optional OPENAI_BASE_URL)api.openai.com (or any OpenAI-compatible URL)gpt-5.4
anthropicANTHROPIC_API_KEYapi.anthropic.comclaude-opus-4-6
anthropic_proxyANTHROPIC_PROXY_API_KEY + ANTHROPIC_PROXY_ENDPOINT_URLAny Vertex-style raw-predict proxyclaude-sonnet-4-6
nv_buildNVIDIA_INFERENCE_KEYbuild.nvidia.comdeepseek-ai/deepseek-v4-flash
# Stock OpenAI
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=sk-...
skillspector scan ./my-skill/

# Anthropic
export SKILLSPECTOR_PROVIDER=anthropic
export ANTHROPIC_API_KEY=sk-ant-...
skillspector scan ./my-skill/

# Anthropic via Vertex-style proxy (corporate gateways, GCP Vertex AI)
export SKILLSPECTOR_PROVIDER=anthropic_proxy
export ANTHROPIC_PROXY_ENDPOINT_URL=https://my-gateway.example.com/models/claude-sonnet-4-6:streamRawPredict
export ANTHROPIC_PROXY_API_KEY=your-bearer-token
export SKILLSPECTOR_MODEL=claude-sonnet-4-6
skillspector scan ./my-skill/

# NVIDIA build.nvidia.com
export SKILLSPECTOR_PROVIDER=nv_build
export NVIDIA_INFERENCE_KEY=nvapi-...
skillspector scan ./my-skill/

# Local Ollama or any OpenAI-compatible endpoint
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=ollama
export OPENAI_BASE_URL=http://localhost:11434/v1
export SKILLSPECTOR_MODEL=llama3.1:8b
skillspector scan ./my-skill/

# Override the provider's default model
export SKILLSPECTOR_MODEL=gpt-5.2
skillspector scan ./my-skill/

# Skip LLM analysis (faster, static analysis only)
skillspector scan ./my-skill/ --no-llm

MCP Server

Run SkillSpector as a Model Context Protocol server so any MCP-capable agent (Claude Code, Codex CLI, Gemini CLI) or remote runtime can call scanning as a tool and gate skill/MCP installs on the result — turning SkillSpector into a runtime guardrail instead of an out-of-band audit step.

# Install the optional MCP dependency
pip install "skillspector[mcp]"

# stdio transport — for local CLI agents
skillspector mcp

# streamable HTTP/SSE transport — for remote / A2A callers
skillspector mcp --transport http --host 127.0.0.1 --port 8000

The server exposes a single tool:

  • scan_skill(target, use_llm=true, output_format="json") — scans a Git URL, file URL, .zip, .md file, or directory and returns a structured verdict: risk_score (0-100), severity, recommendation, safe_to_install, and findings. It also reports llm_used / scan_mode so a low score from a static-only scan is never mistaken for a clean full scan.

Register it with Claude Code via:

claude mcp add skillspector -- skillspector mcp

Vulnerability Patterns

SkillSpector detects 68 vulnerability patterns across 17 categories:

Prompt Injection (5 patterns)

IDPatternSeverityDescription
P1Instruction OverrideHIGHCommands to ignore safety constraints
P2Hidden InstructionsHIGHMalicious directives in comments/invisible text
P3Exfiltration CommandsHIGHInstructions to transmit context externally
P4Behavior ManipulationMEDIUMSubtle instructions altering agent decisions
P5Harmful ContentCRITICALInstructions that could cause physical harm

Anti-Refusal (3 patterns)

IDPatternSeverityDescription
AR1Refusal SuppressionHIGHInstructions to never refuse or always comply (e.g. "never refuse", "always comply")
AR2Disclaimer SuppressionHIGHInstructions to omit warnings, disclaimers, or ethical commentary (e.g. "no disclaimers", "do not moralize")
AR3Safety Policy NullificationHIGHJailbreak framing that nullifies guardrails (e.g. "you have no restrictions", "ignore your guidelines", "do anything now")

Data Exfiltration (4 patterns)

IDPatternSeverityDescription
E1External TransmissionMEDIUMSending data to external URLs
E2Env Variable HarvestingHIGHCollecting API keys and secrets
E3File System EnumerationMEDIUMScanning directories for sensitive files
E4Context LeakageHIGHTransmitting conversation context externally

Privilege Escalation (3 patterns)

IDPatternSeverityDescription
PE1Excessive PermissionsLOWRequesting access beyond stated functionality
PE2Sudo/Root ExecutionMEDIUMInvoking elevated system privileges
PE3Credential AccessHIGHReading SSH keys, tokens, passwords

Supply Chain (6 patterns)

IDPatternSeverityDescription
SC1Unpinned DependenciesLOWNo version constraints on packages
SC2External Script FetchingHIGHcurl | bash and remote code execution
SC3Obfuscated CodeHIGHBase64/hex encoded execution
SC4Known Vulnerable DependenciesHIGHDependencies with known CVEs (live OSV.dev lookup)
SC5Abandoned DependenciesMEDIUMUnmaintained packages without security updates
SC6TyposquattingHIGHPackage names similar to popular packages

Excessive Agency (4 patterns)

IDPatternSeverityDescription
EA1Unrestricted Tool AccessHIGHUnfettered tool access without constraints
EA2Autonomous Decision MakingHIGHHigh-impact decisions without human-in-the-loop
EA3Scope CreepMEDIUMCapabilities extending beyond stated purpose
EA4Unbounded Resource AccessMEDIUMNo rate limits or quotas on resource consumption

Output Handling (3 patterns)

IDPatternSeverityDescription
OH1Unvalidated Output InjectionHIGHModel output used without sanitization
OH2Cross-Context OutputMEDIUMOutput flows across trust boundaries without validation
OH3Unbounded OutputMEDIUMNo limits on output size or generation rate

System Prompt Leakage (3 patterns)

IDPatternSeverityDescription
P6Direct LeakageHIGHInstructions that expose system prompts or internal rules
P7Indirect ExtractionMEDIUMExtraction via rephrasing, translation, or side-channels
P8Tool-Based ExfiltrationHIGHSystem prompts exfiltrated via file writes or network requests

Memory Poisoning (3 patterns)

IDPatternSeverityDescription
MP1Persistent Context InjectionHIGHContent designed to persist across interactions
MP2Context Window StuffingMEDIUMFiller content displacing safety constraints
MP3Memory ManipulationHIGHTampering with agent memory or stored state

Tool Misuse (3 patterns)

IDPatternSeverityDescription
TM1Tool Parameter AbuseHIGHCrafted parameters for unintended behavior (shell=True, --force)
TM2Chaining AbuseHIGHTool chains that bypass individual safety checks
TM3Unsafe DefaultsMEDIUMOverly permissive defaults (disabled TLS, no auth)

Rogue Agent (2 patterns)

IDPatternSeverityDescription
RA1Self-ModificationCRITICALModifying own code or configuration at runtime
RA2Session PersistenceHIGHUnauthorized persistence via cron jobs or startup scripts

Trigger Abuse (3 patterns)

IDPatternSeverityDescription
TR1Overly Broad TriggerMEDIUMTrigger patterns matching common words
TR2Shadow Command TriggerHIGHTriggers that shadow built-in commands or other skills
TR3Keyword Baiting TriggerMEDIUMGeneric triggers designed to maximize activation

Behavioral AST (9 patterns)

IDPatternSeverityDescription
AST1exec() CallCRITICALDirect exec() enabling arbitrary code execution
AST2eval() CallHIGHDirect eval() evaluating arbitrary expressions
AST3Dynamic ImportHIGH__import__() loading arbitrary modules at runtime
AST4subprocess CallHIGHExternal command execution via subprocess
AST5os.system / exec-familyHIGHShell commands via os module
AST6compile() CallMEDIUMCode object creation from strings
AST7Dynamic getattr()MEDIUMArbitrary attribute access with non-literal names
AST8Dangerous Execution ChainCRITICALexec/eval combined with dynamic source (network, encoded data)
AST9Reflective getattr() SinkHIGHReflective exec via getattr(os,'system') / getattr(builtins,'exec') that evades AST1/AST5

Taint Tracking (5 patterns)

IDPatternSeverityDescription
TT1Direct Taint FlowHIGHData flows directly from a source to a sink without sanitization
TT2Variable-Mediated Taint FlowMEDIUMData flows from source to sink through intermediate variables
TT3Credential Exfiltration ChainCRITICALCredentials (env vars, secrets) flow to network output sinks
TT4File Read to Network ExfiltrationHIGHFile contents flow to network output sinks
TT5External Input to Code ExecutionCRITICALNetwork or user input flows to exec/eval/subprocess sinks

YARA Signatures (4 patterns)

IDPatternSeverityDescription
YR1Malware MatchCRITICALYARA rule match for known malware signatures
YR2Webshell MatchCRITICALYARA rule match for webshell patterns
YR3Cryptominer MatchHIGHYARA rule match for crypto mining indicators
YR4Hack Tool / Exploit MatchHIGHYARA rule match for hack tools or exploit code

MCP Least Privilege (4 patterns)

IDPatternSeverityDescription
LP1Underdeclared CapabilityHIGHCode uses capabilities not listed in declared permissions
LP2Wildcard PermissionMEDIUMPermission list contains wildcards (*, all, full, any)
LP3Missing Permission DeclarationMEDIUMNo permissions field but code has detectable capabilities
LP4Overdeclared PermissionLOWPermission declared but no corresponding code capability found

MCP Tool Poisoning (4 patterns)

IDPatternSeverityDescription
TP1Hidden InstructionsHIGHHidden directives in metadata (HTML comments, zero-width chars, base64, data URIs)
TP2Unicode DeceptionHIGHHomoglyphs, RTL overrides, mixed-script identifiers in tool metadata
TP3Parameter Description InjectionMEDIUMInjection patterns in parameter definitions (overrides, system tokens, malicious defaults)
TP4Description-Behavior MismatchMEDIUMDeclared tool description does not match actual code behavior (LLM-powered)

All detected patterns are listed in the tables above.

Risk Scoring

Score Calculation

  • CRITICAL issues: +50 points
  • HIGH issues: +25 points
  • MEDIUM issues: +10 points
  • LOW issues: +5 points
  • Executable scripts: 1.3x multiplier

Severity Levels

ScoreSeverityRecommendation
0-20LOWSAFE
21-50MEDIUMCAUTION
51-80HIGHDO NOT INSTALL
81-100CRITICALDO NOT INSTALL

Example Output

Terminal Output

 SkillSpector Security Report  v2.0.0

Skill: suspicious-skill
Source: ./suspicious-skill/
Scanned: 2026-01-29 10:30:00 UTC

        Risk Assessment
 Metric          Value
 Score           78/100
 Severity        HIGH
 Recommendation  DO NOT INSTALL

        Components (3)
 File              Type      Lines  Executable
 SKILL.md          markdown    142  No
 scripts/sync.py   python       87  Yes
 requirements.txt  text          3  No

Issues (2)

  HIGH: Env Variable Harvesting (E2)
    Location: scripts/sync.py:23
    Finding: for key, val in os.environ.items():...
    Confidence: 94%
    Explanation: This code collects environment variables containing
    API keys and secrets, then sends them to an external server.

  HIGH: External Transmission (E1)
    Location: scripts/sync.py:45
    Finding: requests.post("https://api.skill.io/env"...
    Confidence: 89%
    Explanation: Data is being sent to an external server. Combined
    with env harvesting above, this indicates credential exfiltration.

Configuration

Environment Variables

VariableDescriptionRequired
SKILLSPECTOR_PROVIDERActive LLM provider: openai, anthropic, or nv_build. Each provider has its own bundled model_registry.yaml and default model (see the LLM Analysis table above). Defaults to nv_build.Optional
NVIDIA_INFERENCE_KEYCredential for the nv_build provider (build.nvidia.com).Required for LLM analysis when SKILLSPECTOR_PROVIDER=nv_build
OPENAI_API_KEYCredential for the OpenAI provider (SKILLSPECTOR_PROVIDER=openai). Also serves as the tier-2 fallback in the credential waterfall when the active provider returns no credentials.Required for LLM analysis when SKILLSPECTOR_PROVIDER=openai
OPENAI_BASE_URLOverride the OpenAI endpoint (e.g. point at Ollama).Optional
ANTHROPIC_API_KEYCredential for the Anthropic provider (SKILLSPECTOR_PROVIDER=anthropic).Required for LLM analysis when SKILLSPECTOR_PROVIDER=anthropic
ANTHROPIC_PROXY_ENDPOINT_URLFull endpoint URL for the Anthropic proxy provider (Vertex-style raw-predict).Required when SKILLSPECTOR_PROVIDER=anthropic_proxy
ANTHROPIC_PROXY_API_KEYBearer token for the Anthropic proxy provider.Required when SKILLSPECTOR_PROVIDER=anthropic_proxy
ANTHROPIC_PROXY_API_VERSIONanthropic_version value sent in the request body (default: vertex-2023-10-16).Optional
SKILLSPECTOR_MODELOverride the active provider's default model. See the LLM Analysis table for each provider's default.Optional
SKILLSPECTOR_MODEL_REGISTRYOverride the bundled per-provider YAML registry (src/skillspector/providers/<provider>/model_registry.yaml) with a custom path.Optional
SKILLSPECTOR_LOG_LEVELLog level: DEBUG, INFO, WARNING, ERROR (default: WARNING).Optional

CLI Options

skillspector scan --help

Options:
  -f, --format [terminal|json|markdown|sarif]  Output format [default: terminal]
  -o, --output PATH                            Output file path
  --no-llm                                     Skip LLM analysis (static only)
  --yara-rules-dir PATH                        Extra YARA rules directory
  -b, --baseline PATH                          Suppress findings listed in a baseline
  --show-suppressed                            List baseline-suppressed findings
  -V, --verbose                                Show detailed progress
  --help                                       Show this message and exit

# Generate a baseline of all current findings (see docs/SUPPRESSION.md)
skillspector baseline <path> [-o FILE] [--no-llm] [--reason TEXT]

Integrating SkillSpector

SkillSpector is built to be driven by other tools (CI pipelines, install gates, editor integrations). Its exit code and JSON output are a stable contract.

Exit codes

skillspector scan exits with:

CodeMeaning
0Scan completed, risk_score ≤ 50 (recommendation SAFE or CAUTION)
1Scan completed, risk_score > 50 (recommendation DO_NOT_INSTALL)
2Error (bad input, unreadable source, internal failure)

The exit code collapses SAFE and CAUTION into 0. To act differently on them (e.g. warn on CAUTION but block on DO_NOT_INSTALL), read the recommendation field from the JSON output rather than relying on the exit code.

Machine-readable output

--format json produces a JSON report; with no --output/-o it is written to stdout:

skillspector scan ./my-skill/ --format json

The top-level shape is (this example shows a full LLM-backed scan; with --no-llm, metadata.llm_requested is false):

{
  "skill": { "name": "...", "source": "...", "scanned_at": "<ISO 8601>" },
  "risk_assessment": { "score": 0, "severity": "LOW", "recommendation": "SAFE" },
  "components": [ { "path": "...", "type": "...", "lines": 0, "executable": false, "size_bytes": 0 } ],
  "issues": [ { "id": "...", "category": "...", "severity": "...", "confidence": 0.0, "location": { "file": "...", "start_line": 0 } } ],
  "metadata": { "has_executable_scripts": false, "skillspector_version": "...", "llm_requested": true, "llm_available": true }
}
  • risk_assessment.severityLOW | MEDIUM | HIGH | CRITICAL.
  • risk_assessment.recommendationSAFE | CAUTION | DO_NOT_INSTALL, mapped from severity: LOW → SAFE, MEDIUM → CAUTION, HIGH/CRITICAL → DO_NOT_INSTALL.
  • metadata.llm_error appears only when LLM analysis was requested but unavailable.
  • The full per-issue shape is defined by Finding.to_dict() in models.py; rely on the fields above and treat any additional fields as best-effort.

For CI/IDE tooling, --format sarif emits SARIF 2.1.0.

When using SkillSpector as an install gate, map the recommendation to an action:

recommendationSuggested action
SAFEallow
CAUTIONprompt / warn the user
DO_NOT_INSTALLblock

SkillSpector computes the score band and recommendation; how strict the gate is (e.g. whether CAUTION blocks in CI) is a policy decision for the integrating tool.

Development

Setup

All make targets assume a virtual environment is already created and activated. The Makefile uses uv if available, else pip.

# Clone, create venv, activate, install dev dependencies
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector
uv venv .venv && source .venv/bin/activate
# or: python3 -m venv .venv && source .venv/bin/activate
make install-dev

# Run tests
make test

# Run tests with coverage
make test-cov

# Run linting
make lint

# Format code
make format

How It Works

SkillSpector uses a two-stage detection pipeline:

Stage 1: Static Analysis

  • Fast regex-based pattern matching across 11 static analyzers
  • AST-based behavioral analysis detecting dangerous calls (exec, eval, subprocess, etc.)
  • Live vulnerability lookups via OSV.dev for known CVEs in dependencies
  • Scans all files in the skill
  • High recall (catches most issues)
  • Moderate precision (some false positives)

Stage 2: LLM Semantic Analysis (Optional)

  • Evaluates context and intent
  • Filters false positives
  • Provides human-readable explanations
  • Improves precision to ~87%

The LLM prompt includes anti-jailbreak protections to prevent malicious skills from manipulating the analysis.

Live Vulnerability Lookups (SC4)

SC4 uses the OSV.dev API to check dependencies against the full Open Source Vulnerabilities database — covering tens of thousands of advisories across PyPI and npm.

  • No API key required — OSV.dev is free and unauthenticated.
  • Batch queries — all dependencies are checked in a single HTTP call.
  • Automatic fallback — if OSV.dev is unreachable (air-gapped/offline), a small built-in fallback list is used.
  • Caching — results are cached in-memory for 1 hour to avoid redundant API calls during a session.

The tool requires outbound HTTPS access to api.osv.dev for live vulnerability data. When that is not available, findings are limited to the static fallback list.

Trust model and data egress

SkillSpector is defense-in-depth, not a sandbox. Know what it does and does not do before relying on it:

  • It never executes the scanned skill. All analysis is static (regex, Python AST, YARA) plus optional LLM evaluation of file contents — the skill's code is never run.
  • LLM analysis sends file contents to the configured provider. When LLM analysis is enabled (the default), file contents are sent to the active SKILLSPECTOR_PROVIDER endpoint. Use --no-llm to keep contents local (static analysis only).
  • SC4 sends dependency names to OSV.dev. The supply-chain check queries OSV.dev with the package names and versions the skill declares, to look up known CVEs. This is fundamental to the check and runs even with --no-llm. It sends dependency coordinates (not file contents), requires no API key, and falls back to a bundled list when OSV.dev is unreachable.
  • It does not sandbox the host. SkillSpector flags risky patterns before you install a skill; it does not contain or isolate a skill you choose to install anyway.

Limitations

  • Non-English content: May miss patterns in other languages
  • Image-based attacks: Cannot analyze text in images
  • Encrypted/binary code: Cannot analyze compiled or encrypted content
  • Runtime behavior: Static analysis only, no dynamic execution
  • Offline SC4: Without network access to api.osv.dev, SC4 uses a small static fallback list

Research Background

Based on research from "Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale" (Liu et al., 2026):

  • Dataset: 42,447 skills from major marketplaces
  • Vulnerable: 26.1% contain at least one vulnerability
  • High-severity: 5.2% show likely malicious intent
  • Key finding: Skills with executable scripts are 2.12x more likely to be vulnerable

Python API Integration

from skillspector import graph

# Invoke the LangGraph workflow
result = graph.invoke({
    "input_path": "/path/to/skill",
    "output_format": "json",   # terminal, json, markdown, or sarif
    "use_llm": True,           # False for static-only analysis
})

# Access results
print(f"Risk Score: {result['risk_score']}/100")
print(f"Severity: {result['risk_severity']}")
print(f"Recommendation: {result['risk_recommendation']}")

for finding in result["filtered_findings"]:
    print(f"[{finding['severity']}] {finding['rule_id']}: {finding['message']}")

License

Apache License 2.0 - see LICENSE for details.

Contributing

Contributions are welcome! Please read our contributing guidelines and submit pull requests.

Support