vibecode-checker
vibecode-checker is a Korean government security standards compliance checker for AI-generated code, providing static analysis, vulnerability detection, and Korean-language security reports — all locally without sending source code externally.
Scan code snippets (
scan_code): Analyze code for secrets, PII, SQL injection, dangerous execution, and AI-specific risks (e.g., prompt injection) using Korean public-sector security standards.Scan local files or folders (
scan_path): Recursively scan a project directory or file against 216 security rules, skipping build artifacts and binaries.Detect secrets and PII (
detect_secrets_and_pii): Identify secrets, Korean personal information (e.g., resident registration numbers), and internal network values in code.Check individual packages (
check_package): Look up a PyPI or npm package against OSV.dev for known vulnerabilities or typosquatting before installing.Scan dependency manifests (
scan_dependencies): Parserequirements.txtorpackage.jsonand check all packages against OSV.dev.Search and retrieve rules (
search_rules,get_rule,list_loaded_rules): Search the rule database by query, language, scenario, severity, or status; retrieve full rule details by ID; or list all loaded rules for audit.Suggest fixes (
suggest_fix): Get plain-language, public-officer-friendly safe-fix recommendations explaining "why it matters" and "how to fix."Render Korean reports (
render_report): Convert scan results into Korean-language Markdown or self-contained HTML reports (printable as PDF), structured for both non-technical officials and security teams.Check server status (
server_status): Get runtime diagnostics including package version, rule counts, and environment info — with no network calls.CI/CD & offline support: Returns SARIF output and exit codes for automated security gating; supports offline operation via pre-fetched threat intelligence bundles.
Integrates with GitHub Actions CI/CD pipelines to automatically run security scans on pushes and pull requests, with configurable failure thresholds.
Provides a pre-commit hook to automatically scan staged changes for security issues before committing.
Allows checking PyPI packages for known vulnerabilities and typosquatting attacks before installation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vibecode-checker이 프로젝트 보안 점검해줘 ./my-project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vibecode-checker
AI가 만든 코드를 한국 공공기관 보안 기준으로 점검합니다.
AI 코딩 도구(ChatGPT·Claude·Copilot·Cursor)로 만든 코드에 숨은 개인정보 노출 · API 키 · SQL 삽입 · 위험한 명령 실행 · 취약 패키지를 찾아, 공무원이 이해할 수 있는 한국어 보고서로 알려주는 보안 점검 도구입니다.
이 도구가 하는 일
검사 — 폴더나 코드를 주면 소스 코드, 사용 중인 패키지(requirements.txt·package.json), 폴더에 직접 넣어둔 라이브러리 파일(
static/*.min.js)까지 한 번에 검사합니다. 코드는 외부로 전송되지 않습니다.판정 — 발견을 심각도(치명·높음·보통)와 조치(차단·경고·허용)로 나누고, 코드와 패키지를 함께 보고 결론 하나를 냅니다: 배포 승인 가능 / 미승인(차단) / 보류(확인 필요).
보고서 — 무엇이 위험한지 → 왜 위험한지 → 어떻게 고치는지(안전한 코드 예시)를 한국어로 정리합니다. HTML 보고서를 인쇄하면 그대로 PDF 결재 문서가 됩니다.
쓰는 방법은 두 가지이고, 설치는 하나로 둘 다 됩니다.
터미널:
gvskb scan ./내프로젝트AI 코딩 도구(VS Code·Claude Desktop·Cursor·Claude Code)에 연결한 뒤 자연어로: "이 폴더 보안 검사 해줘"
Related MCP server: CodeAudit Agent
다른 도구와 다른 점
내용 | |
한국 공공기관 기준 | KISA 시큐어코딩·행안부 개발보안·국정원 AI 가이드를 룰에 직접 반영합니다. 발견마다 "왜 위험한지 → 어떻게 고치는지"를 출처와 함께 한국어로 제시합니다. |
비전문가용 보고서 | 보고서 맨 위에 배포 승인/미승인 결론이 먼저 나옵니다. 보안 지식 없이 결론과 조치 가이드(3단계)만 따라 하면 됩니다. 상세 근거는 보안팀용으로 접혀 있습니다. |
코드+패키지 통합 판정 | 코드가 문제없어도 취약한 패키지를 쓰면 승인되지 않습니다. |
망분리(폐쇄망) 지원 |
|
판정의 한계를 표시 | "판정하지 못함"을 "안전"으로 바꿔 말하지 않습니다. 검사한 파일이 0개면 경로를 확인하라고 말하고, 캐시가 오래되면 판정을 보류로 낮추고, 탐지 못 하는 항목은 성능 표에 공개합니다. |
자동화 연결 | 종료 코드로 CI에서 커밋·배포를 차단할 수 있고, SARIF·SBOM(CycloneDX) 출력과 감사로그(JSONL)를 지원합니다. |
보고서는 이렇게 생겼습니다
검사 결과를 저장하면 텍스트(.md)와 HTML 보고서가 함께 만들어집니다.
보고서는 읽는 사람에 따라 두 층으로 나뉩니다.
① 요약층 — 비전문 공무원용 (항상 펼침): 대상·검사일시 → 결론 박스(승인 가능 = 초록 / 미승인 = 빨강) → 핵심 숫자 → 조치 가이드 3단계 → 검토 범위·한계.
② 상세층 — 보안담당자용 (기본 접힘): 발견을 보안 분야별(개인정보·비밀값·주입·웹·암호화·설정 오류·AI 위험)로 묶어, 항목마다 위치 · 왜 위험한지 · 대응 방법 · 근거(출처) 를 제시합니다. 패키지 취약점, 외부 데이터 전송 목록, AI 도구에 붙여넣을 수정 프롬프트(복사 버튼)도 포함됩니다.
상세층은 기본 접혀 있고 인쇄(→PDF) 시 자동으로 펼쳐집니다. 그대로 공문 '붙임'으로 제출하면 보안팀이 이 문서로 보안성 검토를 진행할 수 있습니다.
── 요약층 (공무원) ─────────────────────────────
| 대상 | C:\…\민원처리앱 | 판정 기준 | 엔진 0.3.0 · 룰셋 2026.08.9 |
## 결론
> ### 배포 미승인 (차단) ← 빨강 박스(승인이면 초록)
> 배포 판정 · 배포 불가 — 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 소스에서 설치합니다.
# 한 줄 설치 (git 이 설치된 PC)
pip install git+https://github.com/Lex6won/vibecode-checker.git
# git 이 없는 PC — zip 주소를 그대로 넣으면 됩니다 (기관 표준 PC에 git 이 없는 경우)
pip install https://github.com/Lex6won/vibecode-checker/archive/refs/heads/main.zip
# 소스를 받아 설치 (수정·기여하려면 -e 권장)
git clone https://github.com/Lex6won/vibecode-checker.git
cd vibecode-checker && pip install -e .망분리(인터넷 없는) PC라면, 외부망에서 위 소스를 받아(또는
pip download로 의존성까지) 옮긴 뒤 오프라인 설치하세요.
AI 코딩 도구에 맡겨도 됩니다. Claude Code·Cursor처럼 터미널을 쓸 수 있는 도구에는 "https://github.com/Lex6won/vibecode-checker 설치하고 이 폴더 보안검사해줘" 라고 요청하면 설치·확인·검사까지 진행합니다. Claude Desktop처럼 터미널이 없는 도구는 설치 방법만 안내하므로, 위 명령을 직접 실행하세요.
2단계 — 설치 확인
gvskb doctor # 룰 수·인코딩·MCP·위협 정보 캐시 상태를 점검합니다3단계 — 첫 검사
gvskb scan ./내프로젝트여기까지 하면 터미널에서 쓸 수 있습니다. AI 코딩 도구에서 자연어로 쓰려면 아래 MCP 연결을 추가하세요.
AI 코딩 도구에 연결 (선택 — MCP)
MCP 설정 파일에 서버를 등록합니다. Claude Desktop·Cursor·Claude Code 공통 형식입니다(최상위 키 mcpServers). VS Code는 형식이 달라 아래에 따로 안내합니다.
{
"mcpServers": {
"vibecode-checker": {
"command": "gvskb-server",
"args": [],
"env": { "PYTHONUTF8": "1", "PYTHONIOENCODING": "utf-8" }
}
}
}도구 | 설정 파일 위치 |
Claude Desktop | Windows |
Cursor | 프로젝트 |
VS Code (Copilot Agent) | 워크스페이스 |
Claude Code (CLI) | 프로젝트 루트 |
VS Code 전용 — .vscode/mcp.json 은 키가 servers 이고 type 이 필요합니다:
{
"servers": {
"vibecode-checker": {
"type": "stdio",
"command": "gvskb-server",
"args": [],
"env": { "PYTHONUTF8": "1", "PYTHONIOENCODING": "utf-8" }
}
}
}저장 후 도구를 재시작하면 연결됩니다. 확인 방법: AI에게 "server_status 확인해줘" — runtime_freshness.process_stale 이 false 이고 rules_loaded_ok 가 true 면 정상입니다.
자주 겪는 문제 3가지
gvskb-server를 찾지 못함 → PATH에 없는 경우입니다. 실행 파일의 전체 경로로 바꾸세요.gvskb doctor가 실행되는 환경이면gvskb-server도 같은 위치에 있습니다.Windows에서
command를python으로 지정했는데 서버가 뜨지 않음 →python이 Microsoft Store 스텁으로 연결된 경우입니다.gvskb-server를 그대로 쓰거나, 인터프리터 전체 경로(예:C:\Python313\python.exe)를 지정하세요.룰을 갱신했는데 판정이 그대로 → gvskb는 룰을 프로세스 시작 시점에 한 번만 읽습니다. 저장소를 갱신하거나 재설치한 뒤에는 MCP 서버를 재시작하세요.
server_status의runtime_freshness.process_stale이true면 낡은 상태이며 조치 방법이 함께 표시됩니다.
신뢰하는 환경에서만 연결하세요 — MCP
scan_path도구는 지정한 경로의 로컬 파일을 읽습니다(검사 목적). 연결한 AI 클라이언트가 임의 경로 스캔을 요청할 수 있으므로 민감 디렉터리는 가리키지 마세요. 자세한 내용은 SECURITY.md 참고.
사용 방법
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) 으로 표시됩니다. 결론 박스에는 판정 기준표(무엇이 차단이고 무엇이 조건부 승인인지)와 해소 방안(무엇을 하면 차단이 풀리는지)이 함께 실립니다. 요약에는 판정 근거의 확신 수준(확인됨 · 유력함 · 패턴 일치만)이 구분되어, 값의 출처를 직접 확인해야 하는 항목이 무엇인지 알 수 있습니다.
"판정 불가"는 "안전"이 아닙니다. 이 도구는 확인하지 못한 것을 통과로 바꾸지 않습니다:
코드에 문제가 없어도, 사용 중인 패키지에 알려진 취약점이 있거나 패키지를 확인하지 못했다면(오프라인 등) 승인 판정을 내리지 않습니다.
검사된 파일이 0개면 "안전"이 아니라 경로·확장자를 확인하라는 안내가 나오고 결론은 '판정 불가'가 됩니다.
반입한 위협 정보 캐시가 오래되면(기본 30일 초과) '이상 없음'을 '판정 보류'로 낮춥니다.
무엇을 탐지하나
흔한 실수 유형
유형 | 예시 |
코드에 박힌 비밀값 |
|
개인정보 노출 | 주민등록번호·전화번호 평문 저장, 로그 출력 |
SQL 삽입 |
|
위험한 코드 실행 |
|
웹 취약점 | XSS, 경로 조작, 응답에 그대로 실리는 비밀번호·로그인 링크, Flask |
취약·가짜 패키지 | 알려진 CVE, 오타를 노린 typosquat( |
폴더에 넣어둔 외부 라이브러리 |
|
AI 특화 위험 | 프롬프트 인젝션(신뢰할 수 없는 입력이 LLM 프롬프트에 결합), 프롬프트에 개인정보 전송, LLM 출력 무검증 실행 |
외부 데이터 전송 | 외부 AI API·플러그인이 어디로(국외 포함) 무슨 데이터를 보내는지 목록으로 정리(검토용 — 사용 금지가 아님) |
폐쇄망 배포 영향 | CDN 스크립트·웹폰트 등 외부 리소스 로딩과 외부 API 호출 표시 — 폐쇄망에서 화면·기능이 깨질 지점을 배포 전에 확인 |
룰과 출처
탐지 룰은 한국 정부·국제 보안 가이드를 근거로 작성되며, 발견마다 출처를 함께 제시합니다.
출처 | 반영 |
KISA 시큐어코딩 가이드 (2023 개정) | Python 45항목 · JavaScript 34항목 |
행안부 SW 개발보안 가이드 | 49개 보안약점 |
국정원 AI 보안 가이드북 (2025) | AI 위협·대책 45룰 |
OWASP | LLM Top 10 · Agentic Top 10 · AI Testing Guide |
실시간 취약점 피드 | OSV.dev · CISA KEV · NVD · FIRST EPSS |
룰은 총 328개입니다 — 탐지 룰 101개(검사에서 발견을 만드는 룰) + 참조 룰 227개(발견의 근거·출처로 인용되는 지식 룰). 모든 룰은 Markdown 파일로 정의되어 누구나 읽고 검토할 수 있습니다.
위협 정보(인텔)는 매일 자동 갱신됩니다
GitHub Actions가 매일 03:00(KST) 4개 피드(OSV 악성 패키지·CISA KEV·NVD·EPSS)를 수집해 검증 가능한 번들을 intel-latest 릴리스에 게시합니다.
인터넷 PC: 별도 설정 없이 자동입니다. 서버 기동·검사 시점에 캐시 신선도를 확인하고 낡았으면 하루 1회 자동으로 받아옵니다(
GVSKB_AUTO_UPDATE=off로 끌 수 있음). 수동 갱신은gvskb update-intel --all.망분리 PC: 아래 절차대로 번들을 반입합니다. 관리자가 공유 폴더(
GVSKB_INTEL_DIR)에 번들을 놓아두면 각 PC가 자동 반영합니다.자동으로 받은 위협 정보는 패키지 검사(악성·취약점·실제 악용 여부 대조)에 쓰입니다. 검사 판정 기준(룰)이 자동으로 바뀌지는 않습니다 — 판정에 쓰이는 룰은 사람이 검토·승인한 것만입니다.
성능과 한계
실무형 프로젝트 5종(민원 웹앱·API 서버·정적 페이지·LLM 챗봇·데이터 처리)에 취약점 42개를 심은 벤치마크에서 42건 전부 탐지했고, 안전한 코드를 잘못 지적한 오탐은 0건이었습니다. 벤치마크와 결과는 저장소(eval_corpus/)에 포함되어 있어 누구나 재현할 수 있습니다.
다만 어떤 자동 점검 도구도 모든 위험을 잡지 못합니다. 이 도구의 한계는 다음과 같습니다.
한계 | 내용 |
일부러 숨긴 코드 | 난독화·우회 변형 11개 중 4개만 탐지 — 악의적으로 숨긴 코드는 놓칠 수 있습니다 |
탐지하지 못하는 유형 | 보안 지침이 요구하는 항목 중 현재 탐지하지 못하는 15건을 목록으로 공개하고 있습니다 |
정적 분석의 한계 | 설계·권한·업무 로직상 취약점, 실행 중에만 드러나는 취약점은 잡지 못합니다 |
그래서 두 가지를 기억해 주세요:
발견 0건이 "안전"을 보장하지 않습니다. 보고서의 '검토 범위 및 한계'에도 같은 내용이 명시됩니다.
이 도구는 명백한 실수를 1차로 걸러내는 도구이며, 보안담당자의 공식 보안성 검토를 대체하지 않습니다.
표시된 항목이 실제로는 문제없다면 (오탐)
이 도구는 위험을 놓치는 것보다 한 번 더 알리는 쪽을 택했습니다. 따라서 맥락상 안전한 코드가 표시될 수 있습니다. 이렇게 처리하세요:
먼저 확인 — 보고서의 발견 항목에는 증거 코드와 파일·줄 번호가 함께 실립니다. 특히 판정 근거가 "패턴 일치만" 으로 표시된 항목은 값의 출처를 사람이 확인해야 합니다.
오탐이 맞다면 '승인된 예외'로 등록 — 검사 폴더에
.gvskb-exceptions.yaml을 만들어 등록하면, 그 항목은 게이트(배포 판정)에서 제외되면서 승인자·사유·만료일이 보고서에 기록됩니다. 발견을 숨기는 것이 아니라 결정을 기록하는 방식입니다.반복되는 오탐은 제보 — Issues에 알려주시면 룰을 정밀화합니다.
빌드 산출물(dist/ 등 원본 소스가 아닌 파일)은 오탐만 만들기 때문에 자동으로 제외되며, 무엇이 왜 제외됐는지 보고서에 표기됩니다.
망분리(폐쇄망) 환경에서 쓰기
외부 통신에 대해 먼저 알아두실 것:
소스 코드는 외부로 전송되지 않습니다. 모든 정적 분석은 로컬에서 수행됩니다.
외부 통신은 패키지 취약점 조회에 한정되며(OSV·CISA·NVD·EPSS 공개 API), 보내는 것은 패키지명·버전·CVE ID 같은 공개 식별자뿐입니다.
GVSKB_MODE=offline설정 시 외부 통신을 완전히 차단하고, 반입한 캐시와 로컬 룰만으로 동작합니다.
위협 정보 반입 절차
1단계 (외부망 PC) — 번들 확보. 매일 자동 생성되는 공식 번들을 받는 방법(A, 권장)과 직접 수집하는 방법(B)이 있습니다.
# 방법 A — 공식 번들 내려받기 (매일 03:00 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 로 변경 가능).
반입 이후 자동화 — 관리자가 공유 폴더에 새 번들을 놓아두고 각 PC에 GVSKB_INTEL_DIR=\\공유폴더\경로 를 설정하면, 검사 시점에 자기 캐시보다 새 번들을 발견했을 때 자동 반입합니다(사용자 조작 불필요, 하루 1회 확인). 수동 동기화는 gvskb intel-sync, 상태 확인은 gvskb intel-sync --status.
오프라인 판정의 신뢰 장치
반입한 캐시는 읽을 때마다 sha256 무결성을 재검증합니다. 변조·손상된 캐시는 판정에 쓰지 않고 무시하며, 다시 받으라고 안내합니다.
캐시가 기본 30일(
GVSKB_INTEL_MAX_AGE_DAYS로 조정)을 넘으면 '이상 없음' 판정을 '판정 보류'로 낮춥니다 — 오래된 데이터가 최신처럼 보이지 않게 합니다.보고서에 어느 날짜 캐시 기준의 판정인지(피드별 수집 시각)가 자동 표기됩니다. KEV 등재 취약점에는 EPSS 악용확률·CVSS 점수가 함께 실려 보안팀이 우선순위를 정할 수 있습니다.
오프라인에서 확인하지 못한 것(패키지 실재 여부, CVE 목록 등)은 '판정 불가'로 명시합니다 — '안전'으로 바꿔 말하지 않습니다.
CI·자동화 — 게이트 · SBOM · 예외 관리
종료 코드로 커밋·배포 차단
gvskb scan 은 결과에 따라 종료 코드(exit code)를 반환하므로 CI에서 그대로 게이트로 쓸 수 있습니다.
종료 코드 | 의미 |
| 통과 |
| 경고(warn) 발견 · 판정 불가(오프라인 캐시 없음 등 — '안전' 아님) |
| 차단(block) 발견 |
| 사용법 오류(잘못된 인자) |
| 경로를 찾을 수 없음 |
gvskb scan ./src --fail-on dependency # 의존성 차단만 실패 — 처음 도입할 때 권장
gvskb scan ./src --fail-on block # block만 실패(2), warn은 통과 — CI 게이트 권장
gvskb scan ./src --fail-on warn # warn 이상 실패 (기본값)
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 이 항상 기록됩니다 — 판정을 재현하려면 둘 다 같아야 합니다.
오탐·수용 위험을 '승인된 예외'로 관리
검사 대상 폴더에 .gvskb-exceptions.yaml 을 두면, 오탐이거나 기관이 위험을 수용하기로 결정한 발견을 기록을 남기면서 게이트만 통과시킵니다.
exceptions:
- rule_id: GOV-FLASK-DEBUG-001
file: app.py
line: 47 # 선택 — 지정하면 그 줄만
reason: 내부 개발서버 전용 — 외부 노출 없음
approved_by: 김보안(정보보안담당관)
expires: 2026-12-31 # 만료되면 자동으로 다시 차단reason·approved_by·expires 가 모두 있어야 유효합니다. 억제된 발견은 보고서의 '승인된 예외 내역'과 감사로그에 남습니다.
감사로그 · SARIF
감사로그:
GVSKB_AUDIT_DIR환경변수를 설정하면 스캔·차단·예외 승인·인텔 갱신 이력이 월별 JSONL로 기록됩니다. 원본 코드·개인정보는 저장하지 않고 해시와 마스킹된 증거만 남깁니다(기관 감사 증빙용, 기본 비활성).SARIF:
gvskb scan ./src --format sarif -o result.sarif— GitHub code scanning 업로드나 기관 보안도구 수집에 쓸 수 있습니다(SARIF 2.1.0).
name: security scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.11" }
- run: pip install git+https://github.com/Lex6won/vibecode-checker.git
- run: gvskb scan . --format markdown -o report.md --fail-on block
- if: always()
uses: actions/upload-artifact@v4
with: { name: security-report, path: report.md }# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: gvskb-scan
name: vibecode-checker 보안 스캔
entry: gvskb scan .
args: ["--format", "json", "--fail-on", "block"]
language: system
pass_filenames: false # scan은 경로 1개를 받음 — 파일 목록 전달 금지기여하기
룰은 코드가 아니라 Markdown 파일 한 장입니다. rules/ 아래에 frontmatter로 탐지 패턴·설명·예제를 적으면 됩니다.
gvskb validate-rules # 새 룰 형식·정규식 검증
gvskb evaluate # 룰 예제 기반 정밀도 측정
pytest -q # 전체 테스트새 룰에는 examples.positive/negative 를 넣어주세요 — 회귀 테스트로 자동 보증됩니다. 자세한 방법은 CONTRIBUTING.md 참고.
버그·오탐 제보 → Issues
새 룰·기능 제안 → Discussions
직접 고치기 → Pull Request (작은 PR 환영)
연락 · 문의
버그·기능 요청: GitHub Issues
사용 질문·아이디어: GitHub Discussions
보안 취약점 비공개 제보: SECURITY.md의 절차를 따라주세요
면책 · 라이선스
이 도구의 자동 점검은 공식 보안적합성 검토를 대체하지 않습니다. 비전공자가 명백한 실수를 1차로 걸러내고 학습하도록 돕는 보조 도구입니다.
치명·높음항목은 보안 담당자 검토를 권장하며, 기관별 보안 정책·개인정보 처리 기준을 함께 확인하세요.
정부·공공기관 지침(KISA·행안부·국정원), OWASP·NIST·CISA 등 외부 자료는 원문을 복제하지 않고 요약·인용·구조화하여 사용하며 각 출처의 이용 조건을 존중합니다.
라이선스
PolyForm Noncommercial License 1.0.0 + 수급사업자 사용 추가 허가 — LICENSE 참고.
공공기관·교육기관·연구기관·공공안전 기관의 사용은 재원과 무관하게 허용됩니다. 라이선스가 "government institution" 사용을 명시적으로 비상업 목적으로 규정합니다. 지방자치단체·중앙부처·공공기관이 자체 점검에 쓰는 것은 제약 없이 가능합니다.
공공사업을 수행하는 용역사·수급사업자도 그 계약 이행 목적에 한해 사용할 수 있습니다. PolyForm 본문만으로는 용역사의 사용이 덮이지 않아, 추가 허가를 부기했습니다. 수정본을 발주기관에 납품하는 것도 포함됩니다.
개인의 연구·학습·취미 목적 사용도 허용됩니다.
상업적 목적의 사용은 허용되지 않습니다. 예: 유료 보안 점검 서비스에 포함해 판매하거나, 자기 명의의 솔루션 제품에 번들해 공급하는 경우. 용역사의 계약 종료 후 사용도 허용되지 않습니다. 별도 상용 라이선스가 필요하면 문의해 주세요.
전달 시 LICENSE 파일 전체를 함께 전달해야 합니다. PolyForm 원문 URL만 전달하면 수급사업자 추가 허가가 따라가지 않습니다.
2026-08-01 이전에 MIT 로 배포된 버전에는 이 변경이 소급되지 않습니다. 해당 버전을 MIT 조건으로 받은 이용자의 권리는 그대로 유지됩니다.
Available Tools
11 toolscheck_packageA
Check a package against OSV.dev before installing an AI-suggested dependency.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| ecosystem | No | pypi |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the full burden. It fails to disclose behaviors like network requests, rate limits, what happens on vulnerability detection, or any side effects. The tool is likely a read-only check, but this is not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the tool's purpose and context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, reducing the need to explain return values. However, the description lacks behavioral details and parameter semantics. For a simple check tool, it is functional but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description adds no meaning beyond parameter names. The 'ecosystem' parameter has an enum but the description does not explain its impact (e.g., which package ecosystems are supported).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Check a package against OSV.dev') and the specific use case ('before installing an AI-suggested dependency'). It distinguishes from sibling tools like scan_dependencies which likely scans all dependencies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool ('before installing an AI-suggested dependency'). It does not explicitly state when not to use or list alternatives, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_secrets_and_piiC
Detect secrets, Korean personal information, and internal network values.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| filename | No | <memory> |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral traits such as whether the tool is read-only, what it returns, or any side effects. It only states the detection capability, leaving significant behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, which is efficient but lacks any additional structure or detail. It is not verbose, but could benefit from breaking down purpose or parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While an output schema exists, the description does not clarify the role of the 'code' or 'filename' parameters, nor does it set expectations on output format or detection scope. The tool is not fully described for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description gives no explanation of the two parameters ('code' and 'filename'). The agent cannot infer what input is expected beyond the parameter names, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool detects secrets, Korean personal information, and internal network values. This is a specific verb-resource combination that distinguishes it from sibling scanning tools which are more general.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidelines are provided. The description does not indicate when to use this tool versus alternatives like scan_code or scan_path, nor does it give any context about prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ruleC
Return a rule by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It only states what it does, but fails to disclose any behavioral traits like error handling, authentication requirements, or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that is front-loaded and efficient. However, it may be too brief, sacrificing completeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one parameter and an output schema, the description is minimally adequate. It lacks error handling context or return value details, but given the low complexity, a 3 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description does not explain the 'rule_id' parameter beyond its name, lacking format, example, or any additional meaning. The output schema exists but is not described, adding no value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a rule by ID, using a specific verb and resource. It is distinct from sibling tools like list_loaded_rules (which lists all rules) and search_rules (which searches by criteria), but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like list_loaded_rules or search_rules. It lacks any context on prerequisites, exclusions, or usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_loaded_rulesA
List loaded guidance rules for debugging and audit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully convey behavioral traits. It states 'list loaded guidance rules' but does not elaborate on side effects, permissions, or limitations (e.g., whether it shows all rules or is paginated). Minimal but acceptable for a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no extraneous information. It is appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, an output schema exists to describe return values, and the operation is straightforward (list all loaded rules), the description is fully adequate for an agent to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters with 100% schema coverage (empty schema). According to guidelines, baseline is 4. No additional parameter info is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List loaded guidance rules' with a clear verb and resource. It distinguishes from sibling tools like get_rule (single rule) and search_rules (search), avoiding ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for debugging and audit' provides clear context for when to use, but lacks explicit exclusions or alternative recommendations. However, the context is sufficient for a simple list tool.
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 결과)를 한국어 보고서로 렌더링합니다.
사람이 읽고 결재·보고에 쓸 문서가 필요할 때 사용하세요.
format="markdown": Markdown 본문(기본)
format="html": 자체 포함 단일 HTML(외부 CDN·JS 없음, 인쇄→PDF·이메일 가능)
format="both": Markdown + HTML 모두
format="sarif": SARIF 2.1.0 (CI·보안도구 연동, GitHub code scanning 업로드)
출력은 자체 완결적이라 비전공 이해관계자 공유나 내부 승인 기록 첨부에 적합합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | markdown | |
| report | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that output is self-contained and suitable for sharing, but does not mention safety traits (e.g., read-only, auth needs, rate limits). The behavioral information is partial but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient, using bullet points for format options and a single sentence for the main purpose. It front-loads the core action. Some mixed language (Korean/English) may slightly reduce clarity but is acceptable given context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity and an output schema, so description need not detail return values. It covers use cases and format choices well, but the lack of description for the required 'report' parameter leaves a significant gap. Overall adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description only adds meaning to the 'format' parameter by explaining use cases for each enum value. The required 'report' parameter is completely undocumented, leaving the agent without guidance on its structure or required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders a ScanReport into a Korean report, with explicit verb ('renders') and resource. It lists four output formats, distinguishing it from sibling tools like scan_code or scan_path, which are scanning tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('when a human-readable document for approval/reporting is needed') and provides detailed guidance for each format (markdown for body, html for self-contained email/PDF, sarif for CI integration). This effectively helps the agent decide between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_codeA
코드 조각을 공공기관 보안 기준으로 점검(보안·검토·체크·검사)합니다.
사용자가 메모리에 있는 코드(붙여넣은 스니펫, 방금 생성한 코드)가 "안전한지", 개인정보·시크릿·SQL 삽입·위험한 코드 실행·LLM 위험이 있는지 묻거나, "보안 점검/검토/체크"를 요청하면 이 도구를 사용하세요. 파일·폴더 경로라면 대신 scan_path 를 씁니다.
코드를 외부 API로 보내지 않습니다. 시크릿·개인정보는 마스킹된 짧은 증거만 반환하며, 각 발견 사항에 why_it_matters(왜 위험한가)와 safe_fix(안전한 수정 방향)가 함께 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| profile | No | public-default-strict | |
| filename | No | <memory> | |
| language | No | ||
| scenario | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full burden. It discloses that code is not sent to external APIs, secrets/PII are masked with short evidence, and each finding includes 'why_it_matters' and 'safe_fix'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs, front-loading purpose. It is mostly efficient but could be slightly more concise (e.g., the list of issue types could be shortened). Still, no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters (1 required) and an output schema, the description adequately covers behavioral aspects and return structure (masking, why_it_matters, safe_fix). However, it fails to explain optional parameters, which is a notable gap for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (no descriptions in input schema). The description only explains the 'code' parameter implicitly (the snippet to scan) but does not detail 'filename', 'language', 'scenario', or 'profile'. It adds value for output structure but not for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it scans code for security vulnerabilities (specific verb+resource) and lists types of issues. It distinguishes itself from the sibling tool 'scan_path' by specifying that 'scan_path' is for file/folder paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use (when user asks about code safety or requests a security review) and when-not-to-use (file/folder paths: use scan_path). This clearly differentiates from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_dependenciesA
Parse a dependency manifest and check packages with OSV.dev.
Only package names and versions are sent to OSV.dev. Source code is not sent.
락파일(poetry.lock·yarn.lock 등)은 파싱하지 못하므로 verdict="unparsed"로
정직하게 거절합니다 — 원본 매니페스트(requirements.txt·package.json)를 주세요.
결과를 scan_path 결과 JSON의 dependency_audit 필드에 넣어 render_report를
호출하면 사람용 보고서에 '의존성 취약점' 섹션이 함께 렌더됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| ecosystem | No | pypi | |
| manifest_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that only package names and versions are sent to OSV.dev, not source code. Also explains inability to parse lock files and the resulting 'unparsed' verdict. With no annotations, this level of detail is excellent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured with a clear main action, privacy note, limitation, and integration tip. However, inclusion of Korean text may reduce clarity for non-Korean speakers, though it adds specific detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Overall sufficient given the output schema exists, but the description does not cover the limit and ecosystem parameters, which are essential for correct usage. Lack of parameter documentation is a notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only manifest_text is implicitly referenced in the description. The limit and ecosystem parameters are not explained at all, and schema description coverage is 0%, so the description fails to add meaning for most parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it parses a dependency manifest and checks packages with OSV.dev. However, it does not explicitly differentiate from sibling 'check_package' which might handle individual packages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on input (original manifest vs lock files) and integration with scan_path and render_report, but does not explicitly state when to use this tool versus alternatives like check_package.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_pathA
파일 또는 폴더를 공공기관 보안 기준으로 점검(보안·검토·체크·검사)합니다.
사용자가 "이 폴더/프로젝트 보안 점검해줘", "이 파일 검토/체크해줘", "안전한지 검사해줘"처럼 로컬 경로를 가리키면 이 도구를 사용하세요. 메모리의 코드 조각이면 대신 scan_code 를 씁니다. "기존 코드베이스 감사" 흐름의 진입점입니다.
경로를 로컬에서 순회하며 빌드·vendor 디렉터리를 건너뛰고 바이너리는 무시하며, 소스 코드를 외부 API로 전혀 보내지 않습니다. 각 발견 사항에는 why_it_matters 와 safe_fix 가 포함됩니다. 검사 후 render_report 로 한국어 보고서를 만드세요.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| profile | No | public-default-strict | |
| scenario | No | ||
| max_files | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Detailed behavioral disclosure: traverses locally, skips build/vendor dirs, ignores binaries, no external API calls for source code. Mentions findings include why_it_matters and safe_fix. No annotations provided, so description fully compensates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bullet points, but somewhat lengthy. Could be more concise without losing key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, description covers behavioral traits, workflow (use render_report), and constraints. Output schema exists so return values need not be explained. Comprehensive for a scanning tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description only implicitly covers 'path'. It does not explain 'scenario', 'profile', or 'max_files' parameters, leaving gaps in meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scans files/folders for security compliance, using specific verb '점검' and resource 'path'. It distinguishes from sibling 'scan_code' by specifying local paths vs in-memory code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (local path security check) and when not (use scan_code for code snippets). It also positions the tool as entry point for 'existing codebase audit' flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rulesC
Search baseline and realtime security guidance rules.
Set approved_only=True to exclude auto-generated proposed rules from
real-time intel feeds. Use status="proposed" to inspect pending rules.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| status | No | ||
| language | No | ||
| scenario | No | ||
| severity_min | No | ||
| approved_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behaviors. It mentions that approved_only excludes auto-generated proposed rules, but lacks details on default behavior (e.g., limit is 5), pagination, read-only nature, or any side effects. The description is incomplete for a search tool with 7 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the core purpose and following with actionable parameter advice. It is efficient with no redundant words. However, the brevity sacrifices coverage of other parameters, which could be included without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters, 1 required, and an output schema exists, the description is insufficient. It misses key behavioral context such as the default limit, the nature of the 'query' field, and how to combine filters. The output schema relieves return-value explanation, but the description still lacks completeness for effective invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning for only 2 of 7 parameters: 'approved_only' and 'status.' The critical required parameter 'query' is not described, nor are 'scenario', 'language', 'severity_min', or 'limit.' This leaves significant gaps for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search baseline and realtime security guidance rules.' The verb 'Search' and resource 'security guidance rules' are specific. However, it does not explicitly differentiate from sibling tools like 'list_loaded_rules' or 'get_rule', relying on the search concept rather than comparative guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct usage advice for two parameters: 'Set approved_only=True to exclude auto-generated proposed rules' and 'Use status="proposed" to inspect pending rules.' This provides helpful context for specific scenarios. However, it does not guide when to choose this tool over alternatives, leaving that implied.
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: package version, 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully discloses that it returns runtime diagnostics without network calls, indicating a safe, read-only operation. There is no mention of destructive effects, which is appropriate for a diagnostic tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences, front-loaded with the core purpose. Every word serves a purpose, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema exists, the description provides sufficient context: it explains the return values and the use case for health verification, making it complete for an agent to decide when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With no parameters, schema coverage is 100% automatically. The description adds value by detailing the output (package version, rules dir, rule counts, env), which helps the agent understand what to expect, compensating for the lack of param-related information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Return runtime diagnostics' and lists specific items (package version, rules dir, rule counts, env), clearly differentiating from sibling tools like scan_code or list_loaded_rules which focus on different operations. The verb 'verify' further clarifies its diagnostic role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using the tool from any MCP client to verify server health and see loaded rules, and notes 'No network calls', which implies it's safe and fast. However, it does not explicitly state when not to use it or mention alternatives, though the sibling tools are distinct enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_fixC
Return a public-officer-friendly safe-fix recommendation for a finding.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | ||
| unsafe_code | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It hints at safety filtering ('public-officer-friendly') but omits whether the recommendation is deterministic, requires network access, or has side effects. No details on authorization or rate limits are given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (one sentence). However, it omits essential information, making it incomplete rather than efficiently informative. Every word serves a purpose, but the content is insufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and two simple parameters, the description should at least define the core concept ('finding') and the role of each parameter. It fails to do so, assuming background knowledge. The tool's context is poorly captured.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description does not explain any parameter purpose or constraints. The two parameters, rule_id and unsafe_code, remain entirely undefined in the description, adding no value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a 'safe-fix recommendation for a finding' with a specific qualifier ('public-officer-friendly'). This uniquely identifies the tool's function among siblings like check_package or scan_code, leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., get_rule or run_scan). There is no mention of prerequisites, exclusions, or typical use cases, leaving the agent to infer usage independently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but check_package and scan_dependencies both relate to package security checking and could be confused by an agent. The three rule-related tools (get_rule, list_loaded_rules, search_rules) also have overlapping functions.
All tool names follow a consistent verb_noun pattern with underscores, e.g., check_package, scan_code, render_report. No mixing of styles or conventions.
With 11 tools covering scanning, dependency checks, secrets detection, rule management, reporting, and diagnostics, the count is well-scoped for the server's purpose.
Core scanning capabilities are fully covered, but rules management is limited to read operations (get, list, search) with no tools for creating, updating, or deleting rules. This is a minor gap.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Zero-config MCP security scanner for AI-generated apps. 25K+ vulnerability patterns.
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
Scan any public GitHub MCP-server repo for security issues. 37 MCP-specific L1 rules, 8 languages.
Scan any MCP server for tool-poisoning, security, auth & license. Trust score before install.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that securely reviews AI-generated code for vulnerabilities such as SQL injection, command injection, and hardcoded credentials.11Apache 2.0
- FlicenseNot gradedqualityCmaintenanceMCP server for AI-powered code security, quality, and performance review. Enables auditing code directly from VS Code via right-click or MCP tools.
- AlicenseBqualityCmaintenanceAn AI-native code security audit MCP server that supports multi-language AST analysis, call graph analysis, vulnerability detection, and AI deep audit.71MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server for AI security analysis, enabling vulnerability scanning, sensitive information leak detection, and GitHub code leak monitoring via 48 tools.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Lex6won/vibecode-checker'
If you have feedback or need assistance with the MCP directory API, please join our Discord server