SkillSpector: 스킬을 설치하기 전에 위험 점수를 매겨 주는 NVIDIA 스캐너
분석한 스킬 31,132개 중 26.1%에 취약점이, 5.2%에 악의적 의도가 있었다는 게 이 스캐너가 나온 이유예요
- 누가
- NVIDIA가 만들고, 자사 Verified Skills 파이프라인에서 스킬을 공개하기 전 검사하는 데 써요. Claude Code·Codex CLI·Gemini CLI 사용자와 스킬 배포자를 위한 도구예요.
- 언제
- 2026-03-21 저장소 공개. 최신 릴리스는 2026-11-04의 v2.13.4이고, 10월 말부터 사흘에 한 번꼴로 릴리스가 나와요.
- 어디서
- 내 PC의 CLI(Python 3.12 이상, uv), Docker, 또는 MCP 서버로 Claude Code·Codex CLI·Gemini CLI 안에서. 정적 검사는 오프라인, LLM 검사는 선택이에요.
이게 불편했어요
X나 깃허브에서 본 스킬을 한 줄로 설치할 때마다 SKILL.md와 딸린 스크립트를 다 읽어 보진 않았어요. 스킬은 에이전트가 그대로 따르는 지시와 실행되는 코드인데, 환경 변수를 긁어 밖으로 보내는 한 줄이 어디 숨어 있는지 눈으로는 가려내기 어려웠어요.
그래서 이렇게 풀어요
SkillSpector는 스킬 폴더·zip·깃 저장소를 받아 71가지 패턴을 정적으로 검사하고, 원하면 LLM이 의미를 한 번 더 봐요. 결과는 0–100 위험 점수와 SAFE·CAUTION·DO NOT INSTALL 한 줄이에요. --no-llm이면 키 없이 오프라인으로 돌고, MCP 서버로 붙이면 Claude Code가 scan_skill 도구로 설치 전에 스스로 검사할 수 있어요.


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"...
이걸로 만든 사람들

Claude Code로 설치된 스킬 15개를 검사했는데, 키 없는 claude_cli 제공자가 LLM 호출마다 새 claude -p 세션을 열어 6분에 세션 434개, 2,240만 토큰을 썼다고 해요. 정적 검사가 진짜 문제 하나는 잡았고, 지금은 --no-llm으로만 돌린대요.
I asked Claude Code to scan the 15 skills in my setup using NVIDIA's SkillSpector skill.

SkillSpector를 에이전트나 프로젝트에 붙이는 Claude Code용 스킬을 만들어 공유했어요. X에서 받은 스킬은 특히 검사해 보라고 덧붙였어요.
If you want to integrate Skillspector into your agent or project, just give this skill to Claude Code

자기 스킬들을 직접 검사해 본 후기예요. 무료 정적 검사는 오탐이 많고, 가치 있는 LLM 검사는 한 번에 약 15달러가 들었다고 해요.
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
안에서는 이렇게 돌아가요
- 1
나 → skillspector scan
skillspector scan <폴더|zip|git URL>CLI는 인자를 초기 상태로 바꿔 LangGraph 워크플로에 넘기고, 결과를 출력 형식과 종료 코드로 되돌리는 얇은 껍데기예요.src/skillspector/cli.py - 2
skillspector scan → InputHandler
깃 클론·zip 추출·폴더 읽기허용된 호스트(github.com, gitlab.com 등)만 받고, 100 MiB와 zip 항목 1만 개 한도를 넘으면 닫힌 채로 실패해요. zip-slip과 SSRF도 막아요.src/skillspector/input_handler.py - 3
InputHandler → 정적 분석 노드들
파일 목록·SKILL.md 문맥 구성파일을 종류별로 분류해 캐시에 담고 매니페스트를 읽어, 파이썬·자바스크립트·마크다운 각각에 맞는 분석기가 볼 수 있게 해요.src/skillspector/nodes/build_context.py - 4
skillspector scan → 정적 분석 노드들
분석 노드 병렬 실행그래프가 resolve_input→build_context→inspect_dependencies 뒤에 발견된 분석기들을 병렬로 돌리고 meta_analyzer로 모아요.src/skillspector/graph.py - 5
정적 분석 노드들 → LLM 메타 분석 (선택)
패턴 매치: E2, SC2, TP1…예컨대 환경 변수를 통째로 긁는 코드(E2)나 외부 URL로 보내는 호출(E1)이 줄 번호와 함께 잡혀요.src/skillspector/nodes/analyzers/static_patterns_data_exfiltration.py - 6
LLM 메타 분석 (선택) → skillspector scan
오탐 거르기와 설명 붙이기제공자가 있으면 메타 분석기가 파일별로 정적 결과를 다시 보고 걸러요. --no-llm이면 이 단계를 건너뛰고 보고서에 그렇게 표시돼요.src/skillspector/nodes/meta_analyzer.py - 7
skillspector scan → 위험 점수 보고서
점수 합산과 판정0–20 LOW·SAFE, 21–50 MEDIUM·CAUTION, 51 이상 DO NOT INSTALL로 띠를 나누고, 터미널·JSON·Markdown·SARIF로 써요. 51점을 넘으면 종료 코드 1이에요.src/skillspector/nodes/report.py
넣으면 이렇게 나와요
나한테 맞을까요
이럴 때 좋아요
- Claude Code·Codex·Gemini CLI에 남이 만든 스킬을 자주 설치하는 사람
- 스킬을 공개하기 전에 자기 스킬을 점검하고 싶은 작성자
- 팀의 스킬 폴더를 CI에서 걸러야 하는 관리자
- 사내 MCP 서버 목록을 정기적으로 비교·점검하는 보안 담당
이건 안 돼요
- LLM 분석은 제공자 키나 로컬 모델이 필요하고 토큰을 써요. 레딧의 한 사용자는 키 없는 claude_cli 제공자로 스킬 15개를 검사하다 6분에 Claude 세션 434개, 2,240만 토큰을 썼다고 해요.
- README 기준 Windows에서는 --output으로 파일을 쓸 수 없고 표준 출력으로만 받아요.
- 정적 검사는 오탐이 있어요. 검토한 결과는 baseline 파일로 억제해 다음 스캔에서 새 문제만 보게 해야 해요.
- HTTP 전송 모드의 MCP 서버는 인증 없이 떠요. 루프백에만 묶이고 로컬 경로는 거부되지만, 원격에서 쓰려면 앞에 인증 프록시를 두라고 README가 말해요.
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
- 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"...
What people made with it

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.

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

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
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
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
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
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
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
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
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
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.