vibecode-checker
This MCP server lets AI clients run Korean public-sector-oriented security checks on code, projects, packages, SBOMs, and vendor bundles, then generate reports.
Scan pasted code or local files/folders for secrets, PII, SQL injection, dangerous execution, web/LLM risks, and other security issues.
Focus specifically on secret and Korean PII detection when only leak checks are needed.
Audit single packages, dependency manifests/lockfiles, SBOMs, installed packages, and vendored JS bundles for vulnerabilities, malware, typosquatting, cooldown, and license issues.
Search and retrieve detailed security rules and get safe-fix guidance for findings.
Render and save Korean Markdown/HTML/SARIF reports to standard report locations.
Provide server diagnostics such as loaded rules, tool availability, install identity, and runtime freshness.
Perform checks locally without sending source code externally; offline mode uses local threat-intel caches.
Integrates with GitHub Actions CI/CD pipelines to automatically run security scans on pushes and pull requests, with configurable failure thresholds.
Provides a pre-commit hook to automatically scan staged changes for security issues before committing.
Allows checking PyPI packages for known vulnerabilities and typosquatting attacks before installation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vibecode-checker이 프로젝트 보안 점검해줘 ./my-project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vibecode-checker
AI가 만든 코드를 한국 공공기관 보안 기준으로 점검합니다.
AI 코딩 도구(ChatGPT·Claude·Copilot·Cursor)로 만든 코드에 숨은 개인정보 노출 · API 키 · SQL 삽입 · 위험한 명령 실행 · 취약 패키지를 찾아 배포 승인 / 미승인 / 보류 결론과 조치 방법을 한국어 보고서로 줍니다. 코드는 PC 밖으로 나가지 않고, 판정 근거(엔진·룰셋·위협 정보 수집 시각)가 보고서에 남습니다.
https://github.com/user-attachments/assets/f2a817ae-0a8d-440f-a832-b78bcdd05540
▶ 20초 소개 영상 — 재생 버튼을 누르면 시작합니다. (원본 MP4 파일)
이 도구가 하는 일
검사 — 폴더를 주면 소스 코드(Python·JavaScript·TypeScript), 사용 중인 패키지(PyPI·npm), 폴더에 직접 넣어둔 라이브러리 파일(
static/*.min.js), 그리고 저장소를 열거나 AI 도구를 켜면 실행되는 설정 파일(.vscode·.claude·MCP·CI 워크플로·설치 스크립트)까지 한 번에 봅니다. 코드는 외부로 전송되지 않고, 검사 대상의 어떤 스크립트도 실행하지 않습니다.판정 — 발견을 심각도(치명·높음·보통)와 조치(차단·경고·허용)로 나누고, 코드와 패키지를 함께 보고 결론 하나를 냅니다: 배포 승인 가능 / 미승인(차단) / 보류(확인 필요). 확인하지 못한 것은 "안전"이 아니라 "판정 불가"로 적습니다.
보고서 — 무엇이 위험한지 → 왜 위험한지 → 어떻게 고치는지(안전한 코드 예시)를 한국어로 정리합니다. HTML 보고서를 인쇄하면 그대로 PDF 결재 문서가 됩니다.
쓰는 방법은 두 가지이고, 설치는 하나로 둘 다 됩니다.
터미널:
gvskb scan ./내프로젝트AI 코딩 도구(VS Code·Claude Desktop·Cursor·Claude Code)에 연결한 뒤 자연어로: "이 폴더 보안 검사 해줘"
Related MCP server: CodeAudit Agent
다른 도구와 다른 점
내용 | |
한국 공공기관 기준 | KISA 시큐어코딩·행안부 개발보안·국정원 AI 가이드를 룰에 직접 반영합니다. 발견마다 "왜 위험한지 → 어떻게 고치는지"를 출처와 함께 한국어로 제시합니다. |
비전문가용 보고서 | 보고서 맨 위에 배포 승인/미승인 결론이 먼저 나옵니다. 보안 지식 없이 결론과 조치 가이드(3단계)만 따라 하면 됩니다. 상세 근거는 보안팀용으로 접혀 있습니다. |
코드+패키지 통합 판정 | 코드가 문제없어도 취약한 패키지를 쓰면 승인되지 않습니다. |
망분리(폐쇄망) 지원 |
|
판정의 한계를 표시 | "판정하지 못함"을 "안전"으로 바꿔 말하지 않습니다. 검사한 파일이 0개면 경로를 확인하라고 말하고, 캐시가 오래되면 판정을 보류로 낮추고, 검사 엔진이 빠졌으면 어떤 엔진이 빠졌는지 결과에 남기고, 탐지 못 하는 항목은 성능 표에 공개합니다. |
판정을 재현할 수 있음 | 보고서마다 엔진 버전·룰셋 지문·위협 정보 수집 시각이 기록되고, |
자동화 연결 | 종료 코드로 CI에서 커밋·배포를 차단할 수 있고, SARIF·SBOM(CycloneDX) 출력과 감사로그(JSONL)를 지원합니다. |
보고서는 이렇게 생겼습니다
검사 결과를 저장하면 텍스트(.md)와 HTML 보고서가 함께 만들어집니다.
보고서는 읽는 사람에 따라 두 층으로 나뉩니다.
① 요약층 — 비전문 공무원용 (항상 펼침): 대상·검사일시 → 결론 박스(승인 가능 = 초록 / 미승인 = 빨강) → 핵심 숫자 → 조치 가이드 3단계 → 검토 범위·한계.
② 상세층 — 보안담당자용 (기본 접힘): 발견을 보안 분야별(개인정보·비밀값·주입·웹·암호화·설정 오류·AI 위험)로 묶어, 항목마다 위치 · 왜 위험한지 · 대응 방법 · 근거(출처) 를 제시합니다. 패키지 취약점, 외부 데이터 전송 목록, AI 도구에 붙여넣을 수정 프롬프트(복사 버튼)도 포함됩니다.
상세층은 기본 접혀 있고 인쇄(→PDF) 시 자동으로 펼쳐집니다. 그대로 공문 '붙임'으로 제출하면 보안팀이 이 문서로 보안성 검토를 진행할 수 있습니다.
── 요약층 (공무원) ─────────────────────────────
| 대상 | C:\…\민원처리앱 | 판정 기준 | 엔진 0.4.0 · 룰셋 2026.09.18a |
## 결론
> ### 배포 미승인 (차단) ← 빨강 박스(승인이면 초록)
> 배포 판정 · 배포 불가 — CVSS CRITICAL 취약점 · 레지스트리에 없는 이름(가짜
> 이름 의심)에 해당하는 패키지가 있습니다(pyyaml 5.3.1, reqeusts 1.0.0).
> 소스만 고치면 차단이 풀리지 않습니다 — 소스 9건과 패키지를 함께 해소하세요.
>
> 해소 방안 ← 무엇을 하면 차단이 풀리는지 명시
> - pyyaml 5.3.1 (CVSS CRITICAL) → 5.4 이상으로 올린 뒤 다시 검사하세요
> - reqeusts 1.0.0 (레지스트리에 없는 이름) → 대체 패키지를 검토하세요
> - ⚠ 비밀값 노출 3건 — 코드에서 지우는 것만으로 끝나지 않습니다.
> 해당 키·비밀번호를 반드시 재발급(폐기)하세요.
>
> 이 판정의 기준 ← 차단/조건부 승인/승인 기준표 동봉
## 요약
- 발견된 위험 16건 · 필수 조치 9건 · 최고 심각도: 치명
- 취약 패키지 3종 · 미존재(가짜 이름 의심) 1종
- 판정 근거: 확인됨 1건 · 유력함 2건 · 패턴 일치만 13건
← 얼마나 확신하는 판정인지 구분
## 조치 가이드 — 3단계만 따라 하세요
1) 고치기 → AI 도구에 "방금 보안검사에서 나온 위험들을 안전하게 고쳐줘"
2) 확인하기 3) 다시 검사
── 상세층 (보안팀, 분야별·클릭해 펼침) ──────────
## 상세 검토 결과
### 비밀값·인증정보 노출 — 3건 (치명 3) · 파일 2개
[치명·필수 조치] API 키 또는 비밀번호로 보이는 값이 코드에 포함되어 있습니다
위치 : app.py 12행 · db.py 4행
증거(마스킹) : OPENAI_API_KEY = "sk-proj-[마스킹]TEST"
왜 위험한가 : 키가 저장소나 LLM 프롬프트에 노출되면 행정시스템·클라우드·
외부 API가 탈취될 수 있습니다
안전한 수정 : 키는 환경변수, 기관 secret manager로 옮기세요
출처 : NIST SSDF, OWASP ASVS V6
## 의존성(패키지) 취약점 검사
### 컴포넌트 (고유 4종) ← 같은 패키지가 여러 곳에 있어도 한 줄로
| 패키지 | 버전 | 라이선스 | 판정 | 출처 |
| reqeusts | 1.0.0 | — | ❌ 저장소에 없음(가짜 이름 의심) | requirements.txt |
| flask | 0.12.2 | BSD-3 | ⚠ 개별 취약점 8건 | requirements.txt |
| pyyaml | 5.3.1 | MIT | ⚠ 개별 취약점 2건 · 최고 CRITICAL | requirements.txt |
| requests | 2.19.1 | Apache-2 | ⚠ 개별 취약점 10건 | requirements.txt |
reqeusts는 AI가 지어냈을 가능성이 있는 오타 이름(슬롭스쿼팅 의심)이라 업그레이드가 아니라 제거·대체 대상입니다. 취약점마다 어떤 문제인지와 해결 버전, 원문 링크(osv.dev)가 보고서에 함께 실립니다.
목차
바로 쓸 수 있는 문서: 30초 시작 가이드(처음 쓰는 분) · Windows 한글 설정(콘솔 한글 깨짐 1회 설정). 기관 내 교육·보안성 검토용 자료(공무원용 안내, 전문가용 기술 설명서, 운영 계획)는 도입 기관에 직접 제공합니다 — Discussions로 문의해 주세요.
설치
전제 조건
Python 3.11 이상 (
python --version으로 확인)운영체제 무관 (Windows·macOS·Linux). Windows 콘솔 한글 깨짐은 한 번만 설정
1단계 — 패키지 설치
설치 하나로 CLI 명령(gvskb)과 MCP 서버(gvskb-server)가 함께 설치됩니다.
PyPI에는 배포하지 않습니다(공공기관·망분리 환경의 공급망 보안 고려). GitHub 소스에서 설치합니다.
# 권장 — 릴리스 wheel (git 불필요, 커밋 신원이 박혀 있어 `gvskb status` 로 대조 가능)
# 최신 릴리스 페이지: https://github.com/Lex6won/vibecode-checker/releases/latest
# 페이지의 Assets 에서 .whl 주소를 복사해 넣으세요. 릴리스 노트에 그 판의 설치 명령이 그대로 적혀 있습니다.
pip install --force-reinstall https://github.com/Lex6won/vibecode-checker/releases/download/v0.5.15/vibecode_checker-0.5.15-py3-none-any.whl
# 대안 — 소스에서 한 줄 설치 (git 이 설치된 PC). main 의 최신 커밋이 설치됩니다.
pip install --force-reinstall git+https://github.com/Lex6won/vibecode-checker.git
# git 이 없는 PC — zip 주소를 그대로 넣으면 됩니다
pip install --force-reinstall https://github.com/Lex6won/vibecode-checker/archive/refs/heads/main.zip
# 선택 — JS/TS 구조 해석 엔진(tree-sitter, 바이너리 wheel). 없어도 판정 기준은 같고 보고서에 "미가동" 배너만 남습니다.
# 글자를 쪼개 가린 eval(`window["ev"+"al"]`) 같은 일부 변형을 더 잡습니다. 망분리 PC 는 wheelhouse 반입 뒤 설치.
pip install "vibecode-checker[ts] @ https://github.com/Lex6won/vibecode-checker/releases/download/v0.5.15/vibecode_checker-0.5.15-py3-none-any.whl"
# 소스를 받아 설치 (수정·기여하려면 -e 권장)
git clone https://github.com/Lex6won/vibecode-checker.git
cd vibecode-checker && pip install -e .이미 설치돼 있다면 꼭
--force-reinstall을 붙이세요. 수정본이 나와도 버전 번호가 같으면 pip 가 "이미 설치됨"으로 넘어가 옛 판정 기준이 그대로 남습니다(2026-10-13 실측: 기관 PC 의 0.4.0 이 서버와 다른 결과를 냈습니다). 설치 뒤gvskb status의commit_id가 릴리스 페이지의 커밋과 같은지 보세요.
갱신 — 최신 판인지 도구가 스스로 알려 줍니다
gvskb upgrade # 최신 릴리스 확인 → 갱신 명령 출력 (설치는 바꾸지 않음)
python -m gvskb upgrade --run # 같은 파이썬에 바로 교체 설치 (Windows 는 이 형태로 — gvskb.exe 잠김 회피)gvskb scan과 MCPscan_path는 검사 때마다(하루 1회 GitHub 조회, 3초 제한, 비차단) 최신 릴리스와 대조해 구판이면 stderr 한 줄 + 보고서 머리표 '판정 기준' 칸에 "구판 체커로 생성 — 갱신 명령"을 새깁니다. 보고서를 받은 검토자가 "최신 기준의 판정"으로 오해하지 않게 하려는 장치입니다. JSON 에는checker_update로 남습니다.gvskb doctor도 같은 항목(Checker release)을 WARN 으로 보여 줍니다.끄기:
GVSKB_UPDATE_CHECK=off. 망분리(GVSKB_MODE=offline)에서는 자동으로 꺼지고 네트워크를 건드리지 않습니다. 조회 주기는GVSKB_UPDATE_CHECK_HOURS(기본 24).
망분리(인터넷 없는) PC라면, 외부망에서 위 소스를 받아(또는
pip download로 의존성까지) 옮긴 뒤 오프라인 설치하세요.
AI 코딩 도구에 맡겨도 됩니다. Claude Code·Cursor처럼 터미널을 쓸 수 있는 도구에는 "https://github.com/Lex6won/vibecode-checker 설치하고 이 폴더 보안검사해줘" 라고 요청하면 설치·확인·검사까지 진행합니다. Claude Desktop처럼 터미널이 없는 도구는 설치 방법만 안내하므로, 위 명령을 직접 실행하세요.
2단계 — 설치 확인
gvskb doctor # 룰 수·인코딩·MCP·위협 정보 캐시 상태를 점검합니다
gvskb status # 설치본의 버전·커밋·룰셋 — 여러 PC 에 같은 판정 기준이 깔렸는지 대조할 때3단계 — 첫 검사
gvskb scan ./내프로젝트여기까지 하면 터미널에서 쓸 수 있습니다. AI 코딩 도구에서 자연어로 쓰려면 아래 MCP 연결을 추가하세요.
AI 코딩 도구에 연결 (선택 — MCP)
MCP 설정 파일에 서버를 등록합니다. Claude Desktop·Cursor·Claude Code 공통 형식입니다(최상위 키 mcpServers). VS Code는 형식이 달라 아래에 따로 안내합니다.
{
"mcpServers": {
"vibecode-checker": {
"command": "gvskb-server",
"args": [],
"env": { "PYTHONUTF8": "1", "PYTHONIOENCODING": "utf-8" }
}
}
}도구 | 설정 파일 위치 |
Claude Desktop | Windows |
Cursor | 프로젝트 |
VS Code (Copilot Agent) | 워크스페이스 |
Claude Code (CLI) | 프로젝트 루트 |
VS Code 전용 — .vscode/mcp.json 은 키가 servers 이고 type 이 필요합니다:
{
"servers": {
"vibecode-checker": {
"type": "stdio",
"command": "gvskb-server",
"args": [],
"env": { "PYTHONUTF8": "1", "PYTHONIOENCODING": "utf-8" }
}
}
}저장 후 도구를 재시작하면 연결됩니다. 확인 방법: AI에게 "server_status 확인해줘" — runtime_freshness.process_stale 이 false 이고 rules_loaded_ok 가 true 면 정상입니다.
자주 겪는 문제 3가지
gvskb-server를 찾지 못함 → PATH에 없는 경우입니다. 실행 파일의 전체 경로로 바꾸세요.gvskb doctor가 실행되는 환경이면gvskb-server도 같은 위치에 있습니다.Windows에서
command를python으로 지정했는데 서버가 뜨지 않음 →python이 Microsoft Store 스텁으로 연결된 경우입니다.gvskb-server를 그대로 쓰거나, 인터프리터 전체 경로(예:C:\Python313\python.exe)를 지정하세요.룰을 갱신했는데 판정이 그대로 → gvskb는 룰을 프로세스 시작 시점에 한 번만 읽습니다. 저장소를 갱신하거나 재설치한 뒤에는 MCP 서버를 재시작하세요.
server_status의runtime_freshness.process_stale이true면 낡은 상태이며 조치 방법이 함께 표시됩니다.
신뢰하는 환경에서만 연결하세요 — MCP
scan_path도구는 지정한 경로의 로컬 파일을 읽습니다(검사 목적). 연결한 AI 클라이언트가 임의 경로 스캔을 요청할 수 있으므로 민감 디렉터리는 가리키지 마세요. 자세한 내용은 SECURITY.md 참고.
Windows 독립 실행 MCP 시험본 만들기
하네스 설치 파일에 넣을 로컬 시험용 gvskb-server.exe는 다음 스크립트로 만듭니다. 이 절차는 신원 정보가 포함된 wheel을 먼저 만들고, 격리된 임시 환경에서 고정 버전 PyInstaller로 단일 실행 파일을 생성합니다.
.\scripts\build_windows_mcp_exe.ps1 `
-PythonExecutable C:\Python311\python.exe `
-OutputDirectory C:\work\vibecode-local-release\checker출력의 production_approved는 항상 false입니다. 이는 이 PC의 시험운영 후보일 뿐이며, 실제 서버 설치 후 기관 승인 커밋에서 다시 빌드하고 번들 서명·Authenticode 서명·새 PC 설치 검증을 마쳐야 운영 배포할 수 있습니다.
사용 방법
A. 터미널(CLI)에서
gvskb doctor # 1) 환경 점검(룰 수·인코딩·MCP·위협 정보 캐시)
gvskb scan ./my-project # 2) 폴더 검사 → .check-reports/ 에 자동 저장
gvskb scan ./my-project -o 보안점검.md # 3) 지정한 이름으로 저장 → .md + .html 함께 생성
gvskb scan ./my-project --check-deps -o 보안점검.md # 4) 패키지 취약점 검사까지 보고서에 병합
# 5) GitHub 저장소는 받은 뒤 그 폴더를 검사 (설치·빌드·실행 없이 읽기만 합니다)
git clone --depth 1 https://github.com/owner/repo /tmp/repo && gvskb scan /tmp/repo -o 보안점검.md
# 6) 설치하려는 패키지 하나만 미리 확인
gvskb check-package requests --ecosystem pypi # 알려진 취약점 조회
gvskb check-package reqeusts --ecosystem pypi # 오타 패키지(typosquat) 경고-o 파일이름: 결과를 그 이름으로 저장합니다. 마크다운/HTML 형식이면 텍스트.md와 인쇄용.html이 함께 만들어집니다.--check-deps: requirements.txt·package.json의 패키지를 취약점 DB와 대조해 코드+패키지 위험을 보고서 한 장에 담습니다. 외부로 전송되는 것은 패키지명·버전뿐입니다.
B. AI 코딩 도구에서 — 자연어로
MCP를 연결했다면 명령어를 외울 필요 없이 요청하면 됩니다:
"이 폴더 보안 검사 해줘 → ./my-project"
*"이 코드가 안전한지 확인해줘"* (코드를 붙여넣고)
"보안 점검 리포트 써줘" / "HTML 보고서로 만들어줘"
*"이 깃허브 저장소 보안 점검해줘 → https://github.com/owner/repo"*
*"고쳤어, 다시 검사해줘"*
인식 단어: 보안 · 점검 · 체크 · 검토 · 검사 · 스캔 · "안전한지". 잘 안 불러오면 "vibecode-checker로 점검해줘" 라고 덧붙이세요.
로컬 폴더·붙여넣은 코드는 모든 도구에서 동작합니다. GitHub URL은 셸을 쓸 수 있는 도구(Claude Code·Cursor)에서 동작합니다 — AI가 먼저
git clone한 뒤 검사합니다. Claude Desktop처럼 셸이 없는 도구에서는 폴더를 가리키거나 코드를 붙여넣으세요.
보고서 저장 위치
-o 를 안 붙여도 저장됩니다. 기본 위치는 검사한 폴더 안 .check-reports/ 입니다.
./my-project/.check-reports/2026-08-09_1745_보안점검.md
.html ← 인쇄하면 PDF 결재문서한곳에 모으고 싶다면 폴더를 한 번 지정해 두세요. 이후 모든 검사 결과가 거기 저장됩니다.
gvskb config --report-dir "D:\보안점검" # 한 번 지정하면 계속 적용
gvskb config # 현재 저장 위치 확인
gvskb config --clear-report-dir # 기본값으로 되돌리기
gvskb scan ./my-project --report-dir "D:\임시" # 이번 한 번만 다른 곳에공용 폴더에 모으면 파일명에 사업 이름이 붙습니다(2026-08-09_1745_my-project_보안점검.md) — 여러 부서가 한 폴더를 써도 구분됩니다. 저장 위치는 보고서 머리말에도 기록되므로(이 보고서 위치 행) 파일만 전달받은 사람도 원본 위치를 알 수 있습니다.
저장 위치 우선순위:
-o→--report-dir→ 환경변수GVSKB_REPORT_DIR→gvskb config설정 → 기본값. 화면으로만 보려면--stdout.
결과 읽는 법
보고서 맨 위 결론 박스가 판정입니다. 결론은 코드와 패키지를 함께 보고 정해집니다.
결론 박스 | 뜻 | 언제 나오나 | 다음 행동 |
배포 승인 가능 (초록) | 심각한 위험 미발견 | 코드·패키지 둘 다 이상 없음 | '검토 범위·한계' 확인 후 진행 |
배포 미승인 (차단) (빨강) | 그대로 배포하면 위험 | 차단 발견 또는 차단 기준에 걸린 패키지 | 먼저 고치거나 보안담당자 승인 |
배포 보류 (확인 필요) | 확인할 항목 있음 | 경고 발견 또는 취약·판정 불가 패키지 | 확인·수정 후 배포 |
각 발견의 심각도는 치명 → 높음 → 보통, 조치 등급은 필수 조치(block) → 경고(warn) → 허용(allow) 으로 표시됩니다. 결론 박스에는 판정 기준표(무엇이 차단이고 무엇이 조건부 승인인지)와 해소 방안(무엇을 하면 차단이 풀리는지)이 함께 실립니다. 요약에는 판정 근거의 확신 수준(확인됨 · 유력함 · 패턴 일치만)이 구분되고, 차단 건수도 "확인 / 유력 / 패턴 후보"로 나뉘어 값의 출처를 직접 확인해야 하는 항목이 무엇인지 알 수 있습니다.
XSS(innerHTML 등)는 값의 출처로 등급이 갈립니다. 상수 문자열은 발견에서 빠지고, 프로젝트가 만든 정화 함수(esc() 같은 이름이어도 본문이 실제로 이스케이프하면 인정)를 거친 값은 경고, 출처를 추적하지 못한 값은 경고(정밀 검토) 로 남으며, URL·요청·입력값·서버 응답이 정화 없이 들어가는 것만 필수 조치입니다. 이름만 정화인 함수(sanitizeMaybe(h){return h.trim()})는 인정하지 않고, 분석 엔진이 실패하면 완화 없이 차단이 남습니다.
"판정 불가"는 "안전"이 아닙니다. 이 도구는 확인하지 못한 것을 통과로 바꾸지 않습니다:
코드에 문제가 없어도, 사용 중인 패키지에 알려진 취약점이 있거나 패키지를 확인하지 못했다면(오프라인 등) 승인 판정을 내리지 않습니다.
검사된 파일이 0개면 "안전"이 아니라 경로·확장자를 확인하라는 안내가 나오고 결론은 '판정 불가'가 됩니다.
실행 소스 파일이 크기 상한(기본 8MB)을 넘어 검사되지 않으면 그 사실이
coverage.oversized_source_files에 남고 승인 판정이 나오지 않습니다(--max-file-bytes로 상한 조정). 빠진 파일은 "이상 없음"이 아니라 "판정 밖"입니다.반입한 위협 정보 캐시가 오래되면(기본 30일 초과) '이상 없음'을 '판정 보류'로 낮춥니다.
보고서 뒤쪽에는 행정안전부 SW 개발보안 49개 항목 결과표(항목별 발견 수 — '자동 탐지 없음'인 항목은 사람 점검 대상)와 검사 엔진 절(가동한 엔진·미가동 선택 엔진의 사유)이 붙습니다. 결재 문서에 그대로 쓸 수 있습니다.
무엇을 탐지하나
흔한 실수 유형
유형 | 예시 |
코드에 박힌 비밀값 |
|
개인정보 노출 | 주민등록번호·전화번호 평문 저장, 로그 출력 |
SQL 삽입 |
|
위험한 코드 실행 |
|
웹 취약점 | XSS, 경로 조작, 응답에 그대로 실리는 비밀번호·로그인 링크, Flask |
취약·가짜 패키지 | 알려진 CVE, 오타를 노린 typosquat( |
폴더에 넣어둔 외부 라이브러리 |
|
AI 특화 위험 | 프롬프트 인젝션(신뢰할 수 없는 입력이 LLM 프롬프트에 결합), 프롬프트에 개인정보 전송, LLM 출력 무검증 실행 |
외부 데이터 전송 | 외부 AI API·플러그인이 어디로(국외 포함) 무슨 데이터를 보내는지 목록으로 정리(검토용 — 사용 금지가 아님) |
폐쇄망 배포 영향 | CDN 스크립트·웹폰트 등 외부 리소스 로딩과 외부 API 호출 표시 — 폐쇄망에서 화면·기능이 깨질 지점을 배포 전에 확인 |
저장소를 열면 실행되는 설정 |
|
CI·패키지 공급망 | GitHub Actions 의 PR 코드 실행·비밀값 덤프·스크립트 삽입· |
숨은 문자 | 보이지 않는 유니코드(제로폭·변형 선택자)·양방향 제어 문자로 가린 코드 |
에이전트·스틸러 행위 | AI 코딩 CLI 를 권한 확인 없이 호출, 자격증명 파일 여러 개를 읽어 외부로 전송, 공개 텍스트 호스트에서 받아 바로 실행(dead-drop)·웹훅·DNS 명령 채널, 지시 파일( |
플랫폼별 보안 설정 | Electron( |
관리자 인가 부재 | 관리자·설정·사용자 삭제 경로에 서버측 인증·역할 검사 근거가 없는 경우, 공개 번들 환경변수( |
룰과 출처
탐지 룰은 한국 정부·국제 보안 가이드를 근거로 작성되며, 발견마다 출처를 함께 제시합니다.
출처 | 반영 |
KISA 시큐어코딩 가이드 (2023 개정) | Python 45항목 · JavaScript 36항목 |
행안부 SW 개발보안 가이드 | 49개 보안약점 |
국정원 AI 보안 가이드북 (2025) | AI 위협·대책 45룰 |
OWASP | LLM Top 10 · Agentic Top 10 · AI Testing Guide |
실시간 취약점 피드 | OSV.dev · CISA KEV · NVD · FIRST EPSS · KISA KNVD 공식 RSS(국내 보안공지, 보조 근거) |
검사에 쓰이는 승인 룰은 255개입니다 — 탐지 룰 135개(검사에서 발견을 만드는 룰) + 참조 룰 120개(발견의 근거·출처로 인용되는 지식 룰). 그 밖에 CISA KEV에서 매일 자동 생성되는 초안 카드가 있지만 사람이 승인하기 전에는 판정에 쓰이지 않습니다. 모든 룰은 Markdown 파일로 정의되어 누구나 읽고 검토할 수 있습니다.
위협 정보(인텔)는 매일 자동 갱신됩니다
GitHub Actions가 매일 03:17(KST) 7개 소스(OSV 악성 패키지·OSV 취약점 DB·CISA KEV·NVD·EPSS·KNVD 보안공지·KNVD 공개 취약점)를 PyPI·npm 두 생태계에 대해 수집해 검증 가능한 번들을 intel-latest 릴리스에 게시합니다. 갱신 잡은 이전 번들을 먼저 복원한 뒤 새 수집분을 병합하므로 NVD(최근 7일, 전 페이지)·EPSS·KNVD는 시간이 지날수록 커버리지가 넓어집니다. KNVD 피드는 최신 10건만 제공하므로 캐시는 누적분이며 KNVD 전체 DB가 아닙니다.
역할 구분: PyPI/npm 패키지의 취약점과 영향 버전은 OSV가 주 근거입니다. NVD는 CVSS 병기·상태(Rejected) 확인용 보조 정보이고, KNVD는 OSV 취약점의 CVE와 정확히 같은 CVE ID일 때만 한국어 보안공지 링크로 붙습니다 — 이름 유사도 매칭은 하지 않으며, NVD·KNVD로 판정(verdict·severity)이 바뀌지 않습니다.
인터넷 PC: 별도 설정 없이 자동입니다. MCP 서버가 뜰 때 캐시 신선도를 확인하고 낡았으면 하루 1회 번들을 받아옵니다(
GVSKB_AUTO_UPDATE=off로 끌 수 있음). 터미널만 쓴다면gvskb intel-sync한 번이면 됩니다.망분리 PC: 아래 절차대로 번들을 반입합니다. 관리자가 공유 폴더(
GVSKB_INTEL_DIR)에 번들을 놓아두면 각 PC가 자동 반영합니다.서버·포털에서 쓸 때: 검사를 실행하는 계정의 캐시가 쓰입니다. 서비스 계정이 따로 있으면
GVSKB_CACHE_DIR로 캐시 폴더를 지정하세요. 갱신 잡의 소스별 결과(항목 수·수집 시각·커버리지)는 릴리스 노트에 매일 기록됩니다.자동으로 받은 위협 정보는 패키지 검사(악성·취약점·실제 악용 여부 대조)에 쓰입니다. 검사 판정 기준(룰)이 자동으로 바뀌지는 않습니다 — 판정에 쓰이는 룰은 사람이 검토·승인한 것만입니다.
성능과 한계
실무형 프로젝트 5종(민원 웹앱·API 서버·정적 페이지·LLM 챗봇·데이터 처리)에 취약점 42개를 심은 벤치마크에서 42건 전부 탐지했고, 안전한 코드를 잘못 지적한 오탐은 0건이었습니다. 벤치마크와 결과는 저장소(eval_corpus/)에 포함되어 있어 누구나 재현할 수 있습니다.
다만 어떤 자동 점검 도구도 모든 위험을 잡지 못합니다. 이 도구의 한계는 다음과 같습니다.
한계 | 내용 |
일부러 숨긴 코드 | 난독화·우회 변형 11개 중 7개 탐지(선택 엔진 |
타입스크립트 | 별도 TS 채점표( |
탐지하지 못하는 유형 | 보안 지침이 요구하는 항목 중 현재 탐지하지 못하는 15건을 목록으로 공개하고 있습니다 |
정적 분석의 한계 | 설계·권한·업무 로직상 취약점, 실행 중에만 드러나는 취약점은 잡지 못합니다 |
값의 출처 추적 | JS 는 기본 설치에서 줄 단위로 변수를 따라갑니다. 함수 경계를 넘거나 다른 모듈에서 오는 값은 "출처 미상"으로 남아 사람이 확인해야 합니다. 선택 엔진( |
외부 보호 장치 | 관리자 경로에 인증 검사가 보이지 않으면 "보호 근거 없음(미확인)"으로 적습니다. SSO·리버스 프록시가 보호하는 경우는 제출물로 알 수 없으니 검토 의견에 적어 주세요 |
그래서 두 가지를 기억해 주세요:
발견 0건이 "안전"을 보장하지 않습니다. 보고서의 '검토 범위 및 한계'에도 같은 내용이 명시됩니다.
이 도구는 명백한 실수를 1차로 걸러내는 도구이며, 보안담당자의 공식 보안성 검토를 대체하지 않습니다.
표시된 항목이 실제로는 문제없다면 (오탐)
이 도구는 위험을 놓치는 것보다 한 번 더 알리는 쪽을 택했습니다. 따라서 맥락상 안전한 코드가 표시될 수 있습니다. 이렇게 처리하세요:
먼저 확인 — 보고서의 발견 항목에는 증거 코드와 파일·줄 번호가 함께 실립니다. 특히 판정 근거가 "패턴 일치만" 으로 표시된 항목은 값의 출처를 사람이 확인해야 합니다.
오탐이 맞다면 '승인된 예외'로 등록 — 검사 폴더에
.gvskb-exceptions.yaml을 만들어 등록하면, 그 항목은 게이트(배포 판정)에서 제외되면서 승인자·사유·만료일이 보고서에 기록됩니다. 발견을 숨기는 것이 아니라 결정을 기록하는 방식입니다.반복되는 오탐은 제보 — Issues에 알려주시면 룰을 정밀화합니다.
빌드 산출물(dist/ 등 원본 소스가 아닌 파일)은 오탐만 만들기 때문에 자동으로 제외되며, 무엇이 왜 제외됐는지 보고서에 표기됩니다.
망분리(폐쇄망) 환경에서 쓰기
외부 통신에 대해 먼저 알아두실 것:
소스 코드는 외부로 전송되지 않습니다. 모든 정적 분석은 로컬에서 수행됩니다.
검사 중 PC가 직접 부르는 외부 주소는 OSV(취약점 조회)와 PyPI·npm 레지스트리(패키지 실재·발행일) 뿐이고, 보내는 것은 패키지명·버전 같은 공개 식별자입니다. NVD·KNVD·CISA KEV·EPSS는 검사 중 접속하지 않습니다 — GitHub Actions가 매일 받아 번들로 제공하고 PC는 그 캐시만 읽습니다.
GVSKB_MODE=offline설정 시 외부 통신을 완전히 차단하고, 반입한 캐시와 로컬 룰만으로 동작합니다. 이때 자동 갱신은 공유 폴더(GVSKB_INTEL_DIR)만 확인하고 인터넷 주소는 시도하지 않습니다.인터넷이 제한된 서버(GitHub는 되고 OSV는 안 되는 경우)는 offline 모드로 두고, 예약 작업이 GitHub 릴리스에서 번들을 받아
GVSKB_INTEL_DIR폴더에 놓게 하면 됩니다. 서버가 열어야 할 외부 주소는 github.com 하나입니다.
위협 정보 반입 절차
1단계 (외부망 PC) — 번들 확보. 매일 자동 생성되는 공식 번들을 받는 방법(A, 권장)과 직접 수집하는 방법(B)이 있습니다.
# 방법 A — 공식 번들 내려받기 (매일 03:17 KST 갱신)
curl -LO https://github.com/Lex6won/vibecode-checker/releases/download/intel-latest/gvskb-intel-bundle.zip
curl -LO https://github.com/Lex6won/vibecode-checker/releases/download/intel-latest/gvskb-intel-bundle.zip.sha256
sha256sum -c gvskb-intel-bundle.zip.sha256 # OK 확인 후 반입 매체로 이동
# 방법 B — 직접 수집해 번들 만들기
gvskb update-intel --all # npm 패키지도 검사하려면: GVSKB_OSV_INCLUDE_NPM=1
gvskb intel-bundle export gvskb-intel-bundle.zip # 캐시 + sha256 목록을 zip 하나로2단계 (망분리 PC) — 반입·검증·사용.
gvskb intel-bundle import gvskb-intel-bundle.zip # 파일별 sha256 전수 검증 — 불일치 시 전체 거부
$env:GVSKB_MODE = "offline" # PowerShell (bash: export GVSKB_MODE=offline)
gvskb doctor --offline # 캐시 존재·신선도까지 점검
gvskb scan ./my-project --check-deps캐시 위치는 %USERPROFILE%\.gvskb\cache 입니다(환경변수 GVSKB_CACHE_DIR 로 변경 가능). 반입 결과는 gvskb update-intel --all --from-cache 로 소스별 항목 수·수집 시각·신선도를 확인할 수 있습니다.
반입 이후 자동화 — 관리자가 공유 폴더에 새 번들을 놓아두고 각 PC에 GVSKB_INTEL_DIR=\\공유폴더\경로 를 설정하면, 검사 시점에 자기 캐시보다 새 번들을 발견했을 때 자동 반입합니다(사용자 조작 불필요, 하루 1회 확인). 수동 동기화는 gvskb intel-sync, 상태 확인은 gvskb intel-sync --status.
오프라인 판정의 신뢰 장치
반입한 캐시는 읽을 때마다 sha256 무결성을 재검증합니다. 변조·손상된 캐시는 판정에 쓰지 않고 무시하며, 다시 받으라고 안내합니다.
캐시가 기본 30일(
GVSKB_INTEL_MAX_AGE_DAYS로 조정)을 넘으면 '이상 없음' 판정을 '판정 보류'로 낮춥니다 — 오래된 데이터가 최신처럼 보이지 않게 합니다.보고서에 어느 날짜 캐시 기준의 판정인지(피드별 수집 시각)가 자동 표기됩니다. KEV 등재 취약점에는 EPSS 악용확률·CVSS 점수가, CVE가 정확히 일치하는 취약점에는 KISA KNVD 국내 보안공지 링크가 함께 실려 보안팀이 우선순위를 정하고 국내 공지를 바로 확인할 수 있습니다.
반입 번들에는 알려진 취약점 DB(OSV 전체, 영향 버전 범위 포함)가 담겨, 망분리에서도 취약한 패키지 버전이 온라인 검사와 같은 기준으로 탐지되고 올려야 할 버전까지 권고됩니다(PyPI·npm).
오프라인에서 확인하지 못한 것(패키지 실재 여부·발행일 등)은 '판정 불가'로 명시합니다 — '안전'으로 바꿔 말하지 않습니다.
CI·자동화 — 게이트 · SBOM · 예외 관리
종료 코드로 커밋·배포 차단
gvskb scan 은 결과에 따라 종료 코드(exit code)를 반환하므로 CI에서 그대로 게이트로 쓸 수 있습니다.
종료 코드 | 의미 |
| 통과 — 게이트 판정 승인(조치할 것 없음) |
| 조건부 승인 — 사람이 할 일이 남음(소스 발견 · 취약 패키지 · 버전 미고정 · 라이선스 검토 · 검사 범위 결손) |
| 차단 — 악성 · 기관 거부 · 미존재 · CISA KEV · CVSS CRITICAL 패키지 |
| 판정 불가 — 검사된 파일이 없거나 필수 엔진이 돌지 않음('안전' 아님, v0.5.4) |
| 사용법 오류(잘못된 인자) |
| 경로를 찾을 수 없음 |
종료 코드는 보고서 결론 박스·JSON gate.verdict 와 같은 판정에서 나옵니다(v0.5.4 부터 — 그 전에는 소스 발견이
없으면 취약 패키지·미고정·검사 불완전도 0 이었습니다).
표기 차이는 설계입니다 — 같은 결과를 세 곳이 다른 말로 적습니다. 버그가 아닙니다.
체커 | 하네스(개발 PC) | 포털 |
종료 1 · |
|
|
종료 2 · |
|
|
종료 3 · |
|
|
종료 0 · |
|
|
하네스는 "막혔다/안 막혔다"만 구분하고 승인은 절대 하지 않으며, 포털은 사람이 볼 네 단계로 옮겨 적습니다. "개발 PC 에서는 막혔는데 포털에서는 검토"는 이 표 그대로입니다.
gvskb scan ./src --fail-on dependency # 의존성 차단만 실패(2) — 판정 불가·검사 불완전은 통과(임계값 정책)
gvskb scan ./src --fail-on block # 차단(2)과 판정 불가(3)만 실패, 조건부는 통과 — CI 게이트 권장
gvskb scan ./src --fail-on warn # 조건부(1)·차단(2)·판정 불가(3) 모두 실패 (기본값)
gvskb scan ./src --fail-on never # 항상 0 (보고서만 생성)처음 도입한다면 --fail-on dependency 부터 시작하세요. 패키지 판정("이 버전에 이 취약점이 있다")은 사실 조회라 오탐이 거의 없고, 소스 코드 판정은 맥락에 따라 오탐이 있을 수 있습니다. 게이트에 대한 신뢰가 쌓인 뒤 block 으로 올리는 것을 권장합니다.
SBOM — 만들기와 읽기
gvskb scan . --check-deps --sbom sbom.json # 검사하면서 CycloneDX 1.6 SBOM 생성
gvskb sbom vendor-sbom.json # 건네받은 SBOM 검사 (CycloneDX·SPDX JSON)컴포넌트마다 버전·라이선스·공급자 정보를 담고, 어떤 패키지가 어떤 패키지를 쓰는지(의존성 관계)도 함께 표시합니다 — 락파일(package-lock.json·poetry.lock 등)을 검사하면 전이 의존성까지, requirements.txt·package.json 같은 매니페스트만 있으면 직접 의존성까지 나옵니다. 판정하지 못한 컴포넌트도 SBOM에서 빼지 않고 사유를 남깁니다 — 빠지면 "그 패키지는 안전하다"로 읽히기 때문입니다. 엔진 버전과 룰셋 버전도 문서에 기록됩니다.
판정 재현 — 룰셋 고정
룰이 바뀌면 어제 통과한 코드가 오늘 차단될 수 있습니다. 코드 때문인지 룰 때문인지 구분하려면 룰셋을 고정하세요.
gvskb ruleset # 현재 룰셋 버전·지문 확인
export GVSKB_EXPECT_RULESET=2026.08.9 # 기대하는 룰셋 선언 — 다르면 보고서에 경고보고서 머리말의 「판정 기준」 줄에 엔진 x.y.z · 룰셋 YYYY.MM.N 이 항상 기록됩니다 — 판정을 재현하려면 둘 다 같아야 합니다. 여러 PC·서버에 깔린 설치본이 같은 커밋인지는 gvskb status --json 의 install_identity.commit_id 로 대조합니다(wheel 설치본도 빌드 시 커밋이 기록됩니다).
오탐·수용 위험을 '승인된 예외'로 관리
검사 대상 폴더에 .gvskb-exceptions.yaml 을 두면, 오탐이거나 기관이 위험을 수용하기로 결정한 발견을 기록을 남기면서 게이트만 통과시킵니다.
exceptions:
- rule_id: GOV-FLASK-DEBUG-001
file: app.py
line: 47 # 선택 — 지정하면 그 줄만
reason: 내부 개발서버 전용 — 외부 노출 없음
approved_by: 김보안(정보보안담당관)
expires: 2026-12-31 # 만료되면 자동으로 다시 차단reason·approved_by·expires 가 모두 있어야 유효합니다. 억제된 발견은 보고서의 '승인된 예외 내역'과 감사로그에 남습니다.
감사로그 · SARIF
감사로그:
GVSKB_AUDIT_DIR환경변수를 설정하면 스캔·차단·예외 승인·인텔 갱신 이력이 월별 JSONL로 기록됩니다. 원본 코드·개인정보는 저장하지 않고 해시와 마스킹된 증거만 남깁니다(기관 감사 증빙용, 기본 비활성).SARIF:
gvskb scan ./src --format sarif -o result.sarif— GitHub code scanning 업로드나 기관 보안도구 수집에 쓸 수 있습니다(SARIF 2.1.0).
name: security scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.11" }
- run: pip install git+https://github.com/Lex6won/vibecode-checker.git
- run: gvskb scan . --format markdown -o report.md --fail-on block
- if: always()
uses: actions/upload-artifact@v4
with: { name: security-report, path: report.md }# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: gvskb-scan
name: vibecode-checker 보안 스캔
entry: gvskb scan .
args: ["--format", "json", "--fail-on", "block"]
language: system
pass_filenames: false # scan은 경로 1개를 받음 — 파일 목록 전달 금지기여하기
룰은 코드가 아니라 Markdown 파일 한 장입니다. rules/ 아래에 frontmatter로 탐지 패턴·설명·예제를 적으면 됩니다.
gvskb validate-rules # 새 룰 형식·정규식 검증
gvskb evaluate # 룰 예제 기반 정밀도 측정
pytest -q # 전체 테스트새 룰에는 examples.positive/negative 를 넣어주세요 — 회귀 테스트로 자동 보증됩니다. 자세한 방법은 CONTRIBUTING.md 참고.
버그·오탐 제보 → Issues
새 룰·기능 제안 → Discussions
직접 고치기 → Pull Request (작은 PR 환영)
연락 · 문의
버그·기능 요청: GitHub Issues
사용 질문·아이디어: GitHub Discussions
보안 취약점 비공개 제보: SECURITY.md의 절차를 따라주세요
면책 · 라이선스
이 도구의 자동 점검은 공식 보안적합성 검토를 대체하지 않습니다. 비전공자가 명백한 실수를 1차로 걸러내고 학습하도록 돕는 보조 도구입니다.
치명·높음항목은 보안 담당자 검토를 권장하며, 기관별 보안 정책·개인정보 처리 기준을 함께 확인하세요.
정부·공공기관 지침(KISA·행안부·국정원), OWASP·NIST·CISA 등 외부 자료는 원문을 복제하지 않고 요약·인용·구조화하여 사용하며 각 출처의 이용 조건을 존중합니다.
라이선스
PolyForm Noncommercial License 1.0.0 + 수급사업자 사용 추가 허가 — LICENSE 참고.
공공기관·교육기관·연구기관·공공안전 기관의 사용은 재원과 무관하게 허용됩니다. 라이선스가 "government institution" 사용을 명시적으로 비상업 목적으로 규정합니다. 지방자치단체·중앙부처·공공기관이 자체 점검에 쓰는 것은 제약 없이 가능합니다.
공공사업을 수행하는 용역사·수급사업자도 그 계약 이행 목적에 한해 사용할 수 있습니다. PolyForm 본문만으로는 용역사의 사용이 덮이지 않아, 추가 허가를 부기했습니다. 수정본을 발주기관에 납품하는 것도 포함됩니다.
개인의 연구·학습·취미 목적 사용도 허용됩니다.
상업적 목적의 사용은 허용되지 않습니다. 예: 유료 보안 점검 서비스에 포함해 판매하거나, 자기 명의의 솔루션 제품에 번들해 공급하는 경우. 용역사의 계약 종료 후 사용도 허용되지 않습니다. 별도 상용 라이선스가 필요하면 문의해 주세요.
전달 시 LICENSE 파일 전체를 함께 전달해야 합니다. PolyForm 원문 URL만 전달하면 수급사업자 추가 허가가 따라가지 않습니다.
2026-08-01 이전에 MIT 로 배포된 버전에는 이 변경이 소급되지 않습니다. 해당 버전을 MIT 조건으로 받은 이용자의 권리는 그대로 유지됩니다.
Available Tools
15 toolscheck_packageA
단일 패키지의 실재·취약점·악성·발행경과일(쿨다운)을 설치 전에 확인합니다.
AI가 제안한 패키지를 pip/npm install 하기 전, 또는 이름이 수상한(오타 스쿼팅 의심) 패키지를 확인할 때 사용하세요. 매니페스트 전체를 검사하려면 scan_dependencies 를 씁니다.
판정(verdict): not_found=저장소에 없음(AI가 지어낸 이름 의심, 차단 권고) | malicious=악성 | vulnerable=알려진 취약점 | cooldown_hold=발행 직후라 대기 권고 | checked_clean=이상 없음 | unknown/error=판정 불가('안전' 아님) | registry_rejected=기관 레지스트리가 차단 | registry_approved=기관 레지스트리가 승인.
registry_* 는 이 도구의 관측이 아니라 기관의 결정입니다. 다만 malicious 는 승인보다 위입니다 — 승인은 시점의 판단이고 위협 정보는 그 뒤에도 갱신됩니다. registry_approved 인데 checked=false 면 '승인은 받았으나 이번에 로컬 위협 정보와 대조하지는 못했다'는 뜻입니다('안전 확인'이 아님).
네트워크: 온라인이면 공식 저장소(pypi.org/registry.npmjs.org)와 OSV.dev에 패키지명·버전만 전송합니다(코드 미전송). GVSKB_MODE=offline(망분리)이면 외부 호출 없이 로컬 인텔 캐시로 대체하며, 실재·발행일은 '미확인'으로 표시됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | 패키지 이름 (예: requests, express). 버전 표기 없이 이름만 | |
| caller | No | 호출 주체 자율 신고 (예: 'harness:auto', 'registry:manual'). 감사 구분용 | |
| version | No | 검사할 버전(권장). 미지정 시 전체 버전 이력 기준이라 판정이 보수적 | |
| ecosystem | No | 패키지 저장소: pypi(Python) | npm(Node.js) | pypi |
| env_grade | No | 실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. E3(대민·개인정보)는 바이브코딩 대상이 아니므로 받지 않음 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it enumerates every verdict value with meaning, warns that unknown/error is not 'safe', clarifies that registry_* reflect institutional decisions rather than this tool's observation (and that malicious outranks approval), explains registry_approved+checked=false as 'not verified safe', and discloses network behavior (name/version only, no code, to pypi.org/npmjs.org and OSV.dev) plus offline GVSKB_MODE fallback behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage lead the description, followed by a well-organized verdict glossary and a network/offline note. The verdict enumeration is long but load-bearing for a safety-critical tool; it is only mildly more verbose than necessary given output_schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a safety-gating tool with five parameters, no annotations, and an output schema, the description covers the decision space an agent needs: verdict meanings and their relative severity, the non-equivalence of 'unknown' to safe, network/offline behavior, and the pre-install decision context. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, version, ecosystem, caller, and env_grade in detail — including the version-vs-full-history conservatism tradeoff and the E0/E1/E2 cooldown windows. The description adds little parameter-level detail beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific action (verify a single package) plus the exact attributes checked — existence, vulnerabilities, maliciousness, publish cooldown — before install. It explicitly separates itself from the sibling scan_dependencies for whole-manifest inspection, so an agent can pick the right tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the triggering conditions directly ('before pip/npm install of an AI-suggested package', 'typosquatting-suspect names') and routes the full-manifest case to scan_dependencies. Both the when-to-use and the alternative are stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_secrets_and_piiA
시크릿(API 키·비밀번호·토큰)과 한국형 개인정보(주민등록번호·전화번호 등), 내부망 주소만 집중 탐지합니다.
"이 코드에 키/개인정보 들어있어?"처럼 유출 항목만 빠르게 확인할 때 쓰는 부분 집합 검사입니다. SQL 삽입·위험 명령 등 전체 보안 점검이 목적이면 scan_code / scan_path 를 쓰세요(이 탐지를 포함합니다).
코드를 외부로 보내지 않으며, 탐지된 값은 마스킹된 짧은 증거로만 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | 검사할 소스 코드 또는 설정 파일 텍스트 | |
| filename | No | 표시용 파일명 (예: config.py, .env) | <memory> |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers key behavioral facts: code is never sent externally, and detected values are returned only as short masked evidence. This is exactly the kind of disclosure an agent needs for a security scanner. It stops short of stating permission/auth requirements or performance characteristics, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, each earning its place: scope of detection first, then routing guidance to alternatives, then privacy/return behavior. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary; the description instead supplies the scope, the alternative-tool routing, and the data-handling guarantees. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (code, filename) are already documented in the schema, including the display-only nature of filename. The description adds no syntax, format, or constraint detail beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (detect) and precise resource scope: secrets (API keys/passwords/tokens), Korean-format PII (resident registration numbers, phone numbers), and internal network addresses. It explicitly positions itself as a subset check versus the broader scan_code / scan_path siblings, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the triggering scenario ('is there a key/PII in this code?') and the exclusion condition explicitly, naming the alternative tools (scan_code / scan_path) for full security checks and noting they include this detection. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ruleA
룰 ID로 보안 룰 전문(근거 출처·탐지 기준·안전한 수정 예시 포함)을 조회합니다.
스캔 결과의 finding.rule_id 나 search_rules 결과의 rule_id 로 "왜 이게 걸렸는지" 근거 규정과 상세 설명이 필요할 때 사용하세요. 네트워크 호출이 없으며, 없는 ID면 {"error": "rule not found"} 를 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | 룰 ID (예: NIS-AI-M01, OWASP-LLM-2025-01). finding.rule_id 또는 search_rules 결과에서 얻음 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose useful behavior: no network call is made and a missing ID returns {"error": "rule not found"}. Read-only intent is conveyed by '조회' (retrieve), but it is not stated outright, and no note on output size or caching is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences — what it returns first, then when to use it — with the error contract appended. No filler, and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and the description still covers the error case. For a single-parameter lookup with a documented upstream source of IDs, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single rule_id parameter already carries example IDs (NIS-AI-M01, OWASP-LLM-2025-01) plus its source. The description adds the same ID-source guidance but no format or validation detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve full security rule text by rule ID) and lists what the payload contains (evidence sources, detection criteria, safe remediation examples). This clearly distinguishes it from the sibling search_rules, which finds rules rather than fetching one by ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger — when the agent needs the rationale for why a finding fired — and names the ID sources (finding.rule_id, search_rules results), effectively documenting the upstream workflow. It never explicitly states the inverse (use search_rules to locate rules by keyword), so the alternative is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_loaded_rulesA
현재 서버에 적재된 전체 보안 룰 목록(ID·제목·심각도·계층)을 반환합니다.
디버깅·감사용입니다: 룰이 몇 개 적재됐는지, 특정 룰이 포함됐는지 확인할 때 쓰세요. 룰 내용 검색은 search_rules, 전문 조회는 get_rule 이 적합합니다. 네트워크 호출이 없습니다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses a behavioral trait beyond structure – 'no network calls,' implying a cheap local read – which is genuinely informative. However, it never explicitly states that the operation is read-only with no side effects, and gives no detail on ordering, stability, or scale of the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, followed by usage context, alternatives, and a brief behavioral note. Four short sentences, each earning its place, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained in depth, and with no input parameters there is nothing else to document. The description covers purpose, routing to siblings, and the no-network behavior, leaving no meaningful gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool takes zero parameters, so the baseline is 4. The description's listing of returned fields applies to output rather than input, so there is nothing parameter-level it needs to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource – returns the full list of security rules currently loaded on the server – and even enumerates the returned fields (ID, title, severity, layer). It cleanly distinguishes itself from sibling read tools by naming search_rules and get_rule as the alternatives for different retrieval needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes usage to debugging/auditing – checking how many rules loaded or whether a specific rule is present – and names the alternatives (search_rules for content search, get_rule for full-text lookup). The when-to-use and when-to-use-something-else conditions are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_reportA
ScanReport(scan_code / scan_path 결과)를 한국어 보고서로 만들고 파일로 저장합니다.
⚠️ 중요 — 반환된 내용을 별도 파일로 다시 저장하지 마세요.
이 도구가 이미 표준 위치에 저장했습니다. 반환값의 saved 에 담긴 경로를
사용자에게 그대로 알려 주세요. 에이전트가 임의 위치·이름으로 다시 저장하면
조직의 점검 이력이 흩어져 나중에 찾을 수 없습니다.
저장 규약: <검사한 경로>/.check-reports/YYYY-MM-DD_HHMM_보안점검.{html,md,json}
(기관 공용 폴더로 모으려면 환경변수 GVSKB_REPORT_DIR 을 설정합니다)
형식:
format="markdown": Markdown 본문(기본)
format="html": 자체 포함 단일 HTML(외부 CDN·JS 없음, 인쇄→PDF·이메일 가능)
format="both": Markdown + HTML 모두
format="sarif": SARIF 2.1.0 (CI·보안도구 연동, GitHub code scanning 업로드)
저장이 필요 없으면 save=False 로 문자열만 받습니다(파이프 연결 등).
출력은 자체 완결적이라 비전공 이해관계자 공유나 내부 승인 기록 첨부에 적합합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | 파일로도 저장할지(기본 True). False 면 문자열만 반환합니다 | |
| format | No | markdown(기본) | html(자체 포함 단일 파일) | both | sarif(CI 연동용 SARIF 2.1.0) | markdown |
| report | Yes | scan_code / scan_path 가 반환한 ScanReport JSON 을 그대로 전달 (필수 키: target, summary, findings — 직접 조립하지 말 것). scan_dependencies 결과가 있으면 dependency_audit 키에 넣어 병합 가능 | |
| output_dir | No | 저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/ |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full load and does so well: it discloses the exact save location convention, the GVSKB_REPORT_DIR env override, that the HTML is self-contained with no CDN/JS, that output is self-contained enough for stakeholder sharing, and the side effect that files are written at a standard location rather than by the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the warning precedes the details, which is the right ordering. The format bullet list partially restates the schema enum descriptions, so a small amount of the text is redundant with structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description correctly leans on the returned 'saved' path rather than re-explaining return values, and it covers input provenance, formats, save behavior and location override. The remaining gap is the unaddressed relationship to the save_report sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description goes beyond it by explaining what each format enum value is actually good for and by surfacing the GVSKB_REPORT_DIR environment variable, which appears nowhere in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('ScanReport → Korean report, saved to file'), names the input-producing siblings (scan_code/scan_path), and enumerates output formats. It does not, however, differentiate itself from the sibling save_report, so an agent cannot tell the two apart from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance per format (html for print→PDF/email, sarif for CI/GitHub code scanning, save=False for piping) and a strong when-not-to-do ('do not re-save the returned content'). The one missing piece is that it never mentions the save_report sibling as an alternative, which matters given the overlapping purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_reportA
점검 보고서를 파일로 저장하고 저장 경로를 알려줍니다.
render_report 는 본문 문자열만 돌려주므로, 그대로 두면 보고서가 대화창에만 남고 사라집니다. 결재·보고에 첨부하려면 이 도구로 저장하세요.
저장 규약: <검사한 프로젝트>/.check-reports/YYYY-MM-DD_HHMM_보안점검.{html,md,json}
HTML: 인쇄하면 그대로 PDF 결재 문서가 됩니다(외부 CDN 없음)
MD: 텍스트 편집·재가공용
JSON: 재검사·이력 비교용 원본 데이터 기관 공용 폴더로 모으려면 환경변수
GVSKB_REPORT_DIR을 설정하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| report | Yes | scan_code / scan_path 가 반환한 ScanReport JSON 그대로 (직접 조립 금지) | |
| output_dir | No | 저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/ 에 저장 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it largely does: it discloses the on-disk path convention, three output formats with their intended uses (HTML printable to PDF with no external CDN, MD for editing, JSON for history/redo), and the GVSKB_REPORT_DIR env var for a shared folder. It does not address overwrite behavior or permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return value in the first sentence, then structures the format details as a tight bullet list. Every sentence earns its place; no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, a nested-object schema, and the presence of an output schema (so return values need not be restated here), the description covers the missing pieces an agent needs: purpose vs sibling, destination path, format selection, and the shared-folder override.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds value beyond the field docs by spelling out the save convention and filename pattern, the format extensions, and the env-var override that governs where output_dir effectively resolves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('점검 보고서를 파일로 저장') and even names the return value (save path). It explicitly differentiates from the sibling render_report, explaining that render_report returns only the body string while this persists to a file, so the agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the when-to-use: if the report would otherwise vanish in the chat window and you need it for approval/reporting, use this tool. It names the concrete alternative (render_report) and the condition that selects save_report, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_codeA
코드 조각을 공공기관 보안 기준으로 점검(보안·검토·체크·검사)합니다.
사용자가 메모리에 있는 코드(붙여넣은 스니펫, 방금 생성한 코드)가 "안전한지", 개인정보·시크릿·SQL 삽입·위험한 코드 실행·LLM 위험이 있는지 묻거나, "보안 점검/검토/체크"를 요청하면 이 도구를 사용하세요. 파일·폴더 경로라면 대신 scan_path 를 씁니다.
코드를 외부 API로 보내지 않습니다. 시크릿·개인정보는 마스킹된 짧은 증거만 반환하며, 각 발견 사항에 why_it_matters(왜 위험한가)와 safe_fix(안전한 수정 방향)가 함께 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | 검사할 소스 코드 전문(파일이 아닌 텍스트). 파일·폴더는 scan_path 사용 | |
| caller | No | 호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용 | |
| profile | No | 정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service | public-default-strict |
| filename | No | 표시용 파일명. 확장자로 언어를 추정하므로 알면 넣기 (예: app.py) | <memory> |
| language | No | 언어 강제 지정 (예: python, javascript). 미지정 시 확장자·내용으로 추정 | |
| scenario | No | 용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add real behavioral context: code is never sent to an external API, secrets/PII are returned only as masked short evidence, and each finding carries why_it_matters and safe_fix. It still omits permissions, determinism, or cost/rate characteristics, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage triggers, then behavioral guarantees in three short paragraphs, each earning its place. Slightly verbose in listing synonyms (보안·검토·체크·검사), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no annotations but a present output schema, the description covers purpose, the key sibling alternative, and privacy/output behavior adequately; return-value structure can be deferred to the output schema. Minor gaps remain around the profile/scenario parameters' effect, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including the file-vs-text distinction for `code`. The description's reinforcement of 'in-memory code, not a path' duplicates what the schema states rather than adding syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (inspects code snippets against public-institution security standards) and enumerates the risk classes covered (PII, secrets, SQL injection, dangerous execution, LLM risk). It explicitly names the sibling it is not (scan_path) for path inputs, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers (user asks whether in-memory/pasted/generated code is 'safe' or requests a security check/review) and an explicit exclusion plus alternative ('if it's a file/folder path, use scan_path instead'). The when/when-not split is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_dependenciesA
의존성 매니페스트를 파싱해 각 패키지의 실재·취약점·악성·쿨다운을 일괄 검사합니다.
scan_path 결과에서 requirements.txt·package.json 이 '검사 제외'로 표시되면 이 도구로 이어서 검사하세요.
네트워크: 온라인이면 공식 저장소와 OSV.dev에 패키지명·버전만 전송합니다 (소스 코드 미전송). GVSKB_MODE=offline(망분리)이면 외부 호출 없이 로컬 인텔 캐시로 대체하며, 실재·발행일은 '미확인'으로 표시됩니다.
락파일을 넣으면 전이 의존성까지 검사합니다. 실무 취약점은 대부분 매니페스트에 적히지 않은 전이 의존성에 있으므로, 락파일이 있으면 그쪽을 넣는 편이 정확합니다 (버전도 범위가 아니라 고정값이라 판정이 확실해집니다).
결과를 scan_path 결과 JSON의 dependency_audit 필드에 넣어 render_report를
호출하면 사람용 보고서에 '의존성 취약점' 섹션이 함께 렌더됩니다.
truncated_count > 0 이면 limit 로 잘려 검사되지 않은 패키지가 있다는
뜻입니다 — '이상 없음'이 아니므로 limit 를 올려 재검사하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 검사할 최대 패키지 수. 미지정 시 형식에 맞춰 자동(매니페스트 20 · 락파일 500). 초과분은 truncated_count 로 표시 | |
| caller | No | 호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용 | |
| ecosystem | No | pypi | npm. 락파일이면 형식이 생태계를 확정하므로 이 값은 무시됩니다 | pypi |
| env_grade | No | 실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. | |
| manifest_text | Yes | 의존성 매니페스트 또는 **락파일**의 원문 텍스트. 매니페스트: requirements.txt·package.json / 락파일: package-lock.json·uv.lock·poetry.lock·pnpm-lock.yaml·yarn.lock |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses exactly what leaves the machine over the network (package name/version to official registry and OSV.dev, no source code), the offline (GVSKB_MODE=offline) fallback behavior and the resulting '미확인' status, that lockfiles widen coverage to transitive deps, and that truncated_count means packages were NOT scanned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then organized into clearly themed paragraphs (routing, network, lockfiles, report integration, truncation). Each paragraph carries actionable content, though the length is on the heavier side for a five-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a five-parameter tool with a full schema and an output schema. The description need not explain return values but still covers the two operational outputs that matter (dependency_audit field for render_report, and truncated_count as a warning signal).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: lockfile input causes ecosystem to be ignored, env_grade affects only the cooldown reference date and is not auto-detected, and limit defaults auto-scale to format. The only gap is that it doesn't tie these back to the parameter names explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resources ('의존성 매니페스트를 파싱해 각 패키지의 실재·취약점·악성·쿨다운을 일괄 검사'), and explicitly distinguishes itself from the sibling scan_path by naming the condition ('scan_path 결과에서 ... "검사 제외"로 표시되면 이 도구로 이어서 검사하세요'). An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule from scan_path, a strong preference rule for lockfiles over manifests (with the reason: transitive deps), and a recovery action when truncated_count > 0 ('limit 를 올려 재검사하세요'). It also tells the agent to leave env_grade blank when the user hasn't specified a deployment environment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_installed_packagesA
실제로 설치된 패키지까지 훑어 취약점·라이선스를 검사합니다.
scan_dependencies 는 requirements.txt·package.json 에 적힌 것만 봅니다. 그런데 취약점은 대개 그 파일에 없는 전이 의존성에 있습니다. 이 도구는 폴더 안의 설치 흔적을 직접 읽어 그 격차를 메웁니다:
.venv/site-packages 의*.dist-info/METADATA(이름·버전·라이선스)오프라인 반입용
*.whl파일명node_modules/*/package.json
패키지를 임포트·실행하지 않고 메타데이터 텍스트만 읽습니다. 네트워크는 취약점 조회에만 쓰이며 패키지명·버전만 전송합니다(GVSKB_MODE=offline 이면 로컬 인텔 캐시 사용). 라이선스 정보는 설치 메타데이터에서만 얻을 수 있어 이 도구에서만 함께 반환됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 프로젝트 폴더 경로. 하위의 .venv·*.whl·node_modules 설치 흔적을 훑습니다 | |
| limit | No | 검사할 최대 패키지 수 (기본 100) | |
| env_grade | No | 실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it enumerates exactly which files are read (.dist-info/METADATA, *.whl names, node_modules package.json), states that packages are never imported or executed, discloses that the network is used only for vulnerability lookup and only package names/versions are transmitted, mentions offline mode (GVSKB_MODE=offline), and notes licenses are returned only here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core distinction and well organized into a bulleted list of installation traces. It is somewhat long, with some detail that overlaps the schema's enum documentation, but nearly every sentence carries useful disambiguation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers behavior, side effects, network/privacy posture, and sibling differentiation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents path, limit, and env_grade (including the E0/E1/E2 meanings and cooldown semantics). The description adds little parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan) and resource (actually-installed packages, including transitive dependencies), and explicitly contrasts with the sibling scan_dependencies, which only reads manifest files. An agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (scan_dependencies) and the gap it covers (transitive dependencies missing from requirements.txt/package.json), which is clear routing guidance. It does not spell out explicit exclusions or when this tool would be the wrong choice, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_pathA
파일 또는 폴더를 공공기관 보안 기준으로 점검(보안·검토·체크·검사)합니다.
사용자가 "이 폴더/프로젝트 보안 점검해줘", "이 파일 검토/체크해줘", "안전한지 검사해줘"처럼 로컬 경로를 가리키면 이 도구를 사용하세요. 메모리의 코드 조각이면 대신 scan_code 를 씁니다. "기존 코드베이스 감사" 흐름의 진입점입니다.
경로를 로컬에서 순회하며 빌드·vendor 디렉터리를 건너뛰고 바이너리는 무시하며, 소스 코드를 외부 API로 전혀 보내지 않습니다. 각 발견 사항에는 why_it_matters 와 safe_fix 가 포함됩니다. 검사 후 render_report 로 한국어 보고서를 만드세요.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 검사할 로컬 파일 또는 폴더의 절대·상대 경로. 원격 URL 불가(먼저 clone) | |
| caller | No | 호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용 | |
| profile | No | 정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service | public-default-strict |
| scenario | No | 용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent | |
| max_files | No | 최대 검사 파일 수 (기본 20,000). 초과분은 skipped_files에 사유와 함께 기록 | |
| max_file_bytes | No | 파일 하나의 크기 상한(바이트, 기본 8,000,000). 넘는 실행 소스는 coverage.oversized_source_files 에 남고 게이트는 승인을 내리지 않는다 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does well: it states traversal is local, build/vendor directories are skipped, binaries ignored, and source is never sent to an external API — the key trust concern for this tool. It also previews that findings carry why_it_matters and safe_fix. What is missing is mask/coverage behavior on partial scans and any permission or gating caveats, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and trigger conditions are front-loaded in the first paragraph, with behavior and follow-up steps after. The parenthetical synonym lists ('보안·검토·체크·검사') and repeated framing add slight redundancy for keyword-matching reasons, but no sentence is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, a rich output schema, and no annotations, the description covers purpose, trigger, privacy behavior, finding shape, and the render_report follow-up — enough for correct invocation. It leaves profile/scenario selection semantics entirely to the schema, which is acceptable but is the one area an agent might still need guidance on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (path, caller, profile, scenario, max_files, max_file_bytes) is already documented in structured form. The description adds no syntax or default guidance beyond the schema — baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (점검/검사) plus the resource (local file or folder path) and the security standard being applied. It explicitly distinguishes itself from scan_code for in-memory snippets and names render_report as the downstream step, so an agent can place it among 15 siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives literal user phrasings that should trigger this tool ('이 폴더/프로젝트 보안 점검해줘', '이 파일 검토/체크해줘'), states the negative case (in-memory code → scan_code instead), and positions the tool as the entry point of the codebase-audit flow. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_sbomA
건네받은 SBOM 의 컴포넌트를 검사합니다 — 소스 코드가 없어도 됩니다.
조달·협력사가 SBOM 만 제출하는 경우, 또는 빌드 파이프라인이 이미 SBOM 을
만들어 두는 경우에 씁니다. scan_dependencies 가 매니페스트/락파일을 받는
것과 짝입니다.
읽지 못한 컴포넌트는 버리지 않고 skipped 에 사유와 함께 돌려줍니다.
purl 이 없거나 버전이 NOASSERTION 이면 취약점 판정이 불가능한데, 조용히
빼면 받는 쪽은 "그 컴포넌트는 안전하다"로 읽습니다 — 없는 것과 안 본 것은
다릅니다. truncated_count > 0 도 같은 뜻이니 limit 를 올려 재검사하세요.
반대 방향(우리 검사 결과를 SBOM 으로 내보내기)은 CLI 의
gvskb scan --check-deps --sbom <경로> 입니다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 검사할 최대 컴포넌트 수(기본 2000). 초과분은 truncated_count 로 표시 | |
| caller | No | 호출 주체 자율 신고. 감사 구분용 | |
| sbom_text | Yes | SBOM 파일 원문. CycloneDX JSON 또는 SPDX JSON (XML·tag-value 형식은 지원하지 않습니다) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: unreadable components are not dropped but returned in `skipped` with a reason, purl-less or NOASSERTION-versioned components cannot be judged, and truncated_count > 0 signals incomplete coverage requiring a higher limit. This tells the agent exactly how results can be silently incomplete—context that is not derivable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded in the first sentence, followed by usage cases, then the important caveat block. It is slightly long for a 3-parameter tool, but every paragraph (usage, skip semantics, export alternative) adds information rather than restating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still usefully explains the two fields that change how results must be interpreted (skipped, truncated_count). Authentication/permission requirements and the intent of the `caller` audit parameter are not mentioned, but for a read-style scan of caller-supplied text this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning about `limit`: exceeding it surfaces as `truncated_count` and the remedy is to raise the limit and re-scan. It says nothing extra about `caller` or `sbom_text`, which the schema already documents well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('SBOM 컴포넌트를 검사합니다') and immediately clarifies the key scope condition ('소스 코드가 없어도 됩니다'). It explicitly distinguishes itself from the sibling scan_dependencies ('매니페스트/락파일을 받는 것과 짝'), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete triggering scenarios (procurement/supplier submits only an SBOM; build pipeline already emits an SBOM) and names the counterpart tool for the other input shape (scan_dependencies). It also rules out one wrong direction—exporting results to SBOM is a CLI operation, not this tool—which is an explicit when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_vendor_bundlesA
벤더링된 프런트엔드 라이브러리(static/*.min.js)의 컴포넌트 취약점을 검사합니다.
scan_path 결과에 vendor_bundles 가 비어 있지 않으면 반드시 이 도구로
이어서 검사하세요. 이 파일들은 소스 룰 검사에서는 제외되지만(미니파이드라
오탐만 나옴) 그 자체가 프로젝트가 실행하는 남의 코드이고 알려진 취약점이 붙습니다.
package.json 도 node_modules 도 없는 프로젝트에서는 이것이 유일한
컴포넌트 발견 경로입니다(실측: xlsx 0.18.5 → CVE-2023-30533 등).
버전을 확정하지 못한 번들은 조회하지 않고 '판정 불가'로 남깁니다 — 추측한 버전으로 취약점을 단정하지 않기 위해서입니다. 판정 불가는 '안전'이 아닙니다.
결과를 scan_path 결과 JSON 의 dependency_audit 에 넣어 render_report 를
호출하세요. 이미 scan_dependencies 결과가 있다면
{"audits": [<의존성 결과>, <이 결과>]} 형태로 합쳐 넣습니다.
| Name | Required | Description | Default |
|---|---|---|---|
| caller | No | 호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용 | |
| env_grade | No | 실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. | |
| vendor_bundles | Yes | scan_path 결과 JSON 의 `vendor_bundles` 값을 **그대로** 전달 (직접 조립하지 말 것). 각 항목: {path, name, version, evidence, ecosystem} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses a fail-closed policy (bundles whose version can't be pinned are not queried and left as 'undecidable', and 'undecidable' ≠ 'safe') and explains why guessing is avoided. It does not discuss network calls, caching, or rate limits, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the when-to-use condition, then caveats and workflow. Every sentence carries content, though the multi-paragraph block is longer than strictly needed for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format explanation is unnecessary. The description supplies everything else an agent needs: the trigger condition, the pass-through input contract, the fail-closed semantics, and the downstream render_report integration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description's only parameter-adjacent guidance (pass vendor_bundles verbatim from scan_path, don't hand-assemble) is already stated in the schema's own property description, so the description adds no meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: scanning component vulnerabilities in vendored frontend libraries (`static/*.min.js`). It explicitly contrasts with source-rule scanning (minified files are excluded there) and with package-manager auditing, letting an agent separate it from scan_dependencies and scan_path without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('if scan_path's vendor_bundles is non-empty, you MUST scan next'), an exclusion rationale (source rules produce only false positives on minified code), and the fallback case (no package.json / node_modules → this is the only component-discovery path). It also prescribes the downstream workflow: merge into dependency_audit with scan_dependencies results and call render_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rulesA
보안 가이드 룰(기준선 + 실시간 인텔)을 키워드로 검색합니다.
특정 취약점 유형의 근거 규정·안전한 대안이 궁금할 때, 또는 스캔 결과의 rule_id 외에 관련 룰을 더 찾고 싶을 때 사용하세요. 코드 검사가 목적이면 이 도구가 아니라 scan_code / scan_path 를 씁니다.
로컬에 적재된 룰만 조회하며 네트워크 호출이 없습니다. 반환되는 results의 각 항목에는 rule_id가 있어 get_rule 로 전문을 조회할 수 있습니다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최대 반환 건수 (기본 5) | |
| query | Yes | 검색어(한국어·영어 키워드, 룰 제목·본문·태그 대상). 예: 'SQL 삽입', 'hardcoded secret' | |
| status | No | 룰 상태로 필터. proposed=실시간 인텔이 자동 생성한 검토 대기 룰 | |
| language | No | 프로그래밍 언어로 필터 (예: python, javascript) | |
| scenario | No | 시나리오 태그로 필터. 값: web-app | data-pipeline | llm-integration | agent | |
| severity_min | No | 이 심각도 이상만 반환 | |
| approved_only | No | True면 승인(approved)된 룰만 — 자동 생성 proposed 룰 제외 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it discloses that only locally loaded rules are searched, that there are no network calls, and that each result carries a rule_id for a follow-up get_rule call. It omits result ordering/pagination behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage/exclusions, then behavior and output chaining across three tight paragraphs. Each sentence earns its place, though the description is a touch longer than strictly necessary for a search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value detail is unnecessary, and the description covers purpose, usage, exclusions, offline behavior, and the follow-up get_rule chain. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 7 parameters (query, status, language, scenario, severity_min, approved_only, limit) are already documented in the schema. The description adds no parameter-level semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (security guide rules, baseline + real-time intel) with an explicit scope note that only locally loaded rules are queried. It distinguishes itself from scan_code/scan_path by naming them as the wrong tool for code inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers: finding the rationale/regulation behind a vulnerability type, safe alternatives, or related rules beyond a scan's rule_id. It also states when NOT to use it (code inspection → scan_code / scan_path), which is exactly the routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusA
Return runtime diagnostics: install identity, rules dir, rule counts, env.
Use this from any MCP client (Claude, Cursor, Codex, ...) to verify the server is healthy and to see which rules are loaded. No network calls.
설치 신원을 함께 돌려준다 — 버전 문자열만 믿지 마세요:
runtime_freshness.process_stale— 먼저 이것을 보세요. 돌고 있는 프로세스가 디스크의 현재 코드·룰을 쓰고 있는지.true면 판정 결과가 낡은 룰에서 나온 것이므로, 결과를 해석하기 전에remedy대로 서버를 재시작해야 한다(재설치가 아니다 — 룰과 코드는 프로세스 시작 시점에 한 번만 읽힌다).commit_id— 이 프로세스가 임포트한 시점의 커밋(pipdirect_url.json또는 소스 체크아웃의.git/HEAD). 디스크의 현재 커밋은install_identity.disk_commit_id이고, 둘이 다르면 낡은 것이다.__version__은 릴리스 사이에 고정돼 최근 변경분을 구분하지 못한다.total_rules— 메모리에 올라간 룰 수(rule_count_source로 출처 표기). 디스크를 다시 읽은 수가 아니므로, 이 값이 늘었다고 최신인 것은 아니다. 인텔 캐시 룰이 섞여 최신처럼 보인 사례가 있다.mcp_tools/missing_tools— 이 설치본이 실제로 제공하는 도구 목록. 필요한 도구 이름이mcp_tools에 없으면 낡은 설치본이므로, 호출 실패 증상으로 역추적하지 말고 재설치하면 된다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description carries the load well: it discloses 'No network calls' and, more importantly, explains that results may originate from stale in-memory code/rules and that the remedy is a server restart (not reinstall). That is meaningful operational context beyond any structured field, though it never explicitly states the tool is read-only/idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and usage are well front-loaded in the first two English sentences, but the memo then runs long and switches into Korean, mixing languages and spending most of its length on output-interpretation detail. Much of that duplicates what the existing output schema should carry, so not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic with an output schema, the definition is more than sufficient — arguably over-complete, since it interprets return fields the output schema already defines. The added value (how to detect and fix a stale process) is genuinely useful, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this scores 4. The description's field-by-field guidance (process_stale, commit_id, total_rules, mcp_tools) concerns return values rather than inputs, so it cannot add input semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Return runtime diagnostics') and enumerates exactly what is returned ('install identity, rules dir, rule counts, env'). This distinguishes it from siblings like list_loaded_rules, get_rule, and scan_path, whose names describe different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'to verify the server is healthy and to see which rules are loaded,' and from any MCP client. It does not, however, name or exclude alternatives despite overlapping siblings (list_loaded_rules also reports loaded rules), so the routing guidance is clear but not fully disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_fixA
발견 사항(finding)에 대한 공무원 친화적 안전 수정 방향을 반환합니다.
스캔 결과의 특정 finding을 "어떻게 고치죠?"라고 물을 때 rule_id로 호출하세요. 쉬운 제목(plain_title), 안전한 수정 방향(safe_fix), 자동 수정 가능 여부(can_auto_fix)를 돌려줍니다. 네트워크 호출이 없으며, 자동 수정은 diff 미리보기 후 담당자 확인을 거쳐 적용해야 합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | 스캔 결과 finding.rule_id 값 (예: NIS-AI-M01) | |
| unsafe_code | No | 문제가 된 코드 조각(선택). 넣으면 마스킹된 미리보기가 함께 반환됨 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it discloses real behavioral traits: no network calls, and auto-fix must go through diff preview plus human confirmation before applying. These are the kind of operational facts an agent needs. It does not mention authentication or rate-limit behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is well front-loaded: purpose, then when to call, then return fields, then the safety caveat. Each sentence carries distinct information with minimal redundancy. It is slightly verbose in re-listing return fields that the output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description usefully still names them. Given the absence of annotations, the coverage of no-network behavior and the confirmation-gated auto-fix path makes this complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents rule_id and the optional unsafe_code with its masking-preview behavior. The description adds the calling convention (invoke by rule_id) but contributes little parameter meaning beyond what the schema provides, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns a safe fix direction for a finding, and it enumerates the returned fields (plain_title, safe_fix, can_auto_fix). This clearly separates it from scanner siblings like scan_code or get_rule, though it never names a sibling explicitly to reinforce the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: call with rule_id when asking 'how do I fix this?' for a specific finding. That is clear context for invocation. It omits any when-not guidance or comparison to alternatives such as get_rule, so it stops just short of full routing clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.5.4- Changed
check_package5 fields changed- added
Input schema / properties / callerAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "호출 주체 자율 신고 (예: 'harness:auto', 'registry:manual'). 감사 구분용" +} - added
Input schema / properties / ecosystem / descriptionAdded value: +"패키지 저장소: pypi(Python) | npm(Node.js)" - added
Input schema / properties / env_gradeAdded value: +{ + "anyOf": [ + { + "enum": [ + "E0", + "E1", + "E2" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. E3(대민·개인정보)는 바이브코딩 대상이 아니므로 받지 않음" +} - added
Input schema / properties / name / descriptionAdded value: +"패키지 이름 (예: requests, express). 버전 표기 없이 이름만" - added
Input schema / properties / versionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "검사할 버전(권장). 미지정 시 전체 버전 이력 기준이라 판정이 보수적" +}
- Changed
detect_secrets_and_pii2 fields changed- added
Input schema / properties / code / descriptionAdded value: +"검사할 소스 코드 또는 설정 파일 텍스트" - added
Input schema / properties / filename / descriptionAdded value: +"표시용 파일명 (예: config.py, .env)"
- Changed
get_rule1 field changed- added
Input schema / properties / rule_id / descriptionAdded value: +"룰 ID (예: NIS-AI-M01, OWASP-LLM-2025-01). finding.rule_id 또는 search_rules 결과에서 얻음"
- Changed
render_report4 fields changed- added
Input schema / properties / format / descriptionAdded value: +"markdown(기본) | html(자체 포함 단일 파일) | both | sarif(CI 연동용 SARIF 2.1.0)" - added
Input schema / properties / output_dirAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/" +} - added
Input schema / properties / report / descriptionAdded value: +"scan_code / scan_path 가 반환한 ScanReport JSON 을 그대로 전달 (필수 키: target, summary, findings — 직접 조립하지 말 것). scan_dependencies 결과가 있으면 dependency_audit 키에 넣어 병합 가능" - added
Input schema / properties / saveAdded value: +{ + "default": true, + "description": "파일로도 저장할지(기본 True). False 면 문자열만 반환합니다", + "type": "boolean" +}
- Added
save_report - Changed
scan_code6 fields changed- added
Input schema / properties / callerAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용" +} - added
Input schema / properties / code / descriptionAdded value: +"검사할 소스 코드 전문(파일이 아닌 텍스트). 파일·폴더는 scan_path 사용" - added
Input schema / properties / filename / descriptionAdded value: +"표시용 파일명. 확장자로 언어를 추정하므로 알면 넣기 (예: app.py)" - added
Input schema / properties / language / descriptionAdded value: +"언어 강제 지정 (예: python, javascript). 미지정 시 확장자·내용으로 추정" - added
Input schema / properties / profile / descriptionAdded value: +"정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service" - added
Input schema / properties / scenario / descriptionAdded value: +"용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent"
- Changed
scan_dependencies8 fields changed- added
Input schema / properties / callerAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용" +} - added
Input schema / properties / ecosystem / descriptionAdded value: +"pypi | npm. 락파일이면 형식이 생태계를 확정하므로 이 값은 무시됩니다" - added
Input schema / properties / env_gradeAdded value: +{ + "anyOf": [ + { + "enum": [ + "E0", + "E1", + "E2" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다." +} - added
Input schema / properties / limit / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +null - added
Input schema / properties / limit / descriptionAdded value: +"검사할 최대 패키지 수. 미지정 시 형식에 맞춰 자동(매니페스트 20 · 락파일 500). 초과분은 truncated_count 로 표시" - removed
Input schema / properties / limit / typeRemoved value: -"integer" - added
Input schema / properties / manifest_text / descriptionAdded value: +"의존성 매니페스트 또는 **락파일**의 원문 텍스트. 매니페스트: requirements.txt·package.json / 락파일: package-lock.json·uv.lock·poetry.lock·pnpm-lock.yaml·yarn.lock"
- Added
scan_installed_packages - Changed
scan_path7 fields changed- added
Input schema / properties / callerAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용" +} - added
Input schema / properties / max_file_bytesAdded value: +{ + "default": 8000000, + "description": "파일 하나의 크기 상한(바이트, 기본 8,000,000). 넘는 실행 소스는 coverage.oversized_source_files 에 남고 게이트는 승인을 내리지 않는다", + "type": "integer" +} - changed
Input schema / properties / max_files / defaultPrevious value: -500New value: +20000 - added
Input schema / properties / max_files / descriptionAdded value: +"최대 검사 파일 수 (기본 20,000). 초과분은 skipped_files에 사유와 함께 기록" - added
Input schema / properties / path / descriptionAdded value: +"검사할 로컬 파일 또는 폴더의 절대·상대 경로. 원격 URL 불가(먼저 clone)" - added
Input schema / properties / profile / descriptionAdded value: +"정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service" - added
Input schema / properties / scenario / descriptionAdded value: +"용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent"
- Added
scan_sbom - Added
scan_vendor_bundles - Changed
search_rules7 fields changed- added
Input schema / properties / approved_only / descriptionAdded value: +"True면 승인(approved)된 룰만 — 자동 생성 proposed 룰 제외" - added
Input schema / properties / language / descriptionAdded value: +"프로그래밍 언어로 필터 (예: python, javascript)" - added
Input schema / properties / limit / descriptionAdded value: +"최대 반환 건수 (기본 5)" - added
Input schema / properties / query / descriptionAdded value: +"검색어(한국어·영어 키워드, 룰 제목·본문·태그 대상). 예: 'SQL 삽입', 'hardcoded secret'" - added
Input schema / properties / scenario / descriptionAdded value: +"시나리오 태그로 필터. 값: web-app | data-pipeline | llm-integration | agent" - added
Input schema / properties / severity_min / descriptionAdded value: +"이 심각도 이상만 반환" - added
Input schema / properties / status / descriptionAdded value: +"룰 상태로 필터. proposed=실시간 인텔이 자동 생성한 검토 대기 룰"
- Changed
suggest_fix2 fields changed- added
Input schema / properties / rule_id / descriptionAdded value: +"스캔 결과 finding.rule_id 값 (예: NIS-AI-M01)" - added
Input schema / properties / unsafe_code / descriptionAdded value: +"문제가 된 코드 조각(선택). 넣으면 마스킹된 미리보기가 함께 반환됨"
1 tool update
v0.2.1- Changed
render_report1 field changed- changed
Input schema / properties / format / enumPrevious value: -[ - "markdown", - "html", - "both" -]New value: +[ + "markdown", + "html", + "both", + "sarif" +]
11 tool updates
v0.1.0- First observed
check_package - First observed
detect_secrets_and_pii - First observed
get_rule - First observed
list_loaded_rules - First observed
render_report - First observed
scan_code - First observed
scan_dependencies - First observed
scan_path - First observed
search_rules - First observed
server_status - First observed
suggest_fix
TDQS
Scored across 15 tools
The scan_code/scan_path distinction is well-documented, but scan_dependencies influences understanding. The boundaries between save_report and render_report are blurry, as both appear to save files, and the distinction between scan_dependencies and scan_installed_packages requires careful reading to understand the difference between declared and installed packages.
Mostly consistent snake_case with verb_noun pattern (get, search, scan, detect, check, render). Some minor deviations like list_loaded_rules and server_status, but generally predictable and readable.
15 tools is on the higher end but reasonable for a comprehensive security scanning suite covering code, dependencies, SBOM, and vendor bundles. Each tool addresses a distinct scanning need without excessive redundancy.
Covers the major security scanning surfaces well: code scanning, dependency checking, SBOM analysis, secret detection, and reporting. The inclusion of suggest_fix and rule browsing provides good lifecycle support, though integration with CI/CD or remediation automation could be more complete.
Maintenance
Related MCP Connectors
Audit your MCP servers for poisoned tools and leaked secrets, and check AI-generated code for flaws.
Zero-config MCP security scanner for AI-generated apps. 25K+ vulnerability patterns.
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
Scan any public GitHub MCP-server repo for security issues. 37 MCP-specific L1 rules, 8 languages.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that securely reviews AI-generated code for vulnerabilities such as SQL injection, command injection, and hardcoded credentials.12Apache 2.0
- FlicenseNot gradedqualityDmaintenanceMCP server for AI-powered code security, quality, and performance review. Enables auditing code directly from VS Code via right-click or MCP tools.-
- AlicenseBqualityCmaintenanceAn AI-native code security audit MCP server that supports multi-language AST analysis, call graph analysis, vulnerability detection, and AI deep audit.71MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server for AI security analysis, enabling vulnerability scanning, sensitive information leak detection, and GitHub code leak monitoring via 48 tools.MIT