法律检索 MCP
把韩国法制处 42 个法律 API 封成 9 个 MCP 工具,做法令/判例检索与引用校验
법제처 42개 API를 10개 도구로. 법령, 판례, 행정규칙, 자치법규, 조약, 해석례(국세청 포함) + LLM 환각 방지 인용 검증(실존+내용) + 조문 영향 그래프 + 시점 비교 자동 diff + 이럴 땐 이렇게 — 5단계 안내 + 판례 생사 확인(Citator) + 행위시법 판단 + 조례 정비 레이더를 AI 어시스턴트나 터미널에서 바로 사용.
법제처 Open API 기반 MCP 서버 + CLI. Claude Desktop, Cursor, Windsurf, Zed, Claude.ai 등에서 바로 사용 가능.

v4.7.0 — 조례 정비 레이더 (ordinance_radar)
“상위법 바뀌었는데, 우리 조례는 아직 그대로 아닌가?” — 조례 담당 공무원이 매년 반복하는 상위법 개정 추적을 한 번의 호출로.
korean-law "광진구 주차장 조례" → ordinance_radar(ordinanceName="...")
📡 조례 정비 레이더
조례: 서울특별시 광진구 주차장 설치 및 관리 조례 (시행 20260227)
근거 상위법령 3건 대조:
⚠️ 주차장법 — 현행 시행 20260603 (조례보다 약 4개월 뒤 개정 → 정비 검토 대상)
✅ 주차장법 시행령 — 현행 시행 20250817 (조례 시행 시점까지 반영)
⚠️ 주차장법 시행규칙 — 현행 시행 20260331 (조례보다 약 1개월 뒤 개정 → 정비 검토 대상)
- 근거법 자동 추출: 조례 제1조(목적)의 「」 인용에서 근거 법률·시행령·시행규칙을 추출 (“같은 법 시행령” 축약 표현도 해석). 본문 전체가 아닌 목적 조문만 스캔해 별표의 무관 인용(감면대상 정의의 공직선거법 등) 과잉경보를 배제
- 개정 대조: 각 상위법의 현행 시행일 vs 조례 시행일을 대조해 정비 검토 대상을 자동 플래그, 후속 확인용 MST 동봉
- 법제처 자치법규 연계 API(lnkOrd)는 커버리지가 낮아 미사용 — 조례 본문 표준 표기 파싱으로 대체
+ v4.6.1~4.6.6 — 운영 안정화 묶음
- v4.6.6: 핸드셰이크(initialize/tools/list)를 rate limit에서 제외 — claude.ai 공유 egress IP가 429를 맞아 “간헐적 도구 못 찾음”이 되던 근본원인 해결 +
get_ordinanceid 별칭 수용 +get_article_history날짜 미지정 시 전체기간 자동적용 - v4.6.5/4.6.4: MCP 등록 심사 대응 — ToolAnnotations
destructiveHint추가, 한글 title 제거 - v4.6.3:
search_law자치법규 자동 폴백 — 조례·지역명 쿼리 0건 시 search_ordinance 자동 시도 - v4.6.2: 폴백 쿼터 게이트를 tools/call만 적용 — 핸드셰이크 429 차단 해제
- v4.7.0 보안·운영 패치 동봉: JSON-RPC 배치의 tools/call을 개수만큼 rate limit·폴백 쿼터에 계수(배치 증폭 차단, 요청당 상한 20 —
MCP_MAX_BATCH_CALLS) + graceful shutdown idle 연결 정리(clean exit) +get_article_historylawName 정확매칭 우선(가나다순 오매칭 방지)
v4.6.0 — 인용 검증 강화(내용까지) + 클라우드 안티봇 우회
verify_citations내용 검증: 조문 실존 확인에 더해,민법 제750조(계약해제)처럼 존재하는 조문에 엉뚱한 제목을 붙인 내용 환각을[CONTENT_MISMATCH]로 탐지. 기존엔 제750조만 실존하면 통과했으나, 이제 인용한 조문 제목이 실제와 일치하는지 대조합니다(LexDiffcitation-content-matcher이식 — 정규화 후 공통 substring + 문자 bigram Jaccard).legal_analysis(mode=verify_citations)에도 동일 적용- law.go.kr JS 안티봇 우회: 클라우드 IP(GCP/AWS/Fly)에서 법제처가 API 데이터 대신
location.assignJS 리다이렉트 페이지를 반환할 때, 난독화 URL을 파싱해 토큰 URL로 자동 우회(최대 3홉, 토큰 URL 404 시 원본 재시도). 로컬/등록 IP에선 no-op —Referer주입(v4.0.9)으로도 안 뚫리는 클라우드 환경의 방어층
v4.5.0 — 시행예정 법령 감지 (제명변경 오판 방지)
search_law가 시행예정(target=eflaw) 보조검색을 수행해 결과에 병기합니다.
- 제명변경 예정: 「데이터기반행정 활성화에 관한 법률」→「인공지능 및 데이터 기반 행정 활성화에 관한 법률」(2026-08-28 시행)처럼 공포~시행 사이의 제명변경을 신·구 명칭 매핑으로 표시 — 신명칭 검색 시 “정확매칭 없음”만 떠서 LLM이 “법령 없음”으로 오판하던 문제 해결
- 개정 시행예정: 검색된 현행 법령에 시행 대기 중인 개정이 있으면 시행일·공포번호와 시행예정본 MST 안내
- 미시행 신규 법령: 공포됐지만 아직 시행 전이라 현행 검색 0건인 법령을 별도 안내 (효력 없음 경고 포함)
v4.4.1–4.4.3 — 안정성 패치
- v4.4.3:
zod를^4로 고정 — 신규 설치가 zod 3.x를 해석해listTools첫 호출에서z.toJSONSchema is not a function으로 크래시하던 문제 해결 - v4.4.2:
get_annexes행정규칙 별표/서식 조회 복구 — 응답 키admrulbyl우선 파싱 + ”…시행세칙” 자동 판별 + 동일 bylSeq 별표/서식 충돌 분리 (#50/#49/#51) - v4.4.1: 광고 스키마
required버그 수정 —.default()필드(legal_research.task·search_law.display)가 필수 입력으로 노출되던 문제(io:"input"명시) +legal_analysis비용 옵션 패스스루 + 비호환 scenario 경고 노트
v4.4.0 — 노출 도구 통폐합 19개 → 9개 (컨텍스트 52% 감축)
MCP 클라이언트가 매 세션 읽는 도구 목록(ListTools)을 ~15.1KB → ~7.2KB로 줄였습니다.
chain_*8개 →legal_research하나로 (task파라미터: full_research·law_system·action_basis·dispute_prep·amendment_track·ordinance_compare·procedure_detail·document_review)- 킬러피처 4개(
verify_citations·cite_check·applicable_law·impact_map) →legal_analysis하나로 (mode파라미터) - 하위호환: 기존 도구명 직접 호출·
execute_tool경유 모두 그대로 동작. 광고 목록에서만 빠짐
v4.3 — 판례 생사 확인 + 행위시법 판단
“이 판례 아직 유효한가?” + “사건 시점엔 어떤 법이 적용되나?” — 법률 실무에서 가장 위험한 두 실수를 잡는다.
1. cite_check — 판례 생사 확인 (한국형 Shepard’s Citator)
"2007다27670 아직 유효해?"
→ 그 사건번호를 인용한 후속 판례를 본문검색으로 역추적 + 전원합의체 후속 판결 본문 정밀 스캔 → 변경·폐기 선언 감지:
📊 판정: ❌ 변경·폐기 신호 감지 — 2018다248626(판례 변경 선언, 저촉 범위 변경)
맥락: "…2008년 전원합의체 판결은 이 판결의 견해와 배치되는 범위에서 변경하기로 한다…"
판결문이 사건번호 대신 “(이하 ‘2008년 전원합의체 판결’이라 한다)” 별칭으로 변경 선언하는 관행까지 추적. 변경된 판례를 살아있는 것처럼 인용하는 사고를 차단한다. 무료 도구 중 유일.
2. applicable_law — 행위시법 판단 + 부칙 경과규정
"2023.5.10 당시 도로교통법 제44조"
→ 기준일에 시행 중이던 버전(MST) 특정 → 그 시점 조문 본문 → 현행과 비교 → 이후 개정 부칙의 적용례·경과조치 자동 발췌 + 행위시법(형법 §1)·제재처분 위반행위시법(행정기본법 §14③) 법리 안내. LLM이 현행법으로 오답하는 것을 구조적으로 방지.
v4.0 — 3개 킬러 기능 동시 추가
조문 영향 그래프 + 시점 비교 + 단계별 안내. 법무팀·연구자·실수요자가 매뉴얼로 며칠 걸리던 작업이 한 번에.
1. impact_map — 조문 한 줄의 파급효과 그래프
"민법 제103조 인용한 판례"
→ 대법원 판례·헌재 결정·법령해석·행정심판·자치법규를 역방향 탐색 + 조문이 인용한 다른 법령(정방향) + mermaid 그래프 코드 자동 생성. claude.ai에서 바로 시각화.
graph LR
민법_제103조["⚖️ 민법 제103조"] --> P["📚 대법원 판례"]
민법_제103조 --> C["⚖️ 헌재 결정"]
민법_제103조 --> O["🏛️ 자치법규"]
2. time_travel — 두 시점 본문 자동 diff
"개인정보보호법 2020-01-01 vs 2025-11-01"
→ 임의의 두 시점에 시행 중이었던 본문을 자동으로 가져와 조문 단위 자동 diff: 추가(+) / 삭제(-) / 변경(△) 분류 + 변경 전후 본문 + 자수 변화량.
3. action_plan — 이럴 땐 이렇게, 5단계 안내
"전세금 못 받았어"
→ STEP 1 상황진단(주택임대차보호법 자동 식별) → STEP 2 권리/구제수단(판례) → STEP 3 신청기관/기한(행정규칙+해석) → STEP 4 필요서류/양식(별표) → STEP 5 함정/주의(시효·법률구조공단). 평소 말투 그대로 → 실행 가능한 단계로 변환.
+ v4.2.0 — 법령 현행성 가드 (개정 전 법령 오답 방지)
search_law 결과에 [현행] / ⚠️[연혁-과거버전] 라벨 + 시행일 표기(현행 우선 정렬), get_law_text 본문 헤더에 조회기준일 vs 시행일 비교 라벨(시행 예정·efYd 과거 조회 경고)과 구 법령명(“(구 법령명: 화재예방, 소방시설 설치ㆍ유지 및 안전관리에 관한 법률…)”) 표기. LLM이 분법·개정된 법령을 학습데이터 속 옛 버전과 혼동하지 않도록 도구 출력 단계에서 차단.
+ v4.1.0 — 판례 검색 구조화 + 상세 증거 자동 연결
판례 검색을 공통 구조화 core(searchPrecedentsStructured)로 통합. 긴 자연어/개념형 질의를 compact query로 보정하고, 사건번호→제목→본문검색 순으로 폴백. 상위 판례를 get_precedent_text에 자동 연결(기본 2건/최대 5건)해 근거 본문을 함께 제공하며, search_decisions(domain="precedent", options.includeText=true)로 opt-in. 다건 상세조회 합산 시 뒷 판례가 잘리던 문제도 건당 본문 예산 배분으로 해결. (외부 PR #46 + 후속 최적화)
+ v4.0.9 — 법제처 API Referer 헤더 자동 주입
법제처 OPEN API가 Referer 헤더 없는 요청을 OC 키 유효 여부와 무관하게 거부(“사용자 정보 검증 실패”)하는 문제 대응. law.go.kr 계열 호스트 호출 시 기본 Referer를 자동 주입한다(LAW_REFERER로 override). IP/도메인 등록 문제로 오인되기 쉬운 증상의 실제 근본 원인이었음 — IP 등록을 했는데도 모든 검색이 실패하던 케이스를 해결. (외부 PR #45)
+ v4.0.8 — 법제처 빈/HTML 응답 자동 재시도
법제처 OPEN API가 간헐적으로 200 상태에 빈 본문이나 HTML 점검 페이지를 반환하던 문제 대응. 이 경우 XML 파서가 missing root element로 터지며 “됐다 안 됐다” 증상이 발생했음. fetchWithRetry가 빈/HTML 응답을 일시 장애로 간주해 자동 재시도(exponential backoff)하고, 재시도 소진 후에도 빈 응답이면 search_law가 missing root element 대신 명확한 안내 메시지를 반환하도록 수정. (IP 등록·OC 키와 무관한 외부 응답 불안정 이슈)
+ v4.0.7 — 国税厅判例正文 fallback
针对法制处JSON API返回空正文的判例,从国税厅taxlaw.nts.go.kr自动以HTML形式进行补充。在JSON失败、解析失败、正文缺失三种情况下均进入fallback,并安全回收。支持面向内网/SSL inspection环境的LAW_EXTERNAL_HTTPS_PROXY(可选)和LAW_EXTERNAL_TLS_REJECT_UNAUTHORIZED(诊断用)——详细设置请参见下方“国税厅判例服务器TLS/代理设置”部分。(外部PR #44)
+ v4.0.6 — 法制处API协议设置 + 判例重新搜索改进
为封闭网络/证书问题环境增加了LAW_API_PROTOCOL=http选项(默认https)。改进了判例重新搜索关键词候选项生成,提升匹配率。(外部PR #41/#42)
+ v4.0.5 — 依赖漏洞批量修复(Security)
npm audit中的4项High级别漏洞(@xmldom/xmldom的5项XML注入+DoS、@hono/node-server的路径绕过、express-rate-limit的IPv6绕过、fast-uri的路径遍历)已批量修复。均为不涉及semver-major变更的patch/minor更新。npm audit → 0 vulnerabilities。代码零更改。详细GHSA列表请参见CHANGELOG。
+ v4.0.4 — 缩写部分匹配
原有的缩写处理仅在查询词与已注册缩写完全一致时生效(如“화관법”→“화학물질관리법”)。v4.0.4将缩写与其他 token 结合的查询也自动扩展为全称变形。
"화관법 시행령" → "화학물질관리법 시행령"
"화관법 제5조" → "화학물질관리법 제5조"
"산안법 시행규칙" → "산업안전보건법 시행규칙"
"중처법 제4조 책임자" → "중대재해 처벌 등에 관한 법률 제4조 책임자"
新增extractEmbeddedAliases并整合了expandLawQuery/expandOrdinanceQuery。回归测试0项。
v3.5 — 捕捉AI法律回答中的幻觉
实时检测LLM编造的虚假条文。 通过法制处官方数据库对所有引用进行交叉验证。
"根据民法第750条请求不法行为损害赔偿,
劳动基准法第60条第1项规定年带薪休假,
根据商法第401条之2第7项追究董事责任,
刑法第9999条规定加重处罚"
→ 只需一次verify_citations(实际法制处API交叉验证结果):
- ✓ 民法第750条(不法行为的内容)真实存在
- ✓ 劳动基准法第60条(年带薪休假)第1项真实存在
- ✗ 商法第401条之2 — 不存在第7项(最大到第2项)
- ✗ 刑法第9999条 — 该条文不存在(存在范围:第1条~第372条)
不要轻信ChatGPT·Claude撰写的法律回答。 法律AI服务、律所、学生、合同审查中必须进行可信度检查。
v3.2.0+ — 用自然语言进行复合分析
使用方法相同。只需用自然语言提问。 AI会理解问题,并自动添加所需的分析。
收到罚款,能否减免?
"食品卫生法停业罚款是否可以减免?"
→ 按违规类型的处分基准表(1次·2次·3次金额)+ 罚则条文原文 + 实际减免的行政审判案例 + 该条文的修订历史一次性呈现。
要进口这件物品,法律上需要确认什么?
"进口通关FTA适用确认"
→ 关税法 + 关税厅有权解释 + FTA条约原文 + 税率附表 + 关税纠纷时的税务审判院判决。以往需要分别查询法制处、关税厅、税务审判院、外交部四个地方。
建筑许可处理,从哪里开始?
"建筑法许可程序"
→ 法律依据(法律→施行令→施行规则)+ 手续费·格式 + 相关训令·例规·告示 + 本地方自治团体条例特则 + 有权解释一站式获取。
修改一条法律,还需要同时修改哪些?
"建筑法影响分析"
→ 下级法令(施行令·施行规则)+ 全国自治法规中受影响的部分 + 相关行政规则清单。
该法律的授权事项,是否都已制定完成?
"国民健康保险法授权立法"
→ 查找“由施行令规定”的条款中尚未制定施行令的部分。
这条条例,是否与上位法冲突?
"停车条例上位法合规性"
→ 搜索宪法法院违宪决定 + 行政审判撤销案例中与类似条例相关的内容,并与上位法依据进行对比。
这条条文何时变更?判例如何变化?
"劳动基准法修订历史时间线"
→ 新旧对照表 + 各条目的修订历史 + 相关法令的判例·解释例按时间顺序整合。
使用方法不变。 像以前一样用自然语言提问即可。AI会根据问题自动附加额外分析。
所有结果末尾会建议**“可继续进行的查询”**。复制即可直接进行后续查询。
v3.2.1~v3.5.5 变更历史
v3.5.5 — 绕过法制处API机器人拦截(紧急热修复)
法制处OPEN API开始将Node.js默认User-Agent (undici/...)归类为机器人并拒绝 → 导致fly.dev/Vercel等所有云托管出现[EXTERNAL_API_ERROR] fetch failed或XML报错“用户信息验证失败”等崩溃现象。
- 在
fetch-with-retry.ts中注入通用浏览器UA默认标头 — 调用者代码零更改,通过一行补丁恢复所有工具。可通过LAW_USER_AGENT环境变量覆盖 - 错误信息为“请注册准确的服务器设备IP地址及域名地址”,容易误认为是IP白名单拦截 — 实际原因是UA验证
- 使用Claude.ai自定义连接器
https://korean-law-mcp.fly.dev/mcp?oc=...的用户立即受到影响。通过v3.5.5部署自动恢复
v3.5.4 — 结合实际使用反馈:全面引入NOT_FOUND明确信号
用户反馈:“实际使用中经常找不到答案,AI随意回答。找不到时应明确返回值。”
根本原因:部分工具在查询失败时未设置isError标志或仅返回“不存在” → LLM无法检测到失败而生成创作性回答。
- 全面引入
[NOT_FOUND]/[HALLUCINATION_DETECTED]机器解析标记 — 所有失败响应均包含可机械检测的前缀 + 标准化警告“⚠️ LLM禁止推测/生成” verify_citations— 当failCount > 0时设置isError: true。修复原本幻觉被检测到但仍被误认为“验证成功”的严重Bugannex.ts/law-text.ts/article-detail.ts等10+个文件 — 修复isError: true缺失问题- 链式工具部分失败透明化 — 去除
chains.ts中的silent-drop模式。失败部分也明确显示[NOT_FOUND / FAILED]标记及原因(80字符扩展至200字符) - 新增辅助函数
notFoundResponse(message, suggestions?)确保一致性
v3.5.3 — verify_citations实证测试后修复3个致命Bug
使用实际法制处API测试5条 → 发现3例假阴性 → 修复根本原因:
- “民法”→“难民法”部分匹配错误 — 原有的
chains.ts中findLaws/scoreLawRelevance已解决该逻辑,但verify_citations未复用而用自身逻辑重复实现。已提取公共模块lib/law-search.ts以便双方复用(消除重复) - 圆形数字(①②③…)项号解析失败 — 法制处API返回项号为
"① "格式,原有parseInt(raw.replace(/[^\d]/g, ""))去除Unicode圆形数字后得到NaN。导致劳动基准法第60条第1项实际存在却被判定为“最大第0项” → 在lib/article-parser.ts中新增parseHangNumber()圆形数字映射工具 - 短法令名搜索遗漏 — 法制处lawSearch API在
display=20时将“商法”排在第34个结果。在apiClient.searchLaw中增加display参数,verify_citations以searchDisplay=100调用
验证后5/5准确判定(上述示例结果即为输出)。
v3.5.2 — kordoc 2.3.0 → 2.4.0更新(附表/格式解析引擎)
v3.5.1 — 移除lite/full配置文件体系(引入V3_EXPOSED 16个固定暴露后实际未使用)。在tool-profiles.ts中移除LITE_TOOLS/parseProfile/filterToolsByProfile,将健康端点虚假的profiles字段替换为准确的tools: { exposed: 16, total: 92 }。非破坏性变更(?profile=lite也已是已被忽略的值)
v3.5.0 — Killer功能:verify_citations引用验证 + 关键热修复 + 安全强化
- 新增
verify_citations— 防止LLM幻觉。从用户文本中正则提取条文引用 + 向前30字符回溯法令名 + 并行交叉验证法制处数据库。结果:✓(真实存在)/ ✗(不存在,给出存在范围)/ ⚠(法令名不明确) - 关键热修复 — v3.4.0的
full参数在12个领域(tax_tribunal, customs, ftc, pipc, nlrc, acr, treaty, interpretation等)因架构中缺少字段而被静默忽略的问题已修复。unified-decisions.ts在处理下级处理器响应后,通过compactLongSections()后处理进行层级式缩略统一应用 - 安全High 2项 —
fetch-with-retry.ts中,超时/网络错误将包含API密钥的URL输出到日志的问题 → 通过maskSensitiveUrl()掩码处理OC=***。trust proxy true→ 改为TRUST_PROXY环境变量(默认1),阻止X-Forwarded-For欺骗导致的速率限制绕过 - 质量3项 —
decision-compact.ts增加日期正则边界保护、TAIL边界去除.误判、stripRepeatedSummary终点准确检测 - UX — 优化8个链的description(使LLM能选择链)、搜索结果增加“💡 下一步:get_law_text(…)”提示、
search_law的缩写/拼写错误自动重试扩展、query-router新增5种模式、discover_tools增加27个别名匹配
v3.4.0 — 判例响应Token平均减少74% + get_decision_text增加full参数
从法规RAG角度重新解读判例响应结构:判示事项、判决要旨、主文是规范再利用的核心,因此保持完整;而“理由”全文罗列个案事实关系,LLM大多仅在消费后丢弃。利用这一不对称性,对判例/宪裁/行审(precedent/constitutional/admin_appeal)三个领域应用层级式缩略 + 结构化引用浓缩。新增lib/decision-compact.ts:
compactBody— 将全文/理由部分缩略为前800字 + 省略标记 + 后400字。内置判决结束语(~다.、~라 할 것이다.)和句子边界保护。通过minSave保护,对短正文(1300字以下)跳过densifyLawRefs— 去除引用条文的括号说明(제390조(채무불이행과 손해배상)→제390조)。平均节省40~55%densifyPrecedentRefs— 去除引用判例中的“宣告”/“判决” + 压缩日期空格(2020. 3. 26. 선고 2018두56077 판결→2020.3.26. 2018두56077)stripRepeatedSummary— 检测并去除法制处API将判示/要旨混入正文开头的情况
get_decision_text增加full?: boolean参数。未指定(默认)=缩略,true=全文。响应中间的⋯ 중략 N자 (full=true로 전문 조회) ⋯标记作为重新调用提示。
实测(实际法制处API,固定ID 8条):
| 领域 | 缩略前平均 | 缩略后平均 | 节省 |
|---|---|---|---|
| 判例 | 5,230字符 | 3,049字符 | -42% |
| 宪裁 | 8,368字符 | 1,703字符 | -80% |
| 行审 | 8,429字符 | 1,491字符 | -82% |
| 综合 | 7,606字符 (1,901 tok) | 1,960字符 (490 tok) | -74% |
在长篇判决案例(15,000字符↑)中,80~89% 的缩减最为显著。短文本通过 minSave 保护保留原文。无质量损失(判决理由·要旨·主文始终完整)。
此外,ListTools 负载也减少 -14%(9,671 → 8,296 bytes,344 tokens↓):简化了 chain_* 8 个 description,消除了 search_decisions/get_decision_text 字段 describe 中 17 个域名的重复表述。
v3.3.1 — 大幅扩展法令简称词典(11 → 52 个,+41)
在 lexdiff 中发现,查询“산안기준규칙”时,由于法律处分 aiSearch 的关键词部分匹配,误将结果视同为 国家标准化基本法,因此大幅增强了 resolveLawAlias 中的 LAW_ALIAS_ENTRIES。覆盖高频劳动/安全(产业安全法·重大灾害处罚法·劳动基准法等)、个人信息/信息通信(个人信息保护法·信息通信网法)、清廉/利益冲突(禁止请托法·防止利益冲突法)、公共采购(国家合同法·地方合同法)、房地产/租赁(住宅租赁法·商业租赁法·房地产中介法)、公平交易(公平交易法·分包法·条款法·标识广告法·加盟事业法)、金融(资本市场法·特定金融信息法·电子金融法)、城市规划(国土规划法·道路法)、环境(传染病预防法·大气环境法)、运输(旅客运输法·货物运输法)、民·刑事程序(民事诉讼法·刑事诉讼法·民事执行法)、社会保险(国民健康保险法·工伤保险法·雇佣保险法)、通信(电气通信事业法)。api-client.ts/law-parser.ts 已使用 resolveLawAlias,因此仅添加数据即可自动使现有搜索路径受益。45/45 测试通过(新增 41 个 + 回归 4 个)。
v3.3.0 — 转换为 HTTP 无状态模式 + kordoc 2.3.0
原先远程服务器(korean-law-mcp.fly.dev)因周期性 OOM kill 重启导致现有会话 ID 失效的问题得到根本解决。切换至 MCP 官方无状态模式(sessionIdGenerator: undefined),每次请求创建全新的 Server + Transport,请求结束时立即释放。完全移除 in-memory 会话 Map、InMemoryEventStore、idle cleanup,消除泄漏根源。重启、水平扩展、部署均无数据丢失。GET /mcp·DELETE /mcp 与官方示例一致返回 405。API 密钥通过 AsyncLocalStorage 以请求为单位隔离(防止竞态条件)。
- HTTP 无状态切换 — src/server/http-server.ts(参考:
@modelcontextprotocol/sdk/examples/server/simpleStatelessStreamableHttp.js) - kordoc 2.2.5 → 2.3.0 — 星号/格式解析引擎更新
- 完全移除会话管理代码 — 删除
sessionsMap、MAX_SESSIONS、idle cleanupsetInterval、InMemoryEventStore、POST/GET/DELETE 分支逻辑(替代 v3.2.3 的 LRU eviction 方案)
v3.2.3 — HTTP 会话稳定性中间改进。MAX_SESSIONS 100→500 + LRU eviction。已被 v3.3.0 的无状态切换取代。
v3.2.2 — 在默认暴露工具中添加星号/格式查询工具(get_annexes)。暴露工具数量 14 → 15 个。添加在退款、减额关键词查询时自动查询星号的逻辑。
v3.2.1 — 更新 kordoc 2.2.5。
开发者:场景技术详情
原有 8 个链工具新增了 scenario 参数。(暴露工具数量在 v3.5 的 verify_citations、v4.0 的 impact_map 加入后增至 17 个)
| scenario | 主机链 | 附加查询 |
|---|---|---|
penalty | chain_action_basis | 星号处分标准表 + 罚则条款 + 减额行政审判 + 修订历史 |
customs | chain_full_research | 关税厅解释例 + 税务审判 + FTA 条约 + 税率表 + 三段对比 |
manual | chain_procedure_detail | 法律体系(行政规则)+ 解释例 + 关联自治法规 |
delegation | chain_law_system | 委任法令现状 + 法律体系(行政规则)+ 条款历史 |
impact | chain_law_system | 法律体系树 + 关联条例 + 条款关联 + 行政规则 |
timeline | chain_amendment_track | 判例 + 解释例时间序列映射 |
compliance | chain_ordinance_compare | 宪法法院违宪决定 + 行政审判违法撤销 + 上位法依据 |
场景可通过查询关键词自动检测,或通过 scenario 参数直接指定。
其他改进:
- 法律体系图(
get_law_system_tree)增加行政规则(训令/例规/告示)输出 - 法律搜索第三次 fallback — 从复合查询中自动提取法令名模式
- 提升
chain_action_basis判例/解释例搜索准确度(基于法令名搜索)
v3.1.0~v3.1.5 变更历史
v3.1.5 — kordoc 2.2.4 + 文档解析引擎强化。README 更新。
v3.1.4 — 更新 kordoc 2.2.4。合并单元格 HTML <table> 输出,markdownToHwpx 格式强化。
v3.1.3 — 集成 18 个工具的搜索结果缺失提示。缩短会话清理周期(30分→10分)。
v3.1.2 — 更新 kordoc 2.2.1。GFM 表格特殊字符转义及 pipe 冲突防止。
v3.1.1 — 更新 kordoc 2.1→2.2。
v3.1.0 — Production Hardening
基于实际使用检查修改了 20 个文件。统一改进潜在错误、安全、稳定性。
- 统一修复 truncateResponse 遗漏 — 修复 17 个工具未应用 50KB 响应限制的问题
- HTTP 服务器会话限制 — 添加 MAX_SESSIONS=100,返回 503 响应(DoS 防御)
- CORS 通配符警告 — 未设置时添加 stderr 警告日志
- 参数污染防御 — 阻止
search_decisions/get_decision_text的 options 中关键字段被覆盖 - 链工具稳定性 — 认证错误(401/403/429)立即传播,findLaws 安全包装
- API 客户端 — throwIfError 中消费 response body(防止流泄漏)
- CLI 改进 — REPL 模式 Ctrl+C 两次强制退出实现
- 移除 SSE 服务器 — 删除未使用的死代码(HTTP 服务器支持 SSE 流)
- 清理死代码/依赖 —
zod-to-json-schema、ordinance 提示、start:sse脚本
v3.0.x 变更历史
v3.0.2 — Unified Architecture + Setup Wizard
v2 将法制处 41 个 API 结构化为 89 个 MCP 工具。 v3 将同样的 41 个 API 重新压缩为 14 个工具(v3.2.2 后 15 个,v4.3 中 19 个,v4.4.0 中合并为 9 个)。
| 法制处原始 | v2 | v3 | |
|---|---|---|---|
| API/工具数量 | 41 | 89 | 14 |
| AI 上下文成本 | - | ~110 KB | ~20 KB |
| 功能覆盖 | - | 100% | 100% |
| 配置文件管理 | - | lite/full 分离 | 单一(无需) |
为何 89 个减少到 14 个
v2 的错误:每个 API 对应一个工具。虽然直观,但从 AI 角度需要读取全部 89 个 schema,导致上下文的一半消耗在工具列表上。
v3 的转变:将模式相似的工具通过统一 domain 参数整合。
判例、宪法法院、税务审判、公平交易委员会等 17 个域合并为一个 search_decisions(domain) + get_decision_text(domain) 2 个工具。
其余专业工具(术语、星号、历史等)保持不变,但通过 discover_tools → execute_tool 仅在需要时访问。
对用户的好处
- AI 更准确 — 在 89 个中选择的 AI,现在仅看 14 个即可即时判断
- 响应速度提升 — 上下文减少 82%
- 配置简化 — 无需选择 lite/full 配置文件。所有客户端相同的 14 个工具
- 立即访问 17 个判例域 — 无需经过 discover 即可直接搜索
其他变更
- kordoc 1.6 → 2.2.5 — 文档解析引擎升级(支持 XLSX/DOCX,安全强化,表单填写)
- 修复行政审判全文查询错误 — 添加 API 响应键回退
- 修复英文法令全文查询错误 — 支持新版 API 响应结构
给开发者
在 MCP 工具设计中,工具数量 ≠ 功能数量。 将 41 个 API 展开为 89 个再重新压缩为 14 个的过程,是寻找“适当抽象级别”的旅程。
核心模式:Dispatch Table + Domain Enum。 现有 handler 函数一行未改。
v2.x 变更历史
v2.3.2 — 改进运营代码质量(47 文件,-179 行)。减少表情/装饰,链缓存,错误处理统一。
v2.3.0 — 工具配置文件(lite/full),URL 查询 API 密钥,kordoc 集成解析器。
v2.2.0 — 新增 23 个工具(64→87)。条约、法令-自治法规关联、文档分析引擎。
v1.8~1.9 — 链工具 8 个,批量条款查询,AI 搜索过滤,结构化错误格式。
为什么开发
大韩民国拥有 超过 1,600 件现行法律、超过 10,000 件行政规则,以及连接大法院、宪法法院、税务审判院、关税厅的庞大判例体系。所有这些都在 法制处 这一个网站中,但开发者体验极其糟糕。
本项目将整个法令系统封装为 10 个工具,使 AI 助手或脚本可以直接调用。由一位因手动搜索法制处数百次而疲惫的公务员开发。
安装与使用
步骤 0:获取 API 密钥(免费,1 分钟)
所有方法共需的 法制处 Open API 认证密钥(OC) 请先申请。
- 访问 法制处 Open API 申请页面。
- 注册后登录。
- 点击 “Open API 使用申请” 按钮。
- 填写申请表即可获得 认证密钥(OC)。 (例如:
honggildong) - 在以下设置中使用该密钥。
方法 1:Claude Code 插件(一行安装,最简单)⚡
如果使用 Claude Code,两行即可完成。安装过程中会自动询问 API 密钥。
/plugin marketplace add chrisryugj/korean-law-mcp
/plugin install korean-law@korean-law-marketplace
安装期间会提示输入 法制处 API 密钥(在步骤 0 中获取的类似 honggildong 的密钥)。将作为敏感信息安全存储。
使用: 用自然语言向 Claude Code 提问,korean-law MCP 工具将自动调用。
"告诉我劳动基准法第74条"
"验证民法第750条的判例"
更新: 新版本发布时用一行更新
/plugin marketplace update korean-law-marketplace
内部执行
npx korean-law-mcp@latest,因此始终使用 npm 上发布的最新版本。
问题排查:Permission denied (publickey) 错误
如果安装过程中出现以下错误,表示 Claude Code 安装程序尝试通过 SSH 连接 GitHub 但未注册 SSH 密钥(尤其常见于首次使用 Git 的非开发者/法律实务人员)。
Failed to install: Failed to clone repository: Cloning into
'/Users/<user>/.claude/plugins/cache/temp_github_<id>'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
解决方法 (二选一):
-
强制通过 HTTPS 绕行 (最简单,推荐): 在终端中执行一行命令,然后重新尝试
/plugin installgit config --global url."https://github.com/".insteadOf "git@github.com:" -
生成 SSH Key 并注册到 GitHub: 如果打算经常通过 SSH 使用 GitHub 账号操作其他仓库
ssh-keygen -t ed25519 -C "your-email@example.com" # 回车3次 cat ~/.ssh/id_ed25519.pub # 复制输出内容将复制好的公钥粘贴到 GitHub → Settings → SSH and GPG keys → New SSH key
安装后,上述 rewrite 设置可以保留 (HTTPS clone 始终可用)。
方法 2: 在 Claude.ai 网页直接使用 (无需安装)
无需安装任何东西,只需输入一个地址即可。需要 Claude Pro/Max/Team/Enterprise 套餐 (Free 套餐仅支持1个连接器)。
添加连接器步骤:
- 登录 claude.ai。
- 点击左侧边栏底部的 您的名字。
- 选择 “设置” (或 Settings)。
- 进入 “连接器” (或 Connectors) 菜单。
- 在 “自定义连接器” 区域,点击 “添加自定义连接器” 按钮。
- 输入以下内容:
- 名称:
korean-law(名称可任意) - URL: 粘贴下方地址,将
honggildong替换为 步骤0中获取的个人认证密钥:
- 名称:
https://mcp.gomdori.app/law?oc=honggildong
- 点击 添加 按钮,注册完成!
激活工具 (重要!):
- 点击已添加连接器的 “配置” (或 Configure)。
- 在工具列表中,将所有工具设置为 “始终允许使用” (或 Always allow)。
- 这样无需每次审批,AI 即可直接检索法令。
使用方法:
- 返回聊天界面,输入 “告知我劳动标准法第74条” 即可!
注意: 如需修改连接器 URL,需删除后重新添加。
从 v3 版本开始,无需选择配置文件。10个工具覆盖了42个 API 的全部功能。 如果您之前填写的是
?profile=lite&oc=...格式的地址,可以保留 — 功能相同。
方法 3: 在 AI 桌面应用中使用 (无需安装)
如果您使用 Claude Desktop、Cursor、Windsurf 等 桌面应用,请在配置文件中添加以下内容。
查找配置文件位置:
| 应用名称 | Windows | Mac |
|---|---|---|
| Claude Desktop | %APPDATA%\Claude\claude_desktop_config.json | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | 项目文件夹内的 .cursor/mcp.json | 项目文件夹内的 .cursor/mcp.json |
| Windsurf | 项目文件夹内的 .windsurf/mcp.json | 项目文件夹内的 .windsurf/mcp.json |
Claude Desktop
Claude Desktop 无法直接连接远程 HTTP MCP 服务器,需通过 mcp-remote 适配器进行连接。需要 Node.js 18 及以上版本 (用于 npx)。
{
"mcpServers": {
"korean-law": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.gomdori.app/law?oc=honggildong"
]
}
}
}
请将
honggildong替换为个人认证密钥。如果不想安装 Node.js,请使用 方法 4 的本地安装。
Cursor、Windsurf 等 (支持远程 HTTP 的客户端)
{
"mcpServers": {
"korean-law": {
"url": "https://mcp.gomdori.app/law?oc=honggildong"
}
}
}
如果已配置其他 MCP 服务器,只需在
"mcpServers": { ... }内添加"korean-law": { ... }部分即可。
保存后 重启 应用,法令工具即可激活。
方法 4: 在本地电脑直接安装 (可离线)
如需在没有网络的情况下使用,或不想经过远程服务器,可以直接安装。
前置准备: 需要安装 Node.js 18 及以上版本。
自动安装 (推荐):
npx korean-law-mcp setup
安装向导会一次性完成 API 密钥输入 → AI 客户端选择 → 配置文件自动注册等全部步骤。 支持 Claude Desktop、Claude Code、Cursor、VS Code、Windsurf、Gemini CLI。
手动安装:
npm install -g korean-law-mcp
在 AI 应用配置文件中添加以下内容 (将 honggildong 替换为个人认证密钥):
{
"mcpServers": {
"korean-law": {
"command": "korean-law-mcp",
"env": {
"LAW_OC": "honggildong"
}
}
}
}
重启应用即可完成!
方法 5: 在终端 (CLI) 中直接使用
如果您是开发者,可以直接在终端中检索法令。
# 安装
npm install -g korean-law-mcp
# 设置认证密钥 (将 honggildong 替换为个人密钥)
export LAW_OC=honggildong # Mac/Linux
set LAW_OC=honggildong # Windows CMD
$env:LAW_OC="honggildong" # Windows PowerShell
# 使用示例
korean-law "民法第1条" # 直接用自然语言查询
korean-law search_law --query "关税法" # 直接调用工具
korean-law list # 查看所有工具列表
korean-law list --category 判例 # 按类别筛选
korean-law help search_law # 查看工具帮助
API 密钥传递方法总结
可以通过多种方式传递认证密钥。优先级从上到下依次生效:
| 方法 | 用法 | 何时使用 |
|---|---|---|
| 包含在 URL 中 | 地址末尾添加 ?oc=我的密钥 | 在 Web 客户端中最简便 |
| HTTP 头 | apikey: 我的密钥 | 编程对接时使用 |
| 环境变量 | LAW_OC=我的密钥 | 本地安装 (方法 3, 4) |
| 工具参数 | apiKey: "我的密钥" | 特定请求使用不同密钥时 |
法制处 API 协议设置
法制处 API 调用默认使用 HTTPS。在内部网络、封闭网络等证书验证困难的环境中,可设置 LAW_API_PROTOCOL=http 以 HTTP 方式调用。
最清晰的方式是将其放在 MCP 客户端设置的 env 块中:
{
"mcpServers": {
"korean-law": {
"command": "korean-law-mcp",
"env": {
"LAW_OC": "honggildong",
"LAW_API_PROTOCOL": "http"
}
}
}
}
也可以在终端中直接执行或使用 .env 文件:
export LAW_API_PROTOCOL=http # Mac/Linux
set LAW_API_PROTOCOL=http # Windows CMD
$env:LAW_API_PROTOCOL="http" # Windows PowerShell
LAW_OC=honggildong
LAW_API_PROTOCOL=http
允许的值为 http、https。未设置或设置为其他值时,将使用 https。
国税厅判例服务器 TLS/代理设置
由于国税厅来源的判例正文有时不能仅通过法制处 JSON 响应提供,内部会额外查询 taxlaw.nts.go.kr 的国税厅判例服务器。该服务器即使通过 HTTP 访问也会重定向到 HTTPS,因此,与 LAW_API_PROTOCOL=http 设置无关,Node.js 运行时必须信任 https://taxlaw.nts.go.kr 的证书。
在内部网络、封闭网络、防火墙、SSL inspection 代理之后,浏览器可能可以正常打开国税厅判例页面,但 Node.js 的 fetch() 可能因 [EXTERNAL_API_ERROR] fetch failed 而失败。这是因为浏览器和 Node.js 使用的证书存储和代理设置可能不同。
请在运行环境中首先以 Node.js 为基础确认 HTTPS 连接:
node -e "fetch('https://taxlaw.nts.go.kr/qt/USEQTA002P.do?ntstDcmId=200000000000019303').then(r=>console.log(r.status,r.url)).catch(e=>console.error(e.name,e.message,e.cause))"
如果在运营网络中无法直接连接,需要经过单独的 Web 代理,请设置实际的代理服务器地址。此设置当前适用于国税厅判例正文 fallback 的外部 HTTPS 连接:
LAW_EXTERNAL_HTTPS_PROXY=http://proxy-host:8080
在 Windows 中需要注册为系统环境变量时,请在管理员权限终端中进行设置。设置后请重启 Windows 或 Node.js 进程:
setx LAW_EXTERNAL_HTTPS_PROXY http://proxy-host:8080 /M
如果在代理路径下仍存在内部证书验证问题,仅限用于排查原因时,可以临时禁用此项目外部 HTTPS 代理路径的 TLS 证书验证。请勿作为运营常设设置使用:
setx LAW_EXTERNAL_TLS_REJECT_UNAUTHORIZED 0 /M
诊断后移除:
reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v LAW_EXTERNAL_TLS_REJECT_UNAUTHORIZED /f
使用示例
"告知我关税法第38条"
→ search_law("关税法") → 获取 MST → get_law_text(mst, jo="003800")
"比较化学品管理法最新修订"
→ "化学品管理法" → 自动识别 → compare_old_new(mst)
"劳动标准法第74条解释例"
→ search_interpretations("劳动标准法第74条") → get_interpretation_text(id)
"告知我产业安全保健法附表1内容"
→ get_annexes(lawName="产业安全保健法附表1") → 下载 HWPX 文件 → 将表格/文本转换为 Markdown
工具结构 (10个)
v4.4.0 整合了公开工具 (上下文缩减 52%)。原有的 8 个 chain_* 整合到 legal_research 的 task 中,4 个杀手级功能整合到 legal_analysis 的 mode 中。其余专有工具通过 discover_tools → execute_tool 访问,同时保留对原有工具名称的直接调用以实现向后兼容。v4.7.0 新增了 ordinance_radar,目前共 10 个。
| 分类 | 工具 | 说明 |
|---|---|---|
| 研究 (1) | legal_research | 多层级法令研究 — 可选 task 8种 (见下表) |
| 精密分析 (1) | legal_analysis | 验证·分析 — 可选 mode 4种 (见下表) |
| 法令 (3) | search_law | 法令检索 → 获取 lawId, MST |
get_law_text | 条款原文查询 | |
get_annexes | 附表/格式查询 (金额表·费率表·附录格式) | |
| 自治法规 (1) | ordinance_radar | 条例整备雷达 — 自动比对上级法修订依据 (v4.7.0) |
| 综合 (2) | search_decisions | 17个领域 综合检索 (判例·宪法裁判·税务审判·公平委·劳动委·关税·解释例·行政审判·个人信息委·权益委·诉请审查·学规·公团·公共机构·条约·英文法令) |
get_decision_text | 17个领域 原文查询 | |
| 元 (2) | discover_tools | 专有工具检索 (术语·附表·历史·比较等) |
execute_tool | 专有工具代理执行 |
legal_research 任务 8 种(原 chain_*)
| task | 说明 | 场景扩展 |
|---|---|---|
full_research(默认) | 综合研究(AI搜索→法规→判例→解释) | customs: 关税·通关综合 / action_plan: 这种情况这样做,5步指南 |
law_system | 法律体系分析(三级比较,授权结构) | delegation: 授权立法监督 / impact: 影响度分析 |
action_basis | 处分依据确认(许可·认可·处分) | penalty: 处分·罚款标准综合 |
dispute_prep | 争端应对(不服·诉讼·审判) | domain: tax/labor/privacy/competition |
amendment_track | 修订追踪(新旧对照,沿革) | timeline: 时序时间线 / time_travel: 两个时间点自动 diff |
ordinance_compare | 条例比较(上位法→全国条例) | compliance: 上位法合规性验证 |
procedure_detail | 程序·费用·格式指南 | manual: 公务员处理手册 |
document_review | 合同·条款风险分析(需要 text 参数) | — |
legal_analysis 模式 4 种(原 killer feature)
| mode | 说明 | 必需参数 |
|---|---|---|
verify_citations | 防止 LLM 幻觉 — 批量验证引用法条是否存在 (v3.5) | text |
cite_check | 判例存活检查 — 后续引用逆向追踪 + 变更·废弃检测,韩国版 Citator (v4.3) | caseNumber |
applicable_law | 行为时法判断 — 时点适用版本 + 附则过渡条款摘录 (v4.3) | lawName, date |
impact_map | 法条影响图 — 引用判例·解释·自治法规逆向搜索 + mermaid (v4.0) | lawName, jo |
全部工具详情请参考 docs/API.md。
主要特点
- 42 个 API → 10 个工具 — 法规、判例、行政规则、自治法规、宪法裁判、税务审判、关税解释、国税厅解释例、条约、校规/公团/公共机关规定、法规术语
- MCP + CLI — 在 Claude Desktop 和终端中均可使用相同工具
- 法律领域专用 — 自动识别简称(
화관법→화학물질관리법)、条款编号转换(제38조↔003800)、三级授权结构可视化 - 附表/附件正文提取 — HWPX·HWP·PDF·XLSX·DOCX 自动转换(kordoc 引擎)
- 8 个 Chain + 7 个场景 — 基础 Chain 自动添加情景扩展分析(罚款减免、关税通关、授权立法监督等)
- 17 个领域统一搜索 — 一个
search_decisions即可即时访问判例、宪法裁判、税务审判、公平交易委员会、劳动委员会等 - 缓存 — 搜索 1 小时,法条 24 小时 TTL
- 远程端点 — 无需安装,直接使用
https://mcp.gomdori.app/law(原有korean-law-mcp.fly.dev/mcp也保持向下兼容)
文档
- docs/API.md — 工具参考
- docs/ARCHITECTURE.md — 系统设计
- docs/DEVELOPMENT.md — 开发指南
Star History
许可证
Made by 柳主任 @ 广津区厅 AI 同好会 AI.Do
