1- # Korean Law MCP - System Architecture
1+ # Korean Law MCP - System Architecture
22
33> ** v2.3.2** | Last Updated: April 2026
44
77## High-Level Architecture
88
99```
10- ?뚢????????????????????????????????????????????????????????????????
11- ?? MCP Client (Claude ?? ??
12- ?붴?????????????????????р?????????????????????р??????????????????????
10+ ┌──────────────────────────────────────────────────────────────┐
11+ │ MCP Client (Claude 등) │
12+ └────────────────────┬────────────────────┬────────────────────┘
1313 STDIO Mode HTTP Mode
1414 (Local Desktop) (Remote: Fly.io)
15- ?? ??
16- ?뚢?????????????????????쇄?????????????????????쇄??????????????????????
17- ?? Korean Law MCP Server (v2.3.2) ??
18- ?? ??
19- ?? ?뚢????????????????????????????????????????????????????????? ??
20- ?? ?? Tool Registry (89 Zod-Validated Tools) ?? ??
21- ?? ?? tool-registry.ts ?? allTools[] ?? ??
22- ?? ?쒋????????????????????????????????????????????????????????? ??
23- ?? ?? 寃?? (11) ??議고쉶 (9) ??遺꾩꽍 (9) ?? ??
24- ?? ?? ?꾨Ц (4) ???뚯옱/?됱떖 (6) ??吏?앸쿋?댁뒪 (7) ?? ??
25- ?? ?? 湲고? (4) ??泥댁씤 (7) ?? CLI ?명꽣?섏씠?? ?? ??
26- ?? ?붴????????????????????????????????????????????????????????? ??
27- ?? ?? ??
28- ?? ?뚢????????????????????????????????????????????????????????? ??
29- ?? ?? Shared Libraries (src/lib/ 13媛? ?? ??
30- ?? ?쒋????????????????????????????????????????????????????????? ??
31- ?? ?? ?? api-client.ts (API ?몄텧 + 罹먯떆 ) ?? ??
32- ?? ?? ?? xml-parser.ts (6媛??꾨찓???뚯꽌 ) ?? ??
33- ?? ?? ?? annex-file-parser.ts (HWPX/HWP/PDF ?뚯떛 ) ?? ??
34- ?? ?? ?? search-normalizer.ts (?쎌묶 ?댁꽍 , LexDiff) ?? ??
35- ?? ?? ?? law-parser.ts (JO 肄붾뱶 蹂?? LexDiff) ?? ??
36- ?? ?? ?? errors.ts (LawApiError + 援ъ“?붾맂 ?먮윭 ) ?? ??
37- ?? ?? ?? schemas.ts (?좎쭨/?ш린 寃利? ?? ??
38- ?? ?? ?? fetch-with-retry.ts (30s timeout, 3 retries) ?? ??
39- ?? ?? ?? session-state.ts (?붿껌蹂? API ??寃⑸━ , ALS) ?? ??
40- ?? ?? ?? cache.ts (LRU + TTL) ?? ??
41- ?? ?붴????????????????????????????????????????????????????????? ??
42- ?? ?? ??
43- ?? ?뚢????????????????????????????????????????????????????????? ??
44- ?? ?? Server Layer ?? ??
45- ?? ?? ?? http-server.ts (Streamable HTTP stateless, MCP ?쒖?)?? ??
46- ?? ?붴????????????????????????????????????????????????????????? ??
47- ?붴????????????????????????????р?????????????????????????????????????
48- ?? HTTPS
49- ??
50- ?뚢????????????????????????????????????????????????????????????????
51- ?? Korea Ministry of Government Legislation API ??
52- ?? (law.go.kr Open API) ??
53- ?쒋????????????????????????????????????????????????????????????????
54- ?? lawSearch.do - 寃?? (law/admrul/ordin/prec/expc/...) ??
55- ?? lawService.do - 議고쉶 (eflaw/admrul/ordin/prec/...) ??
56- ?붴????????????????????????????????????????????????????????????????
15+ │ │
16+ ┌────────────────────▼────────────────────▼────────────────────┐
17+ │ Korean Law MCP Server (v2.3.2) │
18+ │ │
19+ │ ┌───────────────────────────────────────────────────────┐ │
20+ │ │ Tool Registry (98 Zod-Validated Tools) │ │
21+ │ │ tool-registry.ts → allTools[] │ │
22+ │ ├───────────────────────────────────────────────────────┤ │
23+ │ │ 검색 (11) │ 조회 (9) │ 분석 (9) │ │
24+ │ │ 전문 (4) │ 헌재/행심 (6) │ 지식베이스 (7) │ │
25+ │ │ 기타 (4) │ 체인 (7) │ CLI 인터페이스 │ │
26+ │ └───────────────────────────────────────────────────────┘ │
27+ │ ▲ │
28+ │ ┌───────────────────────────────────────────────────────┐ │
29+ │ │ Shared Libraries (src/lib/ 13개) │ │
30+ │ ├───────────────────────────────────────────────────────┤ │
31+ │ │ • api-client.ts (API 호출 + 캐시 ) │ │
32+ │ │ • xml-parser.ts (6개 도메인 파서 ) │ │
33+ │ │ • annex-file-parser.ts (HWPX/HWP/PDF 파싱 ) │ │
34+ │ │ • search-normalizer.ts (약칭 해석 , LexDiff) │ │
35+ │ │ • law-parser.ts (JO 코드 변환, LexDiff) │ │
36+ │ │ • errors.ts (LawApiError + 구조화된 에러 ) │ │
37+ │ │ • schemas.ts (날짜/크기 검증) │ │
38+ │ │ • fetch-with-retry.ts (30s timeout, 3 retries) │ │
39+ │ │ • session-state.ts (요청별 API 키 격리 , ALS) │ │
40+ │ │ • cache.ts (LRU + TTL) │ │
41+ │ └───────────────────────────────────────────────────────┘ │
42+ │ ▲ │
43+ │ ┌───────────────────────────────────────────────────────┐ │
44+ │ │ Server Layer │ │
45+ │ │ • http-server.ts (Streamable HTTP stateless, MCP 표준)│ │
46+ │ └───────────────────────────────────────────────────────┘ │
47+ └───────────────────────────┬───────────────────────────────────┘
48+ │ HTTPS
49+ ▼
50+ ┌──────────────────────────────────────────────────────────────┐
51+ │ Korea Ministry of Government Legislation API │
52+ │ (law.go.kr Open API) │
53+ ├──────────────────────────────────────────────────────────────┤
54+ │ lawSearch.do - 검색 (law/admrul/ordin/prec/expc/...) │
55+ │ lawService.do - 조회 (eflaw/admrul/ordin/prec/...) │
56+ └──────────────────────────────────────────────────────────────┘
5757```
5858
5959### Key Architectural Principles
6060
61- 1 . ** Separation of Concerns** : Tools ?? Shared Libs ?? API Client
62- 2 . ** Single Responsibility** : ?뚯씪??200以?誘몃쭔, ?⑥씪 湲곕뒫
63- 3 . ** Centralized Tool Registry** : 97媛??꾧뎄瑜? ` tool-registry.ts ` ?? ` allTools[] ` ???깅줉
61+ 1 . ** Separation of Concerns** : Tools → Shared Libs → API Client
62+ 2 . ** Single Responsibility** : 파일당 200줄 미만, 단일 기능
63+ 3 . ** Centralized Tool Registry** : 98개 도구를 ` tool-registry.ts ` 의 ` allTools[] ` 에 등록
64644 . ** Type Safety** : TypeScript strict mode + Zod validation
65- 5 . ** Stateless HTTP** : MCP StreamableHTTP stateless 紐⑤뱶 ???붿껌留덈떎 fresh Server+Transport, AsyncLocalStorage濡??붿껌蹂? API ??寃⑸━ (?ъ떆?뫢룹뒪耳?쇱븘???댁꽦 )
65+ 5 . ** Stateless HTTP** : MCP StreamableHTTP stateless 모드 — 요청마다 fresh Server+Transport, AsyncLocalStorage로 요청별 API 키 격리 (재시작·스케일아웃 내성 )
66666 . ** Network Resilience** : 30s timeout, 3 retries with exponential backoff
67- 7 . ** Dual Interface** : MCP ?쒕쾭 + CLI ?숈떆 吏??
67+ 7 . ** Dual Interface** : MCP 서버 + CLI 동시 지원
6868
6969---
7070
7171## Component Deep Dive
7272
7373### Entry Point (` src/index.ts ` )
7474
75- - MCP ?쒕쾭 珥덇린??
76- - CLI ?몄옄 ?뚯떛 (` --mode stdio|sse|http ` , ` --port ` )
77- - ` registerTools(server, apiClient) ` ?몄텧濡?97媛??꾧뎄 ?쇨큵 ?깅줉
75+ - MCP 서버 초기화
76+ - CLI 인자 파싱 (` --mode stdio|sse|http ` , ` --port ` )
77+ - ` registerTools(server, apiClient) ` 호출로 98개 도구 일괄 등록
7878
7979### Tool Registry (` src/tool-registry.ts ` )
8080
81- 紐⑤뱺 ?꾧뎄瑜? ` allTools[] ` 諛곗뿴濡?愿由? 媛??꾧뎄?? ` { name, description, schema, handler } ` 援ъ“ .
82- - ` ListToolsRequest ` ??allTools?먯꽌 name/description/inputSchema 諛섑솚
83- - ` CallToolRequest ` ??name?쇰줈 留ㅼ묶 ?? handler ?ㅽ뻾
84- - ` unwrapZodEffects() ` : ` .refine() ` ?곸슜?? Zod ?ㅽ궎留덈? MCP JSON Schema濡?蹂??
81+ 모든 도구를 ` allTools[] ` 배열로 관리. 각 도구는 ` { name, description, schema, handler } ` 구조 .
82+ - ` ListToolsRequest ` → allTools에서 name/description/inputSchema 반환
83+ - ` CallToolRequest ` → name으로 매칭 후 handler 실행
84+ - ` unwrapZodEffects() ` : ` .refine() ` 적용된 Zod 스키마를 MCP JSON Schema로 변환
8585
8686### CLI (` src/cli.ts ` )
8787
88- - ` korean-law <tool> --param value ` ?뺥깭濡?97媛??꾧뎄 吏곸젒 ?ㅽ뻾
89- - ` korean-law list [--category ...] ` : ?꾧뎄 紐⑸줉/移댄뀒怨좊━ ?꾪꽣
90- - ` korean-law help <tool> ` : ?꾧뎄 ?곸꽭 ?뚮씪誘명꽣
91- - ` --json-input ` : JSON?쇰줈 蹂듯빀 ?뚮씪誘명꽣 ?꾨떖
88+ - ` korean-law <tool> --param value ` 형태로 98개 도구 직접 실행
89+ - ` korean-law list [--category ...] ` : 도구 목록/카테고리 필터
90+ - ` korean-law help <tool> ` : 도구 상세 파라미터
91+ - ` --json-input ` : JSON으로 복합 파라미터 전달
9292
9393### API Client (` src/lib/api-client.ts ` )
9494
95- - 踰뺤젣泥? API URL 援ъ꽦 + HTTP ?붿껌
96- - HTML ?먮윭 ?섏씠吏 媛먯? (JSON/XML ??? HTML 諛섑솚 ??
97- - ?꾨찓?몃퀎 硫붿꽌?? ` searchLaw() ` , ` getLawText() ` , ` getAnnexes() ` ??
95+ - 법제처 API URL 구성 + HTTP 요청
96+ - HTML 에러 페이지 감지 (JSON/XML 대신 HTML 반환 시)
97+ - 도메인별 메서드: ` searchLaw() ` , ` getLawText() ` , ` getAnnexes() ` 등
9898
9999### Cache (` src/lib/cache.ts ` )
100100
101- - LRU 罹먯떆 + TTL (寃??1?쒓컙, 議곕Ц 24?쒓컙 )
102- - 理쒕? 100 ?뷀듃由? 1?쒓컙留덈떎 expired ?뺣━
101+ - LRU 캐시 + TTL (검색 1시간, 조문 24시간 )
102+ - 최대 100 엔트리, 1시간마다 expired 정리
103103
104104### Annex File Parser (` src/lib/annex-file-parser.ts ` )
105105
106- 蹂꾪몴/?쒖떇 ?뚯씪 ?먮룞 ?뚯떛 :
107- - ** HWPX** (?좏삎 , ZIP 湲곕컲 ): ` jszip ` + ` @xmldom/xmldom ` ?? Markdown ?뚯씠釉?
108- - ** HWP** (援ы삎 , OLE 湲곕컲 ): ` hwp.js ` ?? ` paragraph.content ` + ` controls[].content ` ?뚯씠釉?異붿텧
109- - ** PDF** : ?뚯떛 遺덇? ??留곹겕 諛섑솚
106+ 별표/서식 파일 자동 파싱 :
107+ - ** HWPX** (신형 , ZIP 기반 ): ` jszip ` + ` @xmldom/xmldom ` → Markdown 테이블
108+ - ** HWP** (구형 , OLE 기반 ): ` hwp.js ` → ` paragraph.content ` + ` controls[].content ` 테이블 추출
109+ - ** PDF** : 파싱 불가 → 링크 반환
110110
111111---
112112
113113## Data Flow Patterns
114114
115- ### Pattern 1: 寃????議고쉶 (2-step)
115+ ### Pattern 1: 검색 → 조회 (2-step)
116116
117117```
118- search_law("洹쇰줈湲곗?踰?) ?? mst: 276787
119- ??
120- get_law_text(mst="276787", jo="??4議? )
118+ search_law("근로기준법") → mst: 276787
119+ ↓
120+ get_law_text(mst="276787", jo="제74조" )
121121```
122122
123- ### Pattern 2: 諛곗튂 議고쉶 (1 API call)
123+ ### Pattern 2: 배치 조회 (1 API call)
124124
125125```
126- get_batch_articles(mst="279811", articles=["??8議?,"??9議?,"??0議? ])
127- ???꾩껜 踰뺣졊 1??議고쉶 ??議곕Ц ?꾪꽣留?
126+ get_batch_articles(mst="279811", articles=["제38조","제39조","제40조" ])
127+ → 전체 법령 1회 조회 후 조문 필터링
128128```
129129
130- ### Pattern 3: 泥댁씤 ?꾧뎄 (?먮룞 ?ㅻ떒怨?
130+ ### Pattern 3: 체인 도구 (자동 다단계)
131131
132132```
133- chain_full_research(query="?뚯<?댁쟾 泥섎쾶 ")
134- ?? search_ai_law ?? get_law_text ?? search_precedents ?? search_interpretations
135- ??蹂묐젹 ?ㅽ뻾, ?뱀뀡蹂??묐떟 寃고빀
133+ chain_full_research(query="음주운전 처벌 ")
134+ → search_ai_law → get_law_text → search_precedents → search_interpretations
135+ → 병렬 실행, 섹션별 응답 결합
136136```
137137
138- ### Pattern 4: 蹂꾪몴 蹂몃Ц 異붿텧
138+ ### Pattern 4: 별표 본문 추출
139139
140140```
141- get_annexes(lawName="?ш텒踰??쒗뻾?? , bylSeq="000000")
142- ???뚯씪 ?ㅼ슫濡쒕뱶 ??留ㅼ쭅諛붿씠??媛먯? ?? HWPX/HWP/PDF 遺꾧린
143- ?? HWP: controls ???뚯씠釉?異붿텧 ?? Markdown 蹂??
141+ get_annexes(lawName="여권법 시행령" , bylSeq="000000")
142+ → 파일 다운로드 → 매직바이트 감지 → HWPX/HWP/PDF 분기
143+ → HWP: controls 내 테이블 추출 → Markdown 변환
144144```
145145
146146---
147147
148148## Performance Optimizations
149149
150- | 理쒖쟻?? | ?④낵 |
150+ | 최적화 | 효과 |
151151| --------| ------|
152- | ` search_all ` 蹂묐젹 API ?몄텧 | 1200ms ?? 450ms (63% 媛먯냼 ) |
153- | ` get_batch_articles ` 1??議고쉶 | N API calls ?? 1 API call |
154- | 泥댁씤 ?꾧뎄 蹂묐젹 ?뱀뀡 | ?쒖감 ?鍮?2 ~ 3諛?鍮좊쫫 |
155- | LRU 罹먯떆 (hit rate ~ 82%) | 諛섎났 議고쉶 85% ?묐떟 ?쒓컙 媛먯냼 |
156- | ` truncateSections() ` | 泥댁씤 ?묐떟 ?ш린 理쒖쟻?? |
152+ | ` search_all ` 병렬 API 호출 | 1200ms → 450ms (63% 감소 ) |
153+ | ` get_batch_articles ` 1회 조회 | N API calls → 1 API call |
154+ | 체인 도구 병렬 섹션 | 순차 대비 2 ~ 3배 빠름 |
155+ | LRU 캐시 (hit rate ~ 82%) | 반복 조회 85% 응답 시간 감소 |
156+ | ` truncateSections() ` | 체인 응답 크기 최적화 |
157157
158158---
159159
@@ -174,9 +174,9 @@ get_annexes(lawName="?ш텒踰??쒗뻾??, bylSeq="000000")
174174
175175### Remote (Fly.io)
176176
177- - ** fly.toml** : ` nrt ` 由ъ쟾 , 256MB 硫붾え由? auto suspend/resume
177+ - ** fly.toml** : ` nrt ` 리전 , 256MB 메모리, auto suspend/resume
178178- ** Dockerfile** : multi-stage build (node:20-alpine)
179- - ** Health check** : ` GET /health ` (30珥?媛꾧꺽 )
179+ - ** Health check** : ` GET /health ` (30초 간격 )
180180- ** Endpoint** : ` https://korean-law-mcp.fly.dev/mcp `
181181
182182``` json
@@ -189,7 +189,7 @@ get_annexes(lawName="?ш텒踰??쒗뻾??, bylSeq="000000")
189189}
190190```
191191
192- ### Docker (?먯껜 ?몄뒪??
192+ ### Docker (자체 호스팅)
193193
194194``` bash
195195docker build -t korean-law-mcp .
@@ -200,16 +200,16 @@ docker run -e LAW_OC=your-key -p 3000:3000 korean-law-mcp
200200
201201## Security
202202
203- - ** API ?? * : ?섍꼍蹂?섎쭔 ?ъ슜, 濡쒓렇???몄텧 湲덉?
204- - ** ?붿껌 寃⑸━ ** : ` session-state.ts ` ??AsyncLocalStorage濡??붿껌蹂? API ??遺꾨━ (stateless 紐⑤뱶 , race condition 諛⑹? )
205- - ** ?낅젰 寃利? * : Zod ?ㅽ궎留덈줈 紐⑤뱺 ?꾧뎄 ?낅젰 寃利?
206- - ** Rate Limiting** : ` RATE_LIMIT_RPM ` ?섍꼍蹂??(湲곕낯 60 req/min)
207- - ** CORS** : ` CORS_ORIGIN ` ?섍꼍蹂?섎줈 ?쒗븳
203+ - ** API 키 ** : 환경변수만 사용, 로그에 노출 금지
204+ - ** 요청 격리 ** : ` session-state.ts ` 의 AsyncLocalStorage로 요청별 API 키 분리 (stateless 모드 , race condition 방지 )
205+ - ** 입력 검증 ** : Zod 스키마로 모든 도구 입력 검증
206+ - ** Rate Limiting** : ` RATE_LIMIT_RPM ` 환경변수 (기본 60 req/min)
207+ - ** CORS** : ` CORS_ORIGIN ` 환경변수로 제한
208208
209209---
210210
211211## Related Docs
212212
213- - [ API.md] ( API.md ) - 97媛??꾧뎄 ?덊띁?곗뒪
214- - [ DEVELOPMENT.md] ( DEVELOPMENT.md ) - 媛쒕컻??媛?대뱶
215- - [ README.md] ( ../README.md ) - ?쒖옉 媛?대뱶
213+ - [ API.md] ( API.md ) - 98개 도구 레퍼런스
214+ - [ DEVELOPMENT.md] ( DEVELOPMENT.md ) - 개발자 가이드
215+ - [ README.md] ( ../README.md ) - 시작 가이드
0 commit comments