korean-law-mcp 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -21
- package/build/tool-registry.js +29 -9
- package/build/tools/legal-analysis.d.ts +29 -0
- package/build/tools/legal-analysis.js +55 -0
- package/build/tools/legal-research.d.ts +54 -0
- package/build/tools/legal-research.js +105 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Korean Law MCP
|
|
2
2
|
|
|
3
|
-
**법제처 42개 API를
|
|
3
|
+
**법제처 42개 API를 9개 도구로.** 법령, 판례, 행정규칙, 자치법규, 조약, 해석례(국세청 포함) + **LLM 환각 방지 인용 검증** + **조문 영향 그래프** + **시점 비교 자동 diff** + **이럴 땐 이렇게 — 5단계 안내** + **판례 생사 확인(Citator)** + **행위시법 판단**을 AI 어시스턴트나 터미널에서 바로 사용.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/korean-law-mcp)
|
|
6
6
|
[](https://modelcontextprotocol.io)
|
|
@@ -14,6 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
+
## v4.4.0 — 노출 도구 통폐합 19개 → 9개 (컨텍스트 52% 감축)
|
|
18
|
+
|
|
19
|
+
MCP 클라이언트가 매 세션 읽는 도구 목록(ListTools)을 ~15.1KB → ~7.2KB로 줄였습니다.
|
|
20
|
+
|
|
21
|
+
- `chain_*` 8개 → **`legal_research`** 하나로 (`task` 파라미터: full_research·law_system·action_basis·dispute_prep·amendment_track·ordinance_compare·procedure_detail·document_review)
|
|
22
|
+
- 킬러피처 4개(`verify_citations`·`cite_check`·`applicable_law`·`impact_map`) → **`legal_analysis`** 하나로 (`mode` 파라미터)
|
|
23
|
+
- **하위호환**: 기존 도구명 직접 호출·`execute_tool` 경유 모두 그대로 동작. 광고 목록에서만 빠짐
|
|
24
|
+
|
|
17
25
|
## v4.3 — 판례 생사 확인 + 행위시법 판단
|
|
18
26
|
|
|
19
27
|
**"이 판례 아직 유효한가?" + "사건 시점엔 어떤 법이 적용되나?"** — 법률 실무에서 가장 위험한 두 실수를 잡는다.
|
|
@@ -357,7 +365,7 @@ lexdiff에서 "산안기준규칙" 질의가 법제처 aiSearch의 키워드 부
|
|
|
357
365
|
**v3.0.2** — Unified Architecture + Setup Wizard
|
|
358
366
|
|
|
359
367
|
법제처 41개 API를 89개 MCP 도구로 구조화했던 v2.
|
|
360
|
-
v3는 같은 41개 API를 **14개 도구**로 재압축했습니다 (v3.2.2 이후 15개, v4.3
|
|
368
|
+
v3는 같은 41개 API를 **14개 도구**로 재압축했습니다 (v3.2.2 이후 15개, v4.3에서 19개, v4.4.0에서 통폐합으로 9개).
|
|
361
369
|
|
|
362
370
|
| | 법제처 원본 | v2 | v3 |
|
|
363
371
|
|---|:---:|:---:|:---:|
|
|
@@ -421,7 +429,7 @@ MCP 도구 설계에서 **도구 수 ≠ 기능 수**입니다.
|
|
|
421
429
|
|
|
422
430
|
대한민국에는 **1,600개 이상의 현행 법률**, **10,000개 이상의 행정규칙**, 그리고 대법원·헌법재판소·조세심판원·관세청까지 이어지는 방대한 판례 체계가 있습니다. 이 모든 게 [법제처](https://www.law.go.kr)라는 하나의 사이트에 있지만, 개발자 경험은 최악입니다.
|
|
423
431
|
|
|
424
|
-
이 프로젝트는 그 전체 법령 시스템을 **
|
|
432
|
+
이 프로젝트는 그 전체 법령 시스템을 **9개 도구**로 감싸서, AI 어시스턴트나 스크립트에서 바로 호출할 수 있게 만듭니다. 법제처를 수백 번 수동 검색하다 지친 공무원이 만들었습니다.
|
|
425
433
|
|
|
426
434
|
---
|
|
427
435
|
|
|
@@ -526,7 +534,7 @@ https://korean-law-mcp.fly.dev/mcp?oc=honggildong
|
|
|
526
534
|
|
|
527
535
|
> **참고**: 커넥터 URL을 수정하려면 삭제 후 다시 추가해야 합니다.
|
|
528
536
|
|
|
529
|
-
> v3부터 프로필 선택이 필요 없습니다.
|
|
537
|
+
> v3부터 프로필 선택이 필요 없습니다. 9개 도구가 42개 API 전체를 커버합니다.
|
|
530
538
|
> 기존에 `?profile=lite&oc=...` 주소를 넣으셨다면 **그대로 두셔도 됩니다** — 동일하게 작동합니다.
|
|
531
539
|
|
|
532
540
|
---
|
|
@@ -748,39 +756,51 @@ reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /
|
|
|
748
756
|
|
|
749
757
|
---
|
|
750
758
|
|
|
751
|
-
## 도구 구조 (
|
|
759
|
+
## 도구 구조 (9개)
|
|
752
760
|
|
|
753
|
-
v4
|
|
761
|
+
v4.4.0은 9개 도구만 노출합니다 (컨텍스트 52% 감축). 기존 `chain_*` 8개는 `legal_research`의 `task`로, 킬러피처 4개는 `legal_analysis`의 `mode`로 통합. 나머지 전문 도구는 `discover_tools` → `execute_tool`로 접근하며, 기존 도구명 직접 호출도 하위호환으로 계속 동작합니다.
|
|
754
762
|
|
|
755
|
-
| 구분 | 도구 | 설명 |
|
|
756
|
-
|
|
757
|
-
|
|
|
758
|
-
| | `
|
|
759
|
-
| | `chain_action_basis` | 처분 근거 확인 (허가·인가·처분) | `penalty`: 처분·벌칙 기준 종합 / `action_plan`: 이럴 땐 이렇게, 5단계 안내 |
|
|
760
|
-
| | `chain_dispute_prep` | 쟁송 대비 (불복·소송·심판) | — |
|
|
761
|
-
| | `chain_amendment_track` | 개정 추적 (신구대조, 연혁) | `timeline`: 시계열 타임라인 / `time_travel`: 두 시점 자동 diff |
|
|
762
|
-
| | `chain_ordinance_compare` | 조례 비교 (상위법→전국 조례) | `compliance`: 상위법 적합성 검증 |
|
|
763
|
-
| | `chain_procedure_detail` | 절차·비용·서식 안내 | `manual`: 공무원 처리 매뉴얼 |
|
|
764
|
-
| | `chain_document_review` | 계약서·약관 리스크 분석 | — |
|
|
763
|
+
| 구분 | 도구 | 설명 |
|
|
764
|
+
|------|------|------|
|
|
765
|
+
| **리서치** (1) | `legal_research` | 다단계 법령 리서치 — `task` 8종 선택 (아래 표) |
|
|
766
|
+
| **정밀분석** (1) | `legal_analysis` | 검증·분석 — `mode` 4종 선택 (아래 표) |
|
|
765
767
|
| **법령** (3) | `search_law` | 법령 검색 → lawId, MST 획득 |
|
|
766
768
|
| | `get_law_text` | 조문 전문 조회 |
|
|
767
769
|
| | `get_annexes` | 별표/서식 조회 (금액표·요율표·별지서식) |
|
|
768
770
|
| **통합** (2) | `search_decisions` | **17개 도메인** 통합 검색 (판례·헌재·조세심판·공정위·노동위·관세·해석례·행심·개인정보위·권익위·소청심사·학칙·공사공단·공공기관·조약·영문법령) |
|
|
769
771
|
| | `get_decision_text` | **17개 도메인** 전문 조회 |
|
|
770
|
-
| **킬러** (4) | `verify_citations` | LLM 환각 방지 — 인용 조문 실존 여부 일괄 검증 (v3.5) |
|
|
771
|
-
| | `impact_map` | 조문 영향 그래프 — 인용 판례·해석·자치법규 역방향 탐색 + mermaid (v4.0) |
|
|
772
|
-
| | `cite_check` | 판례 생사 확인 — 후속 인용 역추적 + 변경·폐기 감지, 한국형 Citator (v4.3) |
|
|
773
|
-
| | `applicable_law` | 행위시법 판단 — 시점 적용 버전 + 부칙 경과규정 발췌 (v4.3) |
|
|
774
772
|
| **메타** (2) | `discover_tools` | 전문 도구 검색 (용어·별표·이력·비교 등) |
|
|
775
773
|
| | `execute_tool` | 전문 도구 프록시 실행 |
|
|
776
774
|
|
|
775
|
+
### `legal_research` task 8종 (구 chain_*)
|
|
776
|
+
|
|
777
|
+
| task | 설명 | 시나리오 확장 |
|
|
778
|
+
|------|------|-------------|
|
|
779
|
+
| `full_research` (기본) | 종합 리서치 (AI검색→법령→판례→해석) | `customs`: 관세·통관 종합 / `action_plan`: 이럴 땐 이렇게, 5단계 안내 |
|
|
780
|
+
| `law_system` | 법체계 분석 (3단비교, 위임구조) | `delegation`: 위임입법 감시 / `impact`: 영향도 분석 |
|
|
781
|
+
| `action_basis` | 처분 근거 확인 (허가·인가·처분) | `penalty`: 처분·벌칙 기준 종합 |
|
|
782
|
+
| `dispute_prep` | 쟁송 대비 (불복·소송·심판) | `domain`: tax/labor/privacy/competition |
|
|
783
|
+
| `amendment_track` | 개정 추적 (신구대조, 연혁) | `timeline`: 시계열 타임라인 / `time_travel`: 두 시점 자동 diff |
|
|
784
|
+
| `ordinance_compare` | 조례 비교 (상위법→전국 조례) | `compliance`: 상위법 적합성 검증 |
|
|
785
|
+
| `procedure_detail` | 절차·비용·서식 안내 | `manual`: 공무원 처리 매뉴얼 |
|
|
786
|
+
| `document_review` | 계약서·약관 리스크 분석 (`text` 필수) | — |
|
|
787
|
+
|
|
788
|
+
### `legal_analysis` mode 4종 (구 킬러피처)
|
|
789
|
+
|
|
790
|
+
| mode | 설명 | 필수 파라미터 |
|
|
791
|
+
|------|------|-------------|
|
|
792
|
+
| `verify_citations` | LLM 환각 방지 — 인용 조문 실존 여부 일괄 검증 (v3.5) | `text` |
|
|
793
|
+
| `cite_check` | 판례 생사 확인 — 후속 인용 역추적 + 변경·폐기 감지, 한국형 Citator (v4.3) | `caseNumber` |
|
|
794
|
+
| `applicable_law` | 행위시법 판단 — 시점 적용 버전 + 부칙 경과규정 발췌 (v4.3) | `lawName`, `date` |
|
|
795
|
+
| `impact_map` | 조문 영향 그래프 — 인용 판례·해석·자치법규 역방향 탐색 + mermaid (v4.0) | `lawName`, `jo` |
|
|
796
|
+
|
|
777
797
|
전체 도구 상세는 [docs/API.md](docs/API.md) 참조.
|
|
778
798
|
|
|
779
799
|
---
|
|
780
800
|
|
|
781
801
|
## 주요 특징
|
|
782
802
|
|
|
783
|
-
- **42개 API →
|
|
803
|
+
- **42개 API → 9개 도구** — 법령, 판례, 행정규칙, 자치법규, 헌재결정, 조세심판, 관세해석, 국세청 해석례, 조약, 학칙/공단/공공기관 규정, 법령용어
|
|
784
804
|
- **MCP + CLI** — Claude Desktop에서도, 터미널에서도 같은 도구 사용
|
|
785
805
|
- **법률 도메인 특화** — 약칭 자동 인식(`화관법` → `화학물질관리법`), 조문번호 변환(`제38조` ↔ `003800`), 3단 위임 구조 시각화
|
|
786
806
|
- **별표/별지서식 본문 추출** — HWPX·HWP·PDF·XLSX·DOCX 자동 변환 ([kordoc](https://github.com/chrisryugj/kordoc) 엔진)
|
package/build/tool-registry.js
CHANGED
|
@@ -55,6 +55,9 @@ import { verifyCitations, VerifyCitationsSchema } from "./tools/verify-citations
|
|
|
55
55
|
import { impactMap, ImpactMapSchema } from "./tools/impact-map.js";
|
|
56
56
|
import { citeCheck, CiteCheckSchema } from "./tools/cite-check.js";
|
|
57
57
|
import { applicableLaw, ApplicableLawSchema } from "./tools/applicable-law.js";
|
|
58
|
+
// 통합 진입점 (v4.4.0 — 노출 도구 수 축소용)
|
|
59
|
+
import { legalResearch, LegalResearchSchema } from "./tools/legal-research.js";
|
|
60
|
+
import { legalAnalysis, LegalAnalysisSchema } from "./tools/legal-analysis.js";
|
|
58
61
|
// Chain tool imports
|
|
59
62
|
import { chainLawSystem, chainLawSystemSchema, chainActionBasis, chainActionBasisSchema, chainDisputePrep, chainDisputePrepSchema, chainAmendmentTrack, chainAmendmentTrackSchema, chainOrdinanceCompare, chainOrdinanceCompareSchema, chainFullResearch, chainFullResearchSchema, chainProcedureDetail, chainProcedureDetailSchema, chainDocumentReview, chainDocumentReviewSchema, } from "./tools/chains.js";
|
|
60
63
|
/**
|
|
@@ -548,6 +551,21 @@ export const allTools = [
|
|
|
548
551
|
schema: GetArticleWithPrecedentsSchema,
|
|
549
552
|
handler: getArticleWithPrecedents
|
|
550
553
|
},
|
|
554
|
+
// === 통합 진입점 (v4.4.0) ===
|
|
555
|
+
// legal_research/legal_analysis가 아래 chain_*/킬러피처 12개를 대체 노출.
|
|
556
|
+
// 원본 도구는 allTools에 유지 — 직접 CallTool/execute_tool 하위호환.
|
|
557
|
+
{
|
|
558
|
+
name: "legal_research",
|
|
559
|
+
description: "[⛓리서치] 다단계 법령 리서치 통합 — 여러 API를 병렬로 엮는 복합 질문 전용. task: full_research=도메인·법령명 불명확한 자연어 질문 폴백(기본값, 예 '음주운전 처벌 기준') | law_system=법률·시행령·시행규칙 3단+위임+별표(예 '관세법 체계') | action_basis=처분·허가의 법적 근거+해석례+판례+행심(예 '영업정지 근거') | dispute_prep=불복·소송 준비, 판례+심판례+도메인 결정례(예 '과세처분 불복') | amendment_track=개정 이력+신구대조+연혁(예 '2023년 개정 뭐 바뀜') | ordinance_compare=조례 전국 비교+상위법 적합성(예 '서울시 주차 조례') | procedure_detail=절차·수수료·별표서식(예 '건축허가 절차') | document_review=계약서·약관 조항 리스크+근거법령(text 필수). 단일 조회로 답이 되면 search_law/get_law_text 쓸 것.",
|
|
560
|
+
schema: LegalResearchSchema,
|
|
561
|
+
handler: legalResearch
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
name: "legal_analysis",
|
|
565
|
+
description: "[정밀분석] 검증·분석 4종 통합. mode: verify_citations=텍스트 속 조문 인용('민법 제750조' 등)이 실존하는지 법제처 DB 교차검증, LLM 환각 방지(text 필수) | cite_check=판례 생사 확인 — 사건번호로 후속 인용 역추적+변경·폐기 감지, 한국형 Citator(caseNumber 필수) | applicable_law=사건 시점에 시행되던 법령 버전+그 시점 조문+부칙 경과조치, 행위시법 판단(lawName+date 필수, jo 선택) | impact_map=한 조문을 인용한 판례·헌재·해석례·행심·조례 역방향 그래프+mermaid(lawName+jo 필수)",
|
|
566
|
+
schema: LegalAnalysisSchema,
|
|
567
|
+
handler: legalAnalysis
|
|
568
|
+
},
|
|
551
569
|
// === 체인 도구 (다단계 자동 실행) ===
|
|
552
570
|
// 사용 원칙: 단일 조회(search_law/get_law_text)로 답이 되면 체인 쓰지 말 것.
|
|
553
571
|
// 체인은 "여러 API를 병렬로 엮어야 하는" 복합 질문 전용.
|
|
@@ -637,7 +655,7 @@ export const allTools = [
|
|
|
637
655
|
// === 메타 도구 (lite 프로필용) ===
|
|
638
656
|
{
|
|
639
657
|
name: "discover_tools",
|
|
640
|
-
description: "[메타] 위
|
|
658
|
+
description: "[메타] 위 도구로 안 되는 경우. 전문도구(조세심판·관세·헌재·행심·공정위·개인정보위·노동위·학칙·조약·영문법령·용어 등 80+개) 카테고리 검색",
|
|
641
659
|
schema: DiscoverToolsSchema,
|
|
642
660
|
handler: discoverTools
|
|
643
661
|
},
|
|
@@ -668,7 +686,10 @@ function toMcpInputSchema(schema) {
|
|
|
668
686
|
// Zod v4: z.toJSONSchema()로 직접 변환 (zod-to-json-schema는 Zod v4 미지원)
|
|
669
687
|
const rawSchema = z.toJSONSchema(schema);
|
|
670
688
|
if (rawSchema?.type === "object" && rawSchema?.properties) {
|
|
689
|
+
// apiKey는 HTTP 헤더(session-state)로 전달되는 게 정식 경로 — 광고 스키마에서 숨김.
|
|
690
|
+
// Zod parse는 여전히 수용하므로 인자로 넘기는 기존 클라이언트도 동작.
|
|
671
691
|
const props = { ...rawSchema.properties };
|
|
692
|
+
delete props.apiKey;
|
|
672
693
|
const required = Array.isArray(rawSchema.required)
|
|
673
694
|
? rawSchema.required.filter((k) => k !== "apiKey")
|
|
674
695
|
: [];
|
|
@@ -682,29 +703,28 @@ function toMcpInputSchema(schema) {
|
|
|
682
703
|
return rawSchema;
|
|
683
704
|
}
|
|
684
705
|
/**
|
|
685
|
-
*
|
|
706
|
+
* v4.4.0 통합 프로필 — 9개 도구 노출, 나머지는 execute_tool로 접근
|
|
686
707
|
*
|
|
687
708
|
* 노출 기준:
|
|
688
709
|
* 1) 체인 도구가 fallback으로 자주 호출하는 종착 도구
|
|
689
710
|
* 2) discover_tools → execute_tool 왕복으로 평균 5초+ 손실 발생
|
|
690
711
|
* 3) 그 외는 execute_tool 경유 유지
|
|
691
712
|
*
|
|
713
|
+
* v4.4.0 통폐합: chain_* 8개 → legal_research(task), 킬러피처 4개
|
|
714
|
+
* (verify_citations/cite_check/applicable_law/impact_map) → legal_analysis(mode).
|
|
715
|
+
* 원본 12개는 allTools에 유지 — CallTool 직접 호출/execute_tool 하위호환.
|
|
716
|
+
*
|
|
692
717
|
* ⚠️ get_annexes 제거 금지:
|
|
693
718
|
* 헬스장 환불 케이스(trace ld-1775959823220, 79s)에서 별표 3의2를 가져오기 위해
|
|
694
719
|
* discover_tools × 2 + execute_tool 헛발질로 ~15초 손실. 직노출로 해결.
|
|
695
720
|
*/
|
|
696
721
|
const V3_EXPOSED = new Set([
|
|
697
|
-
"
|
|
698
|
-
"
|
|
699
|
-
"chain_procedure_detail", "chain_document_review",
|
|
722
|
+
"legal_research", // v4.4.0: chain_* 8개 통합 (task 파라미터)
|
|
723
|
+
"legal_analysis", // v4.4.0: verify_citations/cite_check/applicable_law/impact_map 통합 (mode 파라미터)
|
|
700
724
|
"search_law", "get_law_text",
|
|
701
725
|
"get_annexes",
|
|
702
726
|
"search_decisions", "get_decision_text",
|
|
703
727
|
"discover_tools", "execute_tool",
|
|
704
|
-
"verify_citations", // v3.5: LLM 환각 방지 인용 검증
|
|
705
|
-
"impact_map", // v4.0: 조문 영향 그래프 (역방향 탐색 + mermaid)
|
|
706
|
-
"cite_check", // v4.3: 판례 생사 확인 (한국형 Shepard's Citator)
|
|
707
|
-
"applicable_law", // v4.3: 행위시법 판단 (시점 적용 버전 + 부칙 경과규정)
|
|
708
728
|
]);
|
|
709
729
|
// 이름 기반 O(1) 조회용 Map
|
|
710
730
|
// allTools는 정적 — 모듈 로드 시 1회만 구성 (HTTP 모드에서 요청마다 재구성 방지)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* legal_analysis — 정밀 분석/검증 4종 통합 진입점 (v4.4.0)
|
|
3
|
+
*
|
|
4
|
+
* verify_citations·cite_check·applicable_law·impact_map을 mode 파라미터로
|
|
5
|
+
* 통합해 MCP 노출 도구 수를 줄인다. 원본 도구는 allTools에 그대로 남아
|
|
6
|
+
* 직접 호출/execute_tool 경유가 계속 동작한다 (하위호환).
|
|
7
|
+
* 세부 옵션(deepScan, includeMermaid 등)은 원본 도구의 기본값을 따른다.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import type { LawApiClient } from "../lib/api-client.js";
|
|
11
|
+
import type { LooseToolResponse } from "../lib/types.js";
|
|
12
|
+
export declare const LegalAnalysisSchema: z.ZodObject<{
|
|
13
|
+
mode: z.ZodEnum<{
|
|
14
|
+
verify_citations: "verify_citations";
|
|
15
|
+
cite_check: "cite_check";
|
|
16
|
+
applicable_law: "applicable_law";
|
|
17
|
+
impact_map: "impact_map";
|
|
18
|
+
}>;
|
|
19
|
+
text: z.ZodOptional<z.ZodString>;
|
|
20
|
+
caseNumber: z.ZodOptional<z.ZodString>;
|
|
21
|
+
lawName: z.ZodOptional<z.ZodString>;
|
|
22
|
+
jo: z.ZodOptional<z.ZodString>;
|
|
23
|
+
date: z.ZodOptional<z.ZodString>;
|
|
24
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export type LegalAnalysisInput = z.infer<typeof LegalAnalysisSchema>;
|
|
27
|
+
type ToolResponse = LooseToolResponse;
|
|
28
|
+
export declare function legalAnalysis(apiClient: LawApiClient, input: LegalAnalysisInput): Promise<ToolResponse>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* legal_analysis — 정밀 분석/검증 4종 통합 진입점 (v4.4.0)
|
|
3
|
+
*
|
|
4
|
+
* verify_citations·cite_check·applicable_law·impact_map을 mode 파라미터로
|
|
5
|
+
* 통합해 MCP 노출 도구 수를 줄인다. 원본 도구는 allTools에 그대로 남아
|
|
6
|
+
* 직접 호출/execute_tool 경유가 계속 동작한다 (하위호환).
|
|
7
|
+
* 세부 옵션(deepScan, includeMermaid 등)은 원본 도구의 기본값을 따른다.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { verifyCitations } from "./verify-citations.js";
|
|
11
|
+
import { citeCheck } from "./cite-check.js";
|
|
12
|
+
import { applicableLaw } from "./applicable-law.js";
|
|
13
|
+
import { impactMap } from "./impact-map.js";
|
|
14
|
+
export const LegalAnalysisSchema = z.object({
|
|
15
|
+
mode: z.enum(["verify_citations", "cite_check", "applicable_law", "impact_map"])
|
|
16
|
+
.describe("분석 유형 (도구 설명의 mode 표 참조)"),
|
|
17
|
+
text: z.string().optional()
|
|
18
|
+
.describe("[verify_citations 필수] 검증할 법률 텍스트 (LLM 답변/계약서 등 조문 인용 포함 문자열)"),
|
|
19
|
+
caseNumber: z.string().optional()
|
|
20
|
+
.describe("[cite_check 필수] 사건번호 (예: '2013다61381', 문장 포함 가능)"),
|
|
21
|
+
lawName: z.string().optional()
|
|
22
|
+
.describe("[applicable_law·impact_map 필수] 법령명 (예: '민법', '도로교통법')"),
|
|
23
|
+
jo: z.string().optional()
|
|
24
|
+
.describe("[impact_map 필수, applicable_law 선택] 조문 번호 (예: '제103조', '제10조의2')"),
|
|
25
|
+
date: z.string().optional()
|
|
26
|
+
.describe("[applicable_law 필수] 기준일 — 행위·계약·처분 시점 (예: '2023-05-10', '20230510')"),
|
|
27
|
+
apiKey: z.string().optional(),
|
|
28
|
+
});
|
|
29
|
+
function inputError(message) {
|
|
30
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
31
|
+
}
|
|
32
|
+
export async function legalAnalysis(apiClient, input) {
|
|
33
|
+
const apiKey = input.apiKey;
|
|
34
|
+
switch (input.mode) {
|
|
35
|
+
case "verify_citations":
|
|
36
|
+
if (!input.text)
|
|
37
|
+
return inputError("mode=verify_citations에는 text가 필요합니다.");
|
|
38
|
+
return verifyCitations(apiClient, { text: input.text, maxCitations: 15, apiKey });
|
|
39
|
+
case "cite_check":
|
|
40
|
+
if (!input.caseNumber)
|
|
41
|
+
return inputError("mode=cite_check에는 caseNumber가 필요합니다.");
|
|
42
|
+
return citeCheck(apiClient, { caseNumber: input.caseNumber, display: 20, deepScan: true, apiKey });
|
|
43
|
+
case "applicable_law":
|
|
44
|
+
if (!input.lawName || !input.date)
|
|
45
|
+
return inputError("mode=applicable_law에는 lawName과 date가 필요합니다.");
|
|
46
|
+
return applicableLaw(apiClient, { lawName: input.lawName, date: input.date, jo: input.jo, apiKey });
|
|
47
|
+
case "impact_map":
|
|
48
|
+
if (!input.lawName || !input.jo)
|
|
49
|
+
return inputError("mode=impact_map에는 lawName과 jo가 필요합니다.");
|
|
50
|
+
return impactMap(apiClient, {
|
|
51
|
+
lawName: input.lawName, jo: input.jo,
|
|
52
|
+
includeOrdinances: true, includeMermaid: true, apiKey,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* legal_research — 체인 8개 통합 진입점 (v4.4.0)
|
|
3
|
+
*
|
|
4
|
+
* 기존 chain_* 8개를 task 파라미터 하나로 통합해 MCP 노출 도구 수와
|
|
5
|
+
* ListTools 컨텍스트 비용을 줄인다. 기존 chain_* 도구는 allTools에
|
|
6
|
+
* 그대로 남아 직접 호출/execute_tool 경유가 계속 동작한다 (하위호환).
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import type { LawApiClient } from "../lib/api-client.js";
|
|
10
|
+
import { chainFullResearch } from "./chains.js";
|
|
11
|
+
export declare const LegalResearchSchema: z.ZodObject<{
|
|
12
|
+
query: z.ZodOptional<z.ZodString>;
|
|
13
|
+
task: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
14
|
+
law_system: "law_system";
|
|
15
|
+
action_basis: "action_basis";
|
|
16
|
+
ordinance_compare: "ordinance_compare";
|
|
17
|
+
full_research: "full_research";
|
|
18
|
+
dispute_prep: "dispute_prep";
|
|
19
|
+
amendment_track: "amendment_track";
|
|
20
|
+
procedure_detail: "procedure_detail";
|
|
21
|
+
document_review: "document_review";
|
|
22
|
+
}>>>;
|
|
23
|
+
scenario: z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
customs: "customs";
|
|
25
|
+
manual: "manual";
|
|
26
|
+
penalty: "penalty";
|
|
27
|
+
delegation: "delegation";
|
|
28
|
+
impact: "impact";
|
|
29
|
+
time_travel: "time_travel";
|
|
30
|
+
action_plan: "action_plan";
|
|
31
|
+
timeline: "timeline";
|
|
32
|
+
compliance: "compliance";
|
|
33
|
+
}>>;
|
|
34
|
+
domain: z.ZodOptional<z.ZodEnum<{
|
|
35
|
+
general: "general";
|
|
36
|
+
tax: "tax";
|
|
37
|
+
labor: "labor";
|
|
38
|
+
privacy: "privacy";
|
|
39
|
+
competition: "competition";
|
|
40
|
+
}>>;
|
|
41
|
+
articles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
42
|
+
parentLaw: z.ZodOptional<z.ZodString>;
|
|
43
|
+
mst: z.ZodOptional<z.ZodString>;
|
|
44
|
+
lawId: z.ZodOptional<z.ZodString>;
|
|
45
|
+
fromDate: z.ZodOptional<z.ZodString>;
|
|
46
|
+
toDate: z.ZodOptional<z.ZodString>;
|
|
47
|
+
text: z.ZodOptional<z.ZodString>;
|
|
48
|
+
maxClauses: z.ZodOptional<z.ZodNumber>;
|
|
49
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export type LegalResearchInput = z.infer<typeof LegalResearchSchema>;
|
|
52
|
+
type ToolResponse = Awaited<ReturnType<typeof chainFullResearch>>;
|
|
53
|
+
export declare function legalResearch(apiClient: LawApiClient, input: LegalResearchInput): Promise<ToolResponse>;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* legal_research — 체인 8개 통합 진입점 (v4.4.0)
|
|
3
|
+
*
|
|
4
|
+
* 기존 chain_* 8개를 task 파라미터 하나로 통합해 MCP 노출 도구 수와
|
|
5
|
+
* ListTools 컨텍스트 비용을 줄인다. 기존 chain_* 도구는 allTools에
|
|
6
|
+
* 그대로 남아 직접 호출/execute_tool 경유가 계속 동작한다 (하위호환).
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { chainLawSystem, chainActionBasis, chainDisputePrep, chainAmendmentTrack, chainOrdinanceCompare, chainFullResearch, chainProcedureDetail, chainDocumentReview, } from "./chains.js";
|
|
10
|
+
export const LegalResearchSchema = z.object({
|
|
11
|
+
query: z.string().optional()
|
|
12
|
+
.describe("자연어 질문/법령명/키워드 (예: '음주운전 처벌 기준', '관세법 체계'). document_review 외 모든 task에서 필수"),
|
|
13
|
+
task: z.enum([
|
|
14
|
+
"full_research", "law_system", "action_basis", "dispute_prep",
|
|
15
|
+
"amendment_track", "ordinance_compare", "procedure_detail", "document_review",
|
|
16
|
+
]).optional().default("full_research")
|
|
17
|
+
.describe("리서치 유형 (도구 설명의 task 표 참조). 미지정 시 full_research"),
|
|
18
|
+
scenario: z.enum([
|
|
19
|
+
"delegation", "impact", "penalty", "timeline", "time_travel",
|
|
20
|
+
"compliance", "customs", "action_plan", "manual",
|
|
21
|
+
]).optional()
|
|
22
|
+
.describe("확장 시나리오. 미지정 시 쿼리에서 자동 감지. task별 호환: law_system=delegation·impact | action_basis=penalty | amendment_track=timeline·time_travel | ordinance_compare=compliance | full_research=customs·action_plan | procedure_detail=manual"),
|
|
23
|
+
domain: z.enum(["tax", "labor", "privacy", "competition", "general"]).optional()
|
|
24
|
+
.describe("[dispute_prep] 전문 분야 (tax=조세심판, labor=노동위, privacy=개인정보위, competition=공정위). 미지정 시 자동 감지"),
|
|
25
|
+
articles: z.array(z.string()).optional()
|
|
26
|
+
.describe("[law_system] 함께 조회할 조문 번호 (예: ['제38조'])"),
|
|
27
|
+
parentLaw: z.string().optional()
|
|
28
|
+
.describe("[ordinance_compare] 상위 법령명. 미지정 시 자동 검색"),
|
|
29
|
+
mst: z.string().optional().describe("[amendment_track] 법령일련번호 (알고 있으면)"),
|
|
30
|
+
lawId: z.string().optional().describe("[amendment_track] 법령ID (알고 있으면)"),
|
|
31
|
+
fromDate: z.string().regex(/^\d{8}$/).optional()
|
|
32
|
+
.describe("[time_travel] 비교 시작 시점 YYYYMMDD"),
|
|
33
|
+
toDate: z.string().regex(/^\d{8}$/).optional()
|
|
34
|
+
.describe("[time_travel] 비교 종료 시점 YYYYMMDD"),
|
|
35
|
+
text: z.string().optional()
|
|
36
|
+
.describe("[document_review 전용·필수] 검토할 계약서/약관 전문 텍스트"),
|
|
37
|
+
maxClauses: z.number().min(1).max(30).optional()
|
|
38
|
+
.describe("[document_review] 최대 분석 조항 수 (기본 15)"),
|
|
39
|
+
apiKey: z.string().optional(),
|
|
40
|
+
});
|
|
41
|
+
/** task별 허용 시나리오 — 비호환 시나리오는 무시하고 자동 감지에 맡긴다 */
|
|
42
|
+
const TASK_SCENARIOS = {
|
|
43
|
+
law_system: new Set(["delegation", "impact"]),
|
|
44
|
+
action_basis: new Set(["penalty"]),
|
|
45
|
+
amendment_track: new Set(["timeline", "time_travel"]),
|
|
46
|
+
ordinance_compare: new Set(["compliance"]),
|
|
47
|
+
full_research: new Set(["customs", "action_plan"]),
|
|
48
|
+
procedure_detail: new Set(["manual"]),
|
|
49
|
+
};
|
|
50
|
+
function inputError(message) {
|
|
51
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
52
|
+
}
|
|
53
|
+
export async function legalResearch(apiClient, input) {
|
|
54
|
+
const task = input.task ?? "full_research";
|
|
55
|
+
if (task === "document_review") {
|
|
56
|
+
if (!input.text)
|
|
57
|
+
return inputError("task=document_review에는 text(문서 전문)가 필요합니다.");
|
|
58
|
+
return chainDocumentReview(apiClient, {
|
|
59
|
+
text: input.text,
|
|
60
|
+
maxClauses: input.maxClauses ?? 15,
|
|
61
|
+
apiKey: input.apiKey,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (!input.query)
|
|
65
|
+
return inputError(`task=${task}에는 query가 필요합니다.`);
|
|
66
|
+
const query = input.query;
|
|
67
|
+
// 비호환 시나리오는 버리고 각 체인의 자동 감지에 맡긴다
|
|
68
|
+
const scenario = input.scenario && TASK_SCENARIOS[task]?.has(input.scenario)
|
|
69
|
+
? input.scenario
|
|
70
|
+
: undefined;
|
|
71
|
+
const apiKey = input.apiKey;
|
|
72
|
+
switch (task) {
|
|
73
|
+
case "law_system":
|
|
74
|
+
return chainLawSystem(apiClient, {
|
|
75
|
+
query, articles: input.articles,
|
|
76
|
+
scenario: scenario, apiKey,
|
|
77
|
+
});
|
|
78
|
+
case "action_basis":
|
|
79
|
+
return chainActionBasis(apiClient, {
|
|
80
|
+
query, scenario: scenario, apiKey,
|
|
81
|
+
});
|
|
82
|
+
case "dispute_prep":
|
|
83
|
+
return chainDisputePrep(apiClient, { query, domain: input.domain, apiKey });
|
|
84
|
+
case "amendment_track":
|
|
85
|
+
return chainAmendmentTrack(apiClient, {
|
|
86
|
+
query, mst: input.mst, lawId: input.lawId,
|
|
87
|
+
scenario: scenario,
|
|
88
|
+
fromDate: input.fromDate, toDate: input.toDate, apiKey,
|
|
89
|
+
});
|
|
90
|
+
case "ordinance_compare":
|
|
91
|
+
return chainOrdinanceCompare(apiClient, {
|
|
92
|
+
query, parentLaw: input.parentLaw,
|
|
93
|
+
scenario: scenario, apiKey,
|
|
94
|
+
});
|
|
95
|
+
case "procedure_detail":
|
|
96
|
+
return chainProcedureDetail(apiClient, {
|
|
97
|
+
query, scenario: scenario, apiKey,
|
|
98
|
+
});
|
|
99
|
+
case "full_research":
|
|
100
|
+
default:
|
|
101
|
+
return chainFullResearch(apiClient, {
|
|
102
|
+
query, scenario: scenario, apiKey,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "korean-law-mcp",
|
|
3
|
-
"version": "4.
|
|
4
|
-
"description": "법제처 42개 API →
|
|
3
|
+
"version": "4.4.0",
|
|
4
|
+
"description": "법제처 42개 API → 9개 MCP 도구. 법령·판례·조례·조약 + 다단계 리서치(legal_research, 8 task) + 정밀분석(legal_analysis: 인용검증·판례생사·행위시법·영향그래프) + 시점 비교(time_travel) + 상황별 5단계 안내(action_plan) + 국세청 해석례(nts)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "build/index.js",
|
|
7
7
|
"types": "build/index.d.ts",
|