Skip to main content
Glama
Lex6won
by Lex6won

vibecode-checker

AI가 만든 코드를 한국 공공기관 보안 기준으로 점검합니다.

AI 코딩 도구(ChatGPT·Claude·Copilot·Cursor)로 만든 코드에 숨은 개인정보 노출 · API 키 · SQL 삽입 · 위험한 명령 실행 · 취약 패키지를 찾아 배포 승인 / 미승인 / 보류 결론과 조치 방법을 한국어 보고서로 줍니다. 코드는 PC 밖으로 나가지 않고, 판정 근거(엔진·룰셋·위협 정보 수집 시각)가 보고서에 남습니다.

License Python Tests 독립 벤치마크 룰 오프라인

https://github.com/user-attachments/assets/f2a817ae-0a8d-440f-a832-b78bcdd05540

▶ 20초 소개 영상 — 재생 버튼을 누르면 시작합니다. (원본 MP4 파일)


이 도구가 하는 일

  1. 검사 — 폴더를 주면 소스 코드(Python·JavaScript·TypeScript), 사용 중인 패키지(PyPI·npm), 폴더에 직접 넣어둔 라이브러리 파일(static/*.min.js), 그리고 저장소를 열거나 AI 도구를 켜면 실행되는 설정 파일(.vscode·.claude·MCP·CI 워크플로·설치 스크립트)까지 한 번에 봅니다. 코드는 외부로 전송되지 않고, 검사 대상의 어떤 스크립트도 실행하지 않습니다.

  2. 판정 — 발견을 심각도(치명·높음·보통)와 조치(차단·경고·허용)로 나누고, 코드와 패키지를 함께 보고 결론 하나를 냅니다: 배포 승인 가능 / 미승인(차단) / 보류(확인 필요). 확인하지 못한 것은 "안전"이 아니라 "판정 불가"로 적습니다.

  3. 보고서 — 무엇이 위험한지 → 왜 위험한지 → 어떻게 고치는지(안전한 코드 예시)를 한국어로 정리합니다. HTML 보고서를 인쇄하면 그대로 PDF 결재 문서가 됩니다.

쓰는 방법은 두 가지이고, 설치는 하나로 둘 다 됩니다.

  • 터미널: gvskb scan ./내프로젝트

  • AI 코딩 도구(VS Code·Claude Desktop·Cursor·Claude Code)에 연결한 뒤 자연어로: "이 폴더 보안 검사 해줘"

Related MCP server: CodeAudit Agent

다른 도구와 다른 점

내용

한국 공공기관 기준

KISA 시큐어코딩·행안부 개발보안·국정원 AI 가이드를 룰에 직접 반영합니다. 발견마다 "왜 위험한지 → 어떻게 고치는지"를 출처와 함께 한국어로 제시합니다.

비전문가용 보고서

보고서 맨 위에 배포 승인/미승인 결론이 먼저 나옵니다. 보안 지식 없이 결론과 조치 가이드(3단계)만 따라 하면 됩니다. 상세 근거는 보안팀용으로 접혀 있습니다.

코드+패키지 통합 판정

코드가 문제없어도 취약한 패키지를 쓰면 승인되지 않습니다. package.json 없이 폴더에 넣어둔 라이브러리 파일도 버전을 식별해 알려진 취약점과 대조합니다.

망분리(폐쇄망) 지원

GVSKB_MODE=offline 설정으로 외부 통신을 완전히 차단하고 동작합니다. 위협 정보(취약점·악성 패키지·실제 악용 목록·국내 보안공지)는 매일 자동 생성되는 반입 번들 하나로 옮기며, 파일별 sha256으로 변조를 검증합니다.

판정의 한계를 표시

"판정하지 못함"을 "안전"으로 바꿔 말하지 않습니다. 검사한 파일이 0개면 경로를 확인하라고 말하고, 캐시가 오래되면 판정을 보류로 낮추고, 검사 엔진이 빠졌으면 어떤 엔진이 빠졌는지 결과에 남기고, 탐지 못 하는 항목은 성능 표에 공개합니다.

판정을 재현할 수 있음

보고서마다 엔진 버전·룰셋 지문·위협 정보 수집 시각이 기록되고, gvskb status 로 설치본이 어느 커밋인지 확인됩니다. 어제 통과한 코드가 오늘 차단되면 코드 때문인지 룰 때문인지 구분할 수 있습니다.

자동화 연결

종료 코드로 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 과 MCP scan_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 %APPDATA%\Claude\claude_desktop_config.json · macOS ~/Library/Application Support/Claude/claude_desktop_config.json

Cursor

프로젝트 .cursor/mcp.json 또는 전역 ~/.cursor/mcp.json (설정 → MCP) — 키 mcpServers

VS Code (Copilot Agent)

워크스페이스 .vscode/mcp.json — 키가 servers(≠mcpServers)이고 "type": "stdio" 필요. 아래 스니펫 참고

Claude Code (CLI)

프로젝트 루트 .mcp.json (키 mcpServers, 이 저장소의 .mcp.json 참고) · 또는 claude mcp add 명령

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가지

  1. gvskb-server 를 찾지 못함 → PATH에 없는 경우입니다. 실행 파일의 전체 경로로 바꾸세요. gvskb doctor 가 실행되는 환경이면 gvskb-server 도 같은 위치에 있습니다.

  2. Windows에서 command 를 python 으로 지정했는데 서버가 뜨지 않음 → python 이 Microsoft Store 스텁으로 연결된 경우입니다. gvskb-server 를 그대로 쓰거나, 인터프리터 전체 경로(예: C:\Python313\python.exe)를 지정하세요.

  3. 룰을 갱신했는데 판정이 그대로 → 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개 항목 결과표(항목별 발견 수 — '자동 탐지 없음'인 항목은 사람 점검 대상)와 검사 엔진 절(가동한 엔진·미가동 선택 엔진의 사유)이 붙습니다. 결재 문서에 그대로 쓸 수 있습니다.

무엇을 탐지하나

흔한 실수 유형

유형

예시

코드에 박힌 비밀값

DB_PASSWORD = "P@ssw0rd", API 키, JWT 토큰

개인정보 노출

주민등록번호·전화번호 평문 저장, 로그 출력

SQL 삽입

"SELECT … WHERE name='" + name + "'"

위험한 코드 실행

eval(), exec(), os.system(사용자입력)

웹 취약점

XSS, 경로 조작, 응답에 그대로 실리는 비밀번호·로그인 링크, Flask debug=True 배포

취약·가짜 패키지

알려진 CVE, 오타를 노린 typosquat(reqeusts)

폴더에 넣어둔 외부 라이브러리

static/xlsx.full.min.js 처럼 직접 받아둔 파일 — 라이브러리·버전을 식별해 알려진 취약점과 대조 (package.json 이 없어도 검사)

AI 특화 위험

프롬프트 인젝션(신뢰할 수 없는 입력이 LLM 프롬프트에 결합), 프롬프트에 개인정보 전송, LLM 출력 무검증 실행

외부 데이터 전송

외부 AI API·플러그인이 어디로(국외 포함) 무슨 데이터를 보내는지 목록으로 정리(검토용 — 사용 금지가 아님)

폐쇄망 배포 영향

CDN 스크립트·웹폰트 등 외부 리소스 로딩과 외부 API 호출 표시 — 폐쇄망에서 화면·기능이 깨질 지점을 배포 전에 확인

저장소를 열면 실행되는 설정

.vscode/tasks.json(폴더 열면 실행), .claude/settings.json 훅·권한 우회, MCP 서버 설정(npx -y 비고정·자동 승인), *.pth·sitecustomize.py(파이썬 기동 시 실행)

CI·패키지 공급망

GitHub Actions 의 PR 코드 실행·비밀값 덤프·스크립트 삽입·curl | sh, npm 설치 스크립트·락파일 출처·.npmrc, Node/Python/Electron 지원 종료 버전, 패키지의 이전 판과 달라진 점(관리자 교체·패치판 크기/의존성 급변·설치 스크립트 신설·저장소 이동·신생 AI 어휘 이름)

숨은 문자

보이지 않는 유니코드(제로폭·변형 선택자)·양방향 제어 문자로 가린 코드

에이전트·스틸러 행위

AI 코딩 CLI 를 권한 확인 없이 호출, 자격증명 파일 여러 개를 읽어 외부로 전송, 공개 텍스트 호스트에서 받아 바로 실행(dead-drop)·웹훅·DNS 명령 채널, 지시 파일(CLAUDE.md 등)의 위험 지시 + 권한 우회 결합

플랫폼별 보안 설정

Electron(nodeIntegration·IPC 노출), VS Code 확장(Workspace Trust), 브라우저 확장(광범위 권한·헤더 제거·메시지 검증), MCP 서버(도구 인자 미검증·Origin) — 해당 의존성이 있을 때만 검사

관리자 인가 부재

관리자·설정·사용자 삭제 경로에 서버측 인증·역할 검사 근거가 없는 경우, 공개 번들 환경변수(NEXT_PUBLIC_*)에 든 PIN·비밀, 브라우저 저장소만으로 세운 관리자 관문

룰과 출처

탐지 룰은 한국 정부·국제 보안 가이드를 근거로 작성되며, 발견마다 출처를 함께 제시합니다.

출처

반영

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] 설치 시 8개) — 악의적으로 숨긴 코드는 놓칠 수 있습니다

타입스크립트

별도 TS 채점표(eval_corpus/projects/k_ts_2026/, 18문제 + 정상 코드 6종)에서 17/17 탐지 · 오탐 0(선택 엔진 설치 기준, 미설치 시 4문제는 채점 제외). 파일을 넘나드는 값의 출처 확인 1건은 알려진 공백

탐지하지 못하는 유형

보안 지침이 요구하는 항목 중 현재 탐지하지 못하는 15건을 목록으로 공개하고 있습니다

정적 분석의 한계

설계·권한·업무 로직상 취약점, 실행 중에만 드러나는 취약점은 잡지 못합니다

값의 출처 추적

JS 는 기본 설치에서 줄 단위로 변수를 따라갑니다. 함수 경계를 넘거나 다른 모듈에서 오는 값은 "출처 미상"으로 남아 사람이 확인해야 합니다. 선택 엔진(pip install vibecode-checker[ts])을 설치하면 글자를 쪼개 가린 eval 같은 변형을 더 잡지만, 파일 간 흐름은 아직 한계입니다

외부 보호 장치

관리자 경로에 인증 검사가 보이지 않으면 "보호 근거 없음(미확인)"으로 적습니다. SSO·리버스 프록시가 보호하는 경우는 제출물로 알 수 없으니 검토 의견에 적어 주세요

그래서 두 가지를 기억해 주세요:

  • 발견 0건이 "안전"을 보장하지 않습니다. 보고서의 '검토 범위 및 한계'에도 같은 내용이 명시됩니다.

  • 이 도구는 명백한 실수를 1차로 걸러내는 도구이며, 보안담당자의 공식 보안성 검토를 대체하지 않습니다.


표시된 항목이 실제로는 문제없다면 (오탐)

이 도구는 위험을 놓치는 것보다 한 번 더 알리는 쪽을 택했습니다. 따라서 맥락상 안전한 코드가 표시될 수 있습니다. 이렇게 처리하세요:

  1. 먼저 확인 — 보고서의 발견 항목에는 증거 코드와 파일·줄 번호가 함께 실립니다. 특히 판정 근거가 "패턴 일치만" 으로 표시된 항목은 값의 출처를 사람이 확인해야 합니다.

  2. 오탐이 맞다면 '승인된 예외'로 등록 — 검사 폴더에 .gvskb-exceptions.yaml 을 만들어 등록하면, 그 항목은 게이트(배포 판정)에서 제외되면서 승인자·사유·만료일이 보고서에 기록됩니다. 발견을 숨기는 것이 아니라 결정을 기록하는 방식입니다.

  3. 반복되는 오탐은 제보 — Issues에 알려주시면 룰을 정밀화합니다.

빌드 산출물(dist/ 등 원본 소스가 아닌 파일)은 오탐만 만들기 때문에 자동으로 제외되며, 무엇이 왜 제외됐는지 보고서에 표기됩니다.


망분리(폐쇄망) 환경에서 쓰기

외부 통신에 대해 먼저 알아두실 것:

  1. 소스 코드는 외부로 전송되지 않습니다. 모든 정적 분석은 로컬에서 수행됩니다.

  2. 검사 중 PC가 직접 부르는 외부 주소는 OSV(취약점 조회)와 PyPI·npm 레지스트리(패키지 실재·발행일) 뿐이고, 보내는 것은 패키지명·버전 같은 공개 식별자입니다. NVD·KNVD·CISA KEV·EPSS는 검사 중 접속하지 않습니다 — GitHub Actions가 매일 받아 번들로 제공하고 PC는 그 캐시만 읽습니다.

  3. GVSKB_MODE=offline 설정 시 외부 통신을 완전히 차단하고, 반입한 캐시와 로컬 룰만으로 동작합니다. 이때 자동 갱신은 공유 폴더(GVSKB_INTEL_DIR)만 확인하고 인터넷 주소는 시도하지 않습니다.

  4. 인터넷이 제한된 서버(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에서 그대로 게이트로 쓸 수 있습니다.

종료 코드

의미

0

통과 — 게이트 판정 승인(조치할 것 없음)

1

조건부 승인 — 사람이 할 일이 남음(소스 발견 · 취약 패키지 · 버전 미고정 · 라이선스 검토 · 검사 범위 결손)

2

차단 — 악성 · 기관 거부 · 미존재 · CISA KEV · CVSS CRITICAL 패키지

3

판정 불가 — 검사된 파일이 없거나 필수 엔진이 돌지 않음('안전' 아님, v0.5.4)

64

사용법 오류(잘못된 인자)

66

경로를 찾을 수 없음

종료 코드는 보고서 결론 박스·JSON gate.verdict 와 같은 판정에서 나옵니다(v0.5.4 부터 — 그 전에는 소스 발견이 없으면 취약 패키지·미고정·검사 불완전도 0 이었습니다).

표기 차이는 설계입니다 — 같은 결과를 세 곳이 다른 말로 적습니다. 버그가 아닙니다.

체커

하네스(개발 PC)

포털

종료 1 · conditional

checker_status: blocked(0 이 아니면 전부), final_verdict: review_required

needs_review

종료 2 · blocked

checker_status: blocked

blocked

종료 3 · undetermined

checker_status: undetermined

incomplete

종료 0 · approved

checker_status: review_required(하네스는 승인하지 않음)

allow

하네스는 "막혔다/안 막혔다"만 구분하고 승인은 절대 하지 않으며, 포털은 사람이 볼 네 단계로 옮겨 적습니다. "개발 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 환영)


연락 · 문의


면책 · 라이선스

이 도구의 자동 점검은 공식 보안적합성 검토를 대체하지 않습니다. 비전공자가 명백한 실수를 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 tools
check_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(망분리)이면 외부 호출 없이 로컬 인텔 캐시로 대체하며, 실재·발행일은 '미확인'으로 표시됩니다.

NameRequiredDescriptionDefault
nameYes패키지 이름 (예: requests, express). 버전 표기 없이 이름만
callerNo호출 주체 자율 신고 (예: 'harness:auto', 'registry:manual'). 감사 구분용
versionNo검사할 버전(권장). 미지정 시 전체 버전 이력 기준이라 판정이 보수적
ecosystemNo패키지 저장소: pypi(Python) | npm(Node.js)pypi
env_gradeNo실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. E3(대민·개인정보)는 바이브코딩 대상이 아니므로 받지 않음

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 를 쓰세요(이 탐지를 포함합니다).

코드를 외부로 보내지 않으며, 탐지된 값은 마스킹된 짧은 증거로만 반환합니다.

NameRequiredDescriptionDefault
codeYes검사할 소스 코드 또는 설정 파일 텍스트
filenameNo표시용 파일명 (예: config.py, .env)<memory>

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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"} 를 반환합니다.

NameRequiredDescriptionDefault
rule_idYes룰 ID (예: NIS-AI-M01, OWASP-LLM-2025-01). finding.rule_id 또는 search_rules 결과에서 얻음

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 이 적합합니다. 네트워크 호출이 없습니다.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 로 문자열만 받습니다(파이프 연결 등). 출력은 자체 완결적이라 비전공 이해관계자 공유나 내부 승인 기록 첨부에 적합합니다.

NameRequiredDescriptionDefault
saveNo파일로도 저장할지(기본 True). False 면 문자열만 반환합니다
formatNomarkdown(기본) | html(자체 포함 단일 파일) | both | sarif(CI 연동용 SARIF 2.1.0)markdown
reportYesscan_code / scan_path 가 반환한 ScanReport JSON 을 그대로 전달 (필수 키: target, summary, findings — 직접 조립하지 말 것). scan_dependencies 결과가 있으면 dependency_audit 키에 넣어 병합 가능
output_dirNo저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 을 설정하세요.

NameRequiredDescriptionDefault
reportYesscan_code / scan_path 가 반환한 ScanReport JSON 그대로 (직접 조립 금지)
output_dirNo저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/ 에 저장

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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(안전한 수정 방향)가 함께 담깁니다.

NameRequiredDescriptionDefault
codeYes검사할 소스 코드 전문(파일이 아닌 텍스트). 파일·폴더는 scan_path 사용
callerNo호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용
profileNo정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-servicepublic-default-strict
filenameNo표시용 파일명. 확장자로 언어를 추정하므로 알면 넣기 (예: app.py)<memory>
languageNo언어 강제 지정 (예: python, javascript). 미지정 시 확장자·내용으로 추정
scenarioNo용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 를 올려 재검사하세요.

NameRequiredDescriptionDefault
limitNo검사할 최대 패키지 수. 미지정 시 형식에 맞춰 자동(매니페스트 20 · 락파일 500). 초과분은 truncated_count 로 표시
callerNo호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용
ecosystemNopypi | npm. 락파일이면 형식이 생태계를 확정하므로 이 값은 무시됩니다pypi
env_gradeNo실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다.
manifest_textYes의존성 매니페스트 또는 **락파일**의 원문 텍스트. 매니페스트: requirements.txt·package.json / 락파일: package-lock.json·uv.lock·poetry.lock·pnpm-lock.yaml·yarn.lock

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 이면 로컬 인텔 캐시 사용). 라이선스 정보는 설치 메타데이터에서만 얻을 수 있어 이 도구에서만 함께 반환됩니다.

NameRequiredDescriptionDefault
pathYes프로젝트 폴더 경로. 하위의 .venv·*.whl·node_modules 설치 흔적을 훑습니다
limitNo검사할 최대 패키지 수 (기본 100)
env_gradeNo실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 로 한국어 보고서를 만드세요.

NameRequiredDescriptionDefault
pathYes검사할 로컬 파일 또는 폴더의 절대·상대 경로. 원격 URL 불가(먼저 clone)
callerNo호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용
profileNo정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-servicepublic-default-strict
scenarioNo용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent
max_filesNo최대 검사 파일 수 (기본 20,000). 초과분은 skipped_files에 사유와 함께 기록
max_file_bytesNo파일 하나의 크기 상한(바이트, 기본 8,000,000). 넘는 실행 소스는 coverage.oversized_source_files 에 남고 게이트는 승인을 내리지 않는다

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 <경로> 입니다.

NameRequiredDescriptionDefault
limitNo검사할 최대 컴포넌트 수(기본 2000). 초과분은 truncated_count 로 표시
callerNo호출 주체 자율 신고. 감사 구분용
sbom_textYesSBOM 파일 원문. CycloneDX JSON 또는 SPDX JSON (XML·tag-value 형식은 지원하지 않습니다)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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": [<의존성 결과>, <이 결과>]} 형태로 합쳐 넣습니다.

NameRequiredDescriptionDefault
callerNo호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용
env_gradeNo실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다.
vendor_bundlesYesscan_path 결과 JSON 의 `vendor_bundles` 값을 **그대로** 전달 (직접 조립하지 말 것). 각 항목: {path, name, version, evidence, ecosystem}

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 로 전문을 조회할 수 있습니다.

NameRequiredDescriptionDefault
limitNo최대 반환 건수 (기본 5)
queryYes검색어(한국어·영어 키워드, 룰 제목·본문·태그 대상). 예: 'SQL 삽입', 'hardcoded secret'
statusNo룰 상태로 필터. proposed=실시간 인텔이 자동 생성한 검토 대기 룰
languageNo프로그래밍 언어로 필터 (예: python, javascript)
scenarioNo시나리오 태그로 필터. 값: web-app | data-pipeline | llm-integration | agent
severity_minNo이 심각도 이상만 반환
approved_onlyNoTrue면 승인(approved)된 룰만 — 자동 생성 proposed 룰 제외

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 — 이 프로세스가 임포트한 시점의 커밋(pip direct_url.json 또는 소스 체크아웃의 .git/HEAD). 디스크의 현재 커밋은 install_identity.disk_commit_id 이고, 둘이 다르면 낡은 것이다. __version__ 은 릴리스 사이에 고정돼 최근 변경분을 구분하지 못한다.

  • total_rules — 메모리에 올라간 룰 수(rule_count_source 로 출처 표기). 디스크를 다시 읽은 수가 아니므로, 이 값이 늘었다고 최신인 것은 아니다. 인텔 캐시 룰이 섞여 최신처럼 보인 사례가 있다.

  • mcp_tools / missing_tools — 이 설치본이 실제로 제공하는 도구 목록. 필요한 도구 이름이 mcp_tools 에 없으면 낡은 설치본이므로, 호출 실패 증상으로 역추적하지 말고 재설치하면 된다.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 미리보기 후 담당자 확인을 거쳐 적용해야 합니다.

NameRequiredDescriptionDefault
rule_idYes스캔 결과 finding.rule_id 값 (예: NIS-AI-M01)
unsafe_codeNo문제가 된 코드 조각(선택). 넣으면 마스킹된 미리보기가 함께 반환됨

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 13 tool updatesv0.5.4
    • Changedcheck_package5 fields changed
      • addedInput schema / properties / caller
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "호출 주체 자율 신고 (예: 'harness:auto', 'registry:manual'). 감사 구분용"
        +}
      • addedInput schema / properties / ecosystem / description
        Added value: +"패키지 저장소: pypi(Python) | npm(Node.js)"
      • addedInput schema / properties / env_grade
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "E0",
        +        "E1",
        +        "E2"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다. E3(대민·개인정보)는 바이브코딩 대상이 아니므로 받지 않음"
        +}
      • addedInput schema / properties / name / description
        Added value: +"패키지 이름 (예: requests, express). 버전 표기 없이 이름만"
      • addedInput schema / properties / version
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "검사할 버전(권장). 미지정 시 전체 버전 이력 기준이라 판정이 보수적"
        +}
    • Changeddetect_secrets_and_pii2 fields changed
      • addedInput schema / properties / code / description
        Added value: +"검사할 소스 코드 또는 설정 파일 텍스트"
      • addedInput schema / properties / filename / description
        Added value: +"표시용 파일명 (예: config.py, .env)"
    • Changedget_rule1 field changed
      • addedInput schema / properties / rule_id / description
        Added value: +"룰 ID (예: NIS-AI-M01, OWASP-LLM-2025-01). finding.rule_id 또는 search_rules 결과에서 얻음"
    • Changedrender_report4 fields changed
      • addedInput schema / properties / format / description
        Added value: +"markdown(기본) | html(자체 포함 단일 파일) | both | sarif(CI 연동용 SARIF 2.1.0)"
      • addedInput schema / properties / output_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "저장 폴더 지정(선택). 미지정 시 <검사한 경로>/.check-reports/"
        +}
      • addedInput schema / properties / report / description
        Added value: +"scan_code / scan_path 가 반환한 ScanReport JSON 을 그대로 전달 (필수 키: target, summary, findings — 직접 조립하지 말 것). scan_dependencies 결과가 있으면 dependency_audit 키에 넣어 병합 가능"
      • addedInput schema / properties / save
        Added value: +{
        +  "default": true,
        +  "description": "파일로도 저장할지(기본 True). False 면 문자열만 반환합니다",
        +  "type": "boolean"
        +}
    • Addedsave_report
    • Changedscan_code6 fields changed
      • addedInput schema / properties / caller
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용"
        +}
      • addedInput schema / properties / code / description
        Added value: +"검사할 소스 코드 전문(파일이 아닌 텍스트). 파일·폴더는 scan_path 사용"
      • addedInput schema / properties / filename / description
        Added value: +"표시용 파일명. 확장자로 언어를 추정하므로 알면 넣기 (예: app.py)"
      • addedInput schema / properties / language / description
        Added value: +"언어 강제 지정 (예: python, javascript). 미지정 시 확장자·내용으로 추정"
      • addedInput schema / properties / profile / description
        Added value: +"정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service"
      • addedInput schema / properties / scenario / description
        Added value: +"용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent"
    • Changedscan_dependencies8 fields changed
      • addedInput schema / properties / caller
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용"
        +}
      • addedInput schema / properties / ecosystem / description
        Added value: +"pypi | npm. 락파일이면 형식이 생태계를 확정하므로 이 값은 무시됩니다"
      • addedInput schema / properties / env_grade
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "E0",
        +        "E1",
        +        "E2"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "실행환경 등급 — 신규 버전 쿨다운 기준일만 정합니다(취약점·악성 판정에는 영향 없음): E0(개인PC 일회성, 3일) | E1(개인PC 반복도구, 7일, 기본) | E2(내부서버 공용, 14일). **사용자가 배포 환경을 명시하지 않으면 비워 두세요** — 도구가 자동 판별하지 않으며, 넘긴 값이 보고서에 '검사 실행 시 지정'으로 그대로 기록됩니다."
        +}
      • addedInput schema / properties / limit / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +null
      • addedInput schema / properties / limit / description
        Added value: +"검사할 최대 패키지 수. 미지정 시 형식에 맞춰 자동(매니페스트 20 · 락파일 500). 초과분은 truncated_count 로 표시"
      • removedInput schema / properties / limit / type
        Removed value: -"integer"
      • addedInput schema / properties / manifest_text / description
        Added value: +"의존성 매니페스트 또는 **락파일**의 원문 텍스트. 매니페스트: requirements.txt·package.json / 락파일: package-lock.json·uv.lock·poetry.lock·pnpm-lock.yaml·yarn.lock"
    • Addedscan_installed_packages
    • Changedscan_path7 fields changed
      • addedInput schema / properties / caller
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "호출 주체 자율 신고 (예: 'harness:auto'). 감사 구분용"
        +}
      • addedInput schema / properties / max_file_bytes
        Added value: +{
        +  "default": 8000000,
        +  "description": "파일 하나의 크기 상한(바이트, 기본 8,000,000). 넘는 실행 소스는 coverage.oversized_source_files 에 남고 게이트는 승인을 내리지 않는다",
        +  "type": "integer"
        +}
      • changedInput schema / properties / max_files / default
        Previous value: -500New value: +20000
      • addedInput schema / properties / max_files / description
        Added value: +"최대 검사 파일 수 (기본 20,000). 초과분은 skipped_files에 사유와 함께 기록"
      • addedInput schema / properties / path / description
        Added value: +"검사할 로컬 파일 또는 폴더의 절대·상대 경로. 원격 URL 불가(먼저 clone)"
      • addedInput schema / properties / profile / description
        Added value: +"정책 프로파일 ID. 값: public-default-strict(기본·엄격) | civil-complaint-chatbot | internal-db-query | web-civil-service"
      • addedInput schema / properties / scenario / description
        Added value: +"용도 힌트 — 해당 시나리오 룰을 우선 적용. 값: web-app | data-pipeline | llm-integration | agent"
    • Addedscan_sbom
    • Addedscan_vendor_bundles
    • Changedsearch_rules7 fields changed
      • addedInput schema / properties / approved_only / description
        Added value: +"True면 승인(approved)된 룰만 — 자동 생성 proposed 룰 제외"
      • addedInput schema / properties / language / description
        Added value: +"프로그래밍 언어로 필터 (예: python, javascript)"
      • addedInput schema / properties / limit / description
        Added value: +"최대 반환 건수 (기본 5)"
      • addedInput schema / properties / query / description
        Added value: +"검색어(한국어·영어 키워드, 룰 제목·본문·태그 대상). 예: 'SQL 삽입', 'hardcoded secret'"
      • addedInput schema / properties / scenario / description
        Added value: +"시나리오 태그로 필터. 값: web-app | data-pipeline | llm-integration | agent"
      • addedInput schema / properties / severity_min / description
        Added value: +"이 심각도 이상만 반환"
      • addedInput schema / properties / status / description
        Added value: +"룰 상태로 필터. proposed=실시간 인텔이 자동 생성한 검토 대기 룰"
    • Changedsuggest_fix2 fields changed
      • addedInput schema / properties / rule_id / description
        Added value: +"스캔 결과 finding.rule_id 값 (예: NIS-AI-M01)"
      • addedInput schema / properties / unsafe_code / description
        Added value: +"문제가 된 코드 조각(선택). 넣으면 마스킹된 미리보기가 함께 반환됨"
  2. 1 tool updatev0.2.1
    • Changedrender_report1 field changed
      • changedInput schema / properties / format / enum
        Previous value: -[
        -  "markdown",
        -  "html",
        -  "both"
        -]New value: +[
        +  "markdown",
        +  "html",
        +  "both",
        +  "sarif"
        +]
  3. 11 tool updatesv0.1.0
    • First observedcheck_package
    • First observeddetect_secrets_and_pii
    • First observedget_rule
    • First observedlist_loaded_rules
    • First observedrender_report
    • First observedscan_code
    • First observedscan_dependencies
    • First observedscan_path
    • First observedsearch_rules
    • First observedserver_status
    • First observedsuggest_fix

TDQS

A4.1/5.0

Scored across 15 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that securely reviews AI-generated code for vulnerabilities such as SQL injection, command injection, and hardcoded credentials.
    12
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server for AI security analysis, enabling vulnerability scanning, sensitive information leak detection, and GitHub code leak monitoring via 48 tools.
    MIT