AI column

Security@donghyeok99Staff

SkillSpector: NVIDIA's scanner that scores a skill before you install it

Of 31,132 skills it analysed, 26.1% carried a vulnerability and 5.2% looked malicious; that finding is why this scanner exists

A scan beam sweeps SKILL.md and scripts/sync.py, two lines turn red with E2 and E1 tags, the gauge climbs to 78/100, then HIGH and a DO NOT INSTALL stamp.
A scan beam sweeps SKILL.md and scripts/sync.py, two lines turn red with E2 and E1 tags, the gauge climbs to 78/100, then HIGH and a DO NOT INSTALL stamp.
Who
By NVIDIA, used in its Verified Skills pipeline before skills are published. For Claude Code, Codex, Gemini CLI users and skill authors.
When
Repository opened 2026-03-21. The latest release is v2.13.4 on 2026-11-04, with releases every few days since late October.
Where
A CLI on your machine (Python 3.12+, uv), Docker, or an MCP server inside Claude Code, Codex CLI and Gemini CLI. Static scans run offline.

What was hard

Every time a skill seen on X or GitHub went in with one install line, nobody read the SKILL.md and its scripts end to end. A skill is instructions the agent follows and code it runs, and the one line that harvests environment variables and ships them out is hard to spot by eye.

What it does about it

SkillSpector takes a skill folder, zip or Git repository, checks it statically against 71 patterns and, if you want, lets an LLM read the meaning once more. The answer is a 0–100 risk score and one word: SAFE, CAUTION or DO NOT INSTALL. With --no-llm it runs offline with no key, and as an MCP server it lets Claude Code call scan_skill and check a skill before installing it.

skillspector scan ./my-skill/SkillSpector Security Report  v2.0.0Skill: suspicious-skillScore           78/100Severity        HIGHRecommendation  DO NOT INSTALLIssues (2)HIGH: Env Variable Harvesting (E2)Location: scripts/sync.py:23Finding: for key, val in os.environ.items():...HIGH: External Transmission (E1)Location: scripts/sync.py:45Finding: requests.post("https://api.skill.io/env"...
The README's own run

What people made with it

Redditu/ign1tio2026-10-08

Claude Code scanned their 15 skills; the keyless claude_cli provider opened a fresh claude -p session per LLM call: 434 sessions, 22.4M tokens in 6 minutes. Now they run --no-llm only.

I asked Claude Code to scan the 15 skills in my setup using NVIDIA's SkillSpector skill.
X@dani_avila72026-10-19

They made and shared a Claude Code skill that wires SkillSpector into an agent or project, adding that skills picked up on X are worth scanning.

If you want to integrate Skillspector into your agent or project, just give this skill to Claude Code
likes 51 · comments 7 (2026-11-06 as of)X ↗
Redditu/NathanHouse2026-07-16

A write-up from scanning their own skills: the free static scan was noisy, and the LLM scan that was worth it cost about $15 a run.

I tested NVIDIA's SkillSpector on my own AI agent skills. The free scan is noisy, and the real value costs ~$15 a scan. Here's the better move

How it runs inside

  1. 1

    You → skillspector scan

    skillspector scan <dir|zip|git URL>A thin wrapper: arguments become state, the LangGraph workflow runs, the result becomes a report and an exit code.src/skillspector/cli.py
  2. 2

    skillspector scan → InputHandler

    Clone, unzip or read the folderOnly allowed hosts (github.com, gitlab.com…); 100 MiB and 10,000-entry zip caps fail closed; zip-slip and SSRF blocked.src/skillspector/input_handler.py
  3. 3

    InputHandler → Static analyzer nodes

    Build the file list and SKILL.md contextFiles are classified and cached, the manifest read; each file type goes to the analyzers made for it.src/skillspector/nodes/build_context.py
  4. 4

    skillspector scan → Static analyzer nodes

    Run analyzer nodes in parallelresolve_input→build_context→inspect_dependencies, then all discovered analyzers in parallel, joined at meta_analyzer.src/skillspector/graph.py
  5. 5

    Static analyzer nodes → LLM meta-analysis (optional)

    Pattern hits: E2, SC2, TP1…Code harvesting the whole environment (E2) or posting to an external URL (E1) is caught with file and line number.src/skillspector/nodes/analyzers/static_patterns_data_exfiltration.py
  6. 6

    LLM meta-analysis (optional) → skillspector scan

    Filter false positives, add explanationsA provider set: findings are re-read per file and filtered. --no-llm: the step is skipped and the report says so.src/skillspector/nodes/meta_analyzer.py
  7. 7

    skillspector scan → Risk score report

    Sum the score, give the verdict0–20 LOW/SAFE, 21–50 MEDIUM/CAUTION, 51+ DO NOT INSTALL; terminal, JSON, Markdown or SARIF; above 50 exit code 1.src/skillspector/nodes/report.py

What goes in, what comes out

skillspector scan https://github.com/user/my-skillThe repo is fetched; you get a score, a verdict and findings with pattern IDs, files and lines
skillspector scan ./my-skill/ --no-llmStatic analysis only, no key, fast
skillspector scan ./my-skill/ --format sarif --output report.sarifA SARIF report for CI and IDEs
claude mcp add skillspector -- skillspector mcpClaude Code gets a scan_skill tool and a verdict before it installs

Is it for you

Good for

  • People who install other people's skills into Claude Code, Codex or Gemini CLI often
  • Skill authors who want to check their own skill before publishing
  • Maintainers who need to gate a team's skill folder in CI
  • Security staff who compare and review an internal MCP server list regularly

Not for

  • The LLM pass needs a key or a local model and costs tokens: one Reddit user scanning 15 skills via claude_cli saw 434 sessions and 22.4M tokens in 6 minutes.
  • Per the README, --output file writing is unavailable on Windows; you read the report from stdout.
  • Static checks have false positives. Reviewed findings go into a baseline file so later scans show only new ones.
  • The MCP server's HTTP transport has no authentication: loopback only, local paths rejected, and the README wants an auth proxy in front for remote use.

Sign in to post, comment and like.Sign in

Report

Reason

Read the community rules