AI Slop Code RIsk Monitor

chrisryugj/korean-law-mcp

법제처 국가법령정보를 LLM에서 바로 조회하는 MCP 서버. 법령·판례·조례 검색과 인용 검증 | MCP server for Korean law — search statutes, precedents, and ordinances, and verify citations

6.3 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for chrisryugj/korean-law-mcp, a TypeScript project with 2,662 GitHub stars. SynthScan examined 57,338 lines of code across 349 source files, recording 164 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 6.3 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

6.3
Adjusted Signal
6.3
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
2.7K
Stars
TypeScript
Language
57.3K
Lines of Code
349
Files
164
Pattern Hits
2026-10-12
Scan Date
0.02
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 9.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 90 finding(s).

Hallucinated Dependency & Supply Chain Risk 2.6/100 · LOW

Are imports declared and package/API names verified? 6 finding(s).

Agent Over-Engineering Ratio 19.6/100 · LOW

Are wrappers, guards, and repeated structures necessary? 111 finding(s).

PR Review Velocity Impact 25.4/100 · MEDIUM

Which changes need focused human review? 164 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 6MEDIUM 71LOW 87

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 164 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Decorative Section Separators68 hits · 210 pts
SeverityFileLineSnippetContext
MEDIUMsrc/cli.ts36// ────────────────────────────────────────COMMENT
MEDIUMsrc/cli.ts38// ────────────────────────────────────────COMMENT
MEDIUMsrc/cli.ts186// ────────────────────────────────────────COMMENT
MEDIUMsrc/cli.ts188// ────────────────────────────────────────COMMENT
MEDIUMsrc/cli.ts387// ────────────────────────────────────────COMMENT
MEDIUMsrc/cli.ts389// ────────────────────────────────────────COMMENT
MEDIUMsrc/tools/verify-citations.budget.test.ts109// ── 예산 소진은 그 인용만의 실패다 (2026-10-01 감사 재현) ──────────────────────COMMENT
MEDIUMsrc/tools/history-review.test.ts133// ── 행정규칙 ────────────────────────────────────────COMMENT
MEDIUM⚡src/tools/document-analysis.ts19// ────────────────────────────────────────COMMENT
MEDIUM⚡src/tools/document-analysis.ts21// ────────────────────────────────────────COMMENT
MEDIUM⚡src/tools/document-analysis.ts30// ────────────────────────────────────────COMMENT
MEDIUM⚡src/tools/document-analysis.ts32// ────────────────────────────────────────COMMENT
MEDIUMsrc/tools/annex-select.test.ts65// ─── 별표번호 6자리 코드 체계 (실측 확정) ──────────────────COMMENT
MEDIUMsrc/tools/search.test.ts31// ── display 하한 (#89) ────────────────────────────────COMMENT
MEDIUMsrc/tools/search.test.ts31// ── display 하한 (#89) ────────────────────────────────COMMENT
MEDIUMsrc/tools/search.test.ts86// ── 옛 법령명 안내 (v4.15.0) ────────────────────────────COMMENT
MEDIUMsrc/tools/annex-select.ts313// ─── query 필터 (#94) ─────────────────────────────────COMMENT
MEDIUMsrc/tools/annex-select.ts313// ─── query 필터 (#94) ─────────────────────────────────COMMENT
MEDIUMsrc/tools/annex-select.ts334// ─── 조문 맥락 (#133) ─────────────────────────────────COMMENT
MEDIUMsrc/tools/annex-select.ts334// ─── 조문 맥락 (#133) ─────────────────────────────────COMMENT
MEDIUMsrc/tools/annex.ts237// ─── 별표 텍스트 추출 ─────────────────────────────────COMMENT
MEDIUMsrc/tools/annex.ts398// ─── 목록 포맷 (기존 동작) ────────────────────────────COMMENT
MEDIUMsrc/tools/applicable-law.staggered.test.ts7// ── 라이브 캡처 픽스처 (2026-07-19, OC만 test로 마스킹) ──────────────────────COMMENT
MEDIUMsrc/tools/applicable-law.staggered.test.ts19// ── 포맷 일치 스텁 헬퍼 ──────────────────────────────────────────────────────COMMENT
MEDIUMsrc/tools/scenarios/time-travel-diff.ts132// ─── 신구대조 발췌 (#97) ──────────────────────────────COMMENT
MEDIUMsrc/tools/scenarios/time-travel-diff.ts132// ─── 신구대조 발췌 (#97) ──────────────────────────────COMMENT
MEDIUMsrc/tools/scenarios/time-travel-diff.test.ts177// ─── 통합 배치 이음새 회귀 (지적 3·4) ────────────────────COMMENT
MEDIUMsrc/server/http-server.ts95 // ── Origin 검증 (DNS rebinding 방어) ──────────────────────────────────────COMMENT
MEDIUMsrc/server/http-server.ts140 // ── 접근 인증 (MCP_AUTH_TOKEN 설정 시에만 활성) ────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts16// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts18// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts30// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts32// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts65// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts67// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts223// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-executor.ts225// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts7// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts9// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts109// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts111// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts136// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts138// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts320// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts322// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts351// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts353// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts428// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts430// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts514// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/risk-rules.ts516// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/tool-discovery.ts153// ── 무매칭일 때 ──────────────────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts11// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts13// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts36// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts38// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts69// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts71// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts118// ────────────────────────────────────────COMMENT
MEDIUMsrc/lib/cli-format.ts120// ────────────────────────────────────────COMMENT
8 more matches not shown…
Hyper-Verbose Identifiers43 hits · 40 pts
SeverityFileLineSnippetContext
LOWsrc/tools/constitutional-decisions.ts27export async function searchConstitutionalDecisions(CODE
LOWsrc/tools/constitutional-decisions.ts92export async function getConstitutionalDecisionText(CODE
LOWsrc/tools/external-links.ts195function generateInterpretationLinks(interpretationId: string): string {CODE
LOWsrc/tools/impact-map.ts54async function searchPrecedentsWithoutFallback(CODE
LOWsrc/tools/unified-decisions.ts162async function searchPrecedentDecisionsWithText(CODE
LOWsrc/tools/tax-tribunal-decisions.ts24export async function searchTaxTribunalDecisions(CODE
LOWsrc/tools/tax-tribunal-decisions.ts94export async function getTaxTribunalDecisionText(CODE
LOWsrc/tools/applicable-law.ts102function extractTransitionExcerpts(CODE
LOWsrc/tools/precedents.ts68export function renderPrecedentSearchResult(result: StructuredPrecedentSearchResult): string {CODE
LOWsrc/tools/precedents.ts265function normalizeTaxlawBodyCandidate(value: unknown): string {CODE
LOWsrc/tools/precedents.ts440async function fetchHtmlFallbackPrecedent(CODE
LOWsrc/tools/annex-merge-marker.test.ts21function clientWithFailingCanonical(): LawApiClient {CODE
LOWsrc/tools/verify-citations.ts108export function lawNameFromCitationContext(lookbackRaw: string): string | undefined {CODE
LOWsrc/tools/verify-citations.ts396async function identifiedByFirstCandidate(apiClient: LawApiClient, lawName: string, apiKey?: string): Promise<boolean> {CODE
LOWsrc/tools/search-detail-chain.ts149export async function fetchCombinedSearchDetailChain(CODE
LOWsrc/tools/institutional-rules.ts181export async function searchPublicInstitutionRules(apiClient: LawApiClient, args: SearchPublicInstitutionRulesInput) {CODE
LOWsrc/tools/institutional-rules.ts187export async function getPublicInstitutionRuleText(apiClient: LawApiClient, args: GetPublicInstitutionRuleTextInput) {CODE
LOWsrc/tools/precedent-evidence.ts143export async function validatePrecedentSearchResult(CODE
LOWsrc/tools/precedent-search-core.ts285export async function searchPrecedentsStructured(CODE
LOWsrc/tools/compact-query-planner.ts167function normalizeOriginalPrecedentQuery(query: string): string {CODE
LOWsrc/tools/compact-query-planner.ts219function extractedOriginalKeywords(originalQuery: string): string[] {CODE
LOWsrc/tools/compact-query-planner.ts375function scoreAiLawArticleCandidate(CODE
LOWsrc/tools/compact-query-planner.ts535function addOriginalQueryCandidate(CODE
LOWsrc/tools/compact-query-planner.ts563function addOriginalKeywordCandidates(CODE
LOWsrc/tools/compact-query-planner.ts668function addDocumentHintCandidates(CODE
LOWsrc/tools/compact-query-planner.ts691function addStructuredAiLawArticleCandidates(CODE
LOWsrc/tools/special-admin-appeals.ts134export async function searchAppealReviewDecisions(apiClient: LawApiClient, args: SearchAppealReviewDecisionsInput) {CODE
LOWsrc/tools/special-admin-appeals.ts141export async function getAppealReviewDecisionText(apiClient: LawApiClient, args: GetAppealReviewDecisionTextInput) {CODE
LOWsrc/tools/chains.ts72function emptyStructuredPrecedentResult(args: SearchPrecedentsInput): StructuredPrecedentSearchResult {CODE
LOWsrc/tools/chains.ts91async function safeSearchPrecedentsStructured(CODE
LOWsrc/tools/chains.ts154export function shouldFetchAnnexSeparately(CODE
LOWsrc/tools/chains.ts257async function fetchPrecedentDetailForChain(CODE
LOWsrc/tools/chains.ts273function combineStructuredPrecedentResults(CODE
LOWsrc/tools/chains.ts349async function precedentSearchThenDetail(CODE
LOWsrc/tools/customs-interpretations.ts31export async function searchCustomsInterpretations(CODE
LOWsrc/tools/customs-interpretations.ts127export async function getCustomsInterpretationText(CODE
LOWsrc/server/http-config.ts28function parseRemoteUnauthenticatedOverride(raw: string | undefined): boolean {CODE
LOWsrc/lib/citation-content-matcher.ts105function longestCommonSubstringLen(a: string, b: string): number {CODE
LOWsrc/lib/external-https-proxy.ts29export function getExternalHttpsProxyConfig(): ExternalHttpsProxyConfig | null {CODE
LOWsrc/lib/historical-utils.ts82export async function fetchHistoricalVersionsFull(CODE
LOWsrc/lib/historical-utils.ts222export async function fetchHistoricalVersionsRaw(CODE
LOWsrc/lib/three-tier-parser.ts39function stripLeadingJoHeaderFromContent(content: string): string {CODE
LOWsrc/lib/abolished-laws.ts211async function buildAbolishedAdminRuleNote(CODE
Structural Annotation Overuse22 hits · 36 pts
SeverityFileLineSnippetContext
LOWdocs/DEVELOPMENT.md98### Step 1: 도구 파일 생성COMMENT
LOWdocs/DEVELOPMENT.md129### Step 2: tool-registry.ts에 등록COMMENT
LOWdocs/DEVELOPMENT.md145### Step 3: 빌드 & 테스트COMMENT
LOWsrc/setup.ts272 // Step 1: API 키COMMENT
LOWsrc/setup.ts285 // Step 2: 클라이언트 선택COMMENT
LOWsrc/setup.ts314 // Step 3: 설정 파일 업데이트COMMENT
LOW⚡src/tools/chains.ts710 // Step 1: 신구대조표COMMENT
LOW⚡src/tools/chains.ts713 // Step 2: 조문별 개정 이력COMMENT
LOW⚡src/tools/chains.ts991 // Step 2: 3단 비교 (절차 체계 파악)COMMENT
LOW⚡src/tools/chains.ts993 // Step 3: 별표(수수료/과태료) + 서식(신청서) 병렬COMMENT
LOWsrc/tools/chains.ts749 // Step 1: 상위 법령 확인 (조례/지역명은 법령 검색에서 제거)COMMENT
LOWsrc/tools/chains.ts763 // Step 2: 조례 검색 — "조례"/"규칙" 제거 (이미 조례 DB에서 검색하므로)COMMENT
LOWsrc/tools/chains.ts784 // Step 3: 상위 1건 전문 자동 조회COMMENT
LOWsrc/tools/chains.ts844 // Step 1: AI 검색 + 법령 검색 + 해석례를 병렬 실행하고, 판례는 AI 구조화 신호를 받은 뒤 공통 core로 검색한다.COMMENT
LOWsrc/tools/chains.ts978 // Step 1: 법령 검색COMMENT
LOWsrc/tools/chains.ts1016 // Step 4: AI 검색으로 보완 (절차 상세)COMMENT
LOWsrc/tools/chains.ts1054 // Step 1: analyze_document 로 리스크 분석COMMENT
LOWsrc/tools/chains.ts1066 // Step 2: 분석 결과에서 searchHints 추출 → 병렬로 법령+판례 검색COMMENT
LOWsrc/tools/scenarios/time-travel.ts90 // Step 1: 연혁 목록 → 두 시점 MST 결정 (페이징으로 전체 회수)COMMENT
LOWsrc/tools/scenarios/time-travel.ts149 // Step 2: 두 시점 본문 raw 조회COMMENT
LOW⚡src/tools/scenarios/time-travel.ts177 // Step 3: diffCOMMENT
LOW⚡src/tools/scenarios/time-travel.ts180 // Step 4: 출력COMMENT
Verbosity Indicators19 hits · 32 pts
SeverityFileLineSnippetContext
LOWsrc/setup.ts272 // Step 1: API 키COMMENT
LOWsrc/setup.ts285 // Step 2: 클라이언트 선택COMMENT
LOWsrc/setup.ts314 // Step 3: 설정 파일 업데이트COMMENT
LOW⚡src/tools/chains.ts710 // Step 1: 신구대조표COMMENT
LOW⚡src/tools/chains.ts713 // Step 2: 조문별 개정 이력COMMENT
LOW⚡src/tools/chains.ts991 // Step 2: 3단 비교 (절차 체계 파악)COMMENT
LOW⚡src/tools/chains.ts993 // Step 3: 별표(수수료/과태료) + 서식(신청서) 병렬COMMENT
LOWsrc/tools/chains.ts749 // Step 1: 상위 법령 확인 (조례/지역명은 법령 검색에서 제거)COMMENT
LOWsrc/tools/chains.ts763 // Step 2: 조례 검색 — "조례"/"규칙" 제거 (이미 조례 DB에서 검색하므로)COMMENT
LOWsrc/tools/chains.ts784 // Step 3: 상위 1건 전문 자동 조회COMMENT
LOWsrc/tools/chains.ts844 // Step 1: AI 검색 + 법령 검색 + 해석례를 병렬 실행하고, 판례는 AI 구조화 신호를 받은 뒤 공통 core로 검색한다.COMMENT
LOWsrc/tools/chains.ts978 // Step 1: 법령 검색COMMENT
LOWsrc/tools/chains.ts1016 // Step 4: AI 검색으로 보완 (절차 상세)COMMENT
LOWsrc/tools/chains.ts1054 // Step 1: analyze_document 로 리스크 분석COMMENT
LOWsrc/tools/chains.ts1066 // Step 2: 분석 결과에서 searchHints 추출 → 병렬로 법령+판례 검색COMMENT
LOWsrc/tools/scenarios/time-travel.ts90 // Step 1: 연혁 목록 → 두 시점 MST 결정 (페이징으로 전체 회수)COMMENT
LOWsrc/tools/scenarios/time-travel.ts149 // Step 2: 두 시점 본문 raw 조회COMMENT
LOW⚡src/tools/scenarios/time-travel.ts177 // Step 3: diffCOMMENT
LOW⚡src/tools/scenarios/time-travel.ts180 // Step 4: 출력COMMENT
Magic Placeholder Names6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHREADME-EN.md421 "LAW_OC": "your-api-key"CODE
HIGHREADME-EN.md450 "https://mcp.gomdori.app/law?oc=your-api-key"CODE
HIGHREADME-EN.md463 "url": "https://mcp.gomdori.app/law?oc=your-api-key"CODE
HIGHREADME-EN.md487export LAW_OC=your-api-keyCODE
HIGHREADME-EN.md501docker run -e LAW_OC=your-api-key -e MCP_HTTP_HOST=0.0.0.0 \CODE
HIGHdocs/DEVELOPMENT.md22LAW_OC=your-api-key node build/index.jsCODE
Modern AI Meta-Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMdocs/FTC-RAG-INTEGRATION.md1# 공정위 결정문 — 로컬 LLM RAG 결합 가이드COMMENT
MEDIUMdocs/FTC-RAG-INTEGRATION.md9### 경로 A: 구조화 텍스트 (`get_decision_text`) ← RAG 메인COMMENT
MEDIUMdocs/FTC-RAG-INTEGRATION.md81## 3. RAG 인덱싱 — 청킹 전략COMMENT
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/tools/verify-citations.ts61)COMMENT
LOWsrc/tools/knowledge-base.ts1import { z } from "zod"COMMENT
LOWsrc/lib/route-patterns.ts181 // "XX법 별표", "XX령 서식" 등 법령명이 함께 있는 경우만 매칭.COMMENT