2026 Selected Works · 공무원이 쓴 코드

딴짓하는 공무원이
코드로 바꾼 것들.

7년 차 광진구청 주무관이
HWP 지옥·법령 미로·문서 홍수·통계 미아에서 탈출하기 위해 만든
공공 도메인 오픈소스 7선.

AuthorRyu Seungin · 류주임
Affiliation광진구청 AI.Do
StackTypeScript · Rust · Tauri · MCP · Next.js
Repos7
Scroll
01Flagship · Selected Work

법제처 42개 API,
17개 도구로 압축했다.

법령·판례·헌재·조세심판·관세해석까지 17개 도메인. Claude·Cursor·Windsurf·Zed·Claude.ai 웹에서 바로 호출. v4.0의 impact_map·time_travel·action_plan + 환각을 실시간으로 잡아내는 verify_citations.

KOREAN-LAW-MCP

사람이 법에 묻듯,
AI도 법에 묻는다.

"화관법 38조 알려줘" — 약칭을 실명으로, 조문번호를 API 코드로, 3단 위임(법률→시행령→시행규칙)을 트리로. 그리고 AI가 지어낸 가짜 조문·가짜 판례를 verify_citations가 법제처 DB로 직접 교차검증한다.

42
API → 17 Tools
17
Decision Domains
v4.0
Impact · Time · Action
MCP 1.27 TypeScript Stateless HTTP Fly.io · korean-law-mcp.fly.dev 법제처 Open API
claude · korean-law-mcp · stdio
— 17 MCP Tools · 42 API 전체 커버 · 17 도메인
impact_map ⭐ v4.0
verify_citations
chain_full_research
chain_law_system
chain_action_basis
chain_dispute_prep
chain_amendment_track
chain_ordinance_compare
chain_procedure_detail
chain_document_review
search_law
get_law_text
get_annexes
search_decisions · 17 domains
get_decision_text · 17 domains
discover_tools
execute_tool

verify_citations — 환각 검증

LLM이 쓴 "상법 제401조의2 제7항" — 실제로는 제2항이 끝이다. 법제처 DB로 교차검증해 존재하지 않는 조문을 ✗로 리턴한다. v3.5의 킬러 피처.

17개 도메인 · 2개 도구로

판례·헌재·조세심판·공정위·노동위·관세해석·개인정보위·권익위·학칙·공사공단·조약·영문법령 — search_decisions(domain) 하나로.

약칭 자동 인식 · 52종

"화관법" → "화학물질관리법". v3.3.1에서 LAW_ALIAS 11 → 52종 확장. 산안법·중처법·청탁금지법·공정거래법까지 커버.

§

조문번호 ↔ JO 코드

"제38조" ↔ "003800". 사람의 언어와 기계의 언어 사이, 오래된 번역 문제를 도구 한 개로 끝낸다.

HWPX · HWP 별표 추출

법률 별표·별지서식이 HWP로 배포되는 한국식 문제. kordoc 엔진을 내장해 표·텍스트를 Markdown으로 변환한다.

8개 체인 + 7개 시나리오

"과태료 감경" "FTA 통관" "위임입법 미비" — 질문 하나에 법령·판례·해석례·조례·개정이력까지 묶어서 돌려준다.

02Document Infrastructure · Engine + Desktop

모두 파싱해버리겠다.
HWP · HWPX · HWPML · PDF · XLSX · DOCX → Markdown.

대한민국 공공문서의 절반은 HWP다. 세상의 나머지 절반은 이 포맷을 파싱할 수 없다. kordoc이 순수 JS로 엔진을 짜고, kordoc-ai가 그 위에 Gemini 3 Flash를 얹은 데스크톱 앱을 올린다.

.hwp
OLE2 · 배포용 복호화
.hwpx
ZIP+XML · DRM 자동 추출
.hwpml
XML 기반 HWP
.pdf
선 기반 표 감지 · OCR
.xlsx .docx
병합·스타일·각주
kordoc v2.4 core
Magic-byte Router
+ 2-Pass Table Builder
+ rhwp AES-128 복호화
# Markdown
+ IRBlock[]
# 학교교육과정 운영 계획 ## 1. 편성 근거 - 초·중등교육법 제23조 - 2022 개정 교육과정 총론 | 학년 | 국어 | 수학 | 영어 | |-----|-----|-----|-----| | 3학년 | 6 | 4 | 2 | | 4학년 | 5 | 4 | 3 | > HWPX 중첩 표, merged cell, 배포용 DRM, 깨진 ZIP, XLSX 수식까지 복원됩니다.

OLE2 + Record Stream

HWP 5.x 바이너리를 UTF-16LE, zlib 해제, 21종 제어 캐릭터까지 직접 풀어낸다. 한컴오피스 없이, 순수 JavaScript로.

2-Pass Table Builder

colSpan·rowSpan 꼬이지 않는다. 선 기반 PDF 표 감지 + 한국 공문서 key-value 자동 인식까지.

🔓

배포용 HWP · DRM HWPX

관공서 "열람 제한" HWP는 rhwp AES-128 포팅. DRM이 걸린 HWPX는 한컴 COM API로 자동 추출(v2.4.0).

📝

양식 자동 채우기

fillHwpx()가 HWPX XML을 직접 조작해 글꼴·크기·정렬 100% 보존한 채 빈칸만 교체. 체크박스·어노테이션까지.

Markdown → HWPX 역변환

AI가 쓴 답변을 다시 보고서 양식으로. heading·bold·table 서식 유지. 복붙 노가다 제거.

🧩

4 Interfaces

npm 라이브러리 · CLI · MCP 서버(8 tools) · Tauri 데스크톱 앱(kordoc-ai). 어디서 불러도 같은 Markdown.

KORDOC-AI · DESKTOP COMPANION

엔진 위에 얹은 Tauri 데스크톱 앱.

React 19 + Tauri 2.10 + Node.js Sidecar. kordoc으로 로컬 파싱하고, Gemini 3 Flash로 요약·OCR·K팀장 검토. MCP 원클릭 설치, 폴더 드래그드롭, 15개 액션 · 24개 RPC 메서드. Windows MSI 하나.

AI 요약 4×3
AI OCR (Gemini Vision)
문서 병합 · 서식 유지
K팀장 검토
BATTLE-TESTED

5개 실전 공공 프로젝트에서 검증

학교교육과정 · 사전기획 보고서 · 법률 별표 · 구 소식지 · 공공데이터 파이프라인. 수천 개의 진짜 관공서 문서가 부러지지 않고 지나갔다. korean-law-mcp와 Anything에도 같은 엔진이 내장되어 돈다.

학교교육과정
사전기획 보고서
법률 별표
구청 소식지
03Desktop App · Offline-first

파일을 찾지 말고,
내용을 찾으세요.

HWPX·PDF·Office 수천 개 문서 본문을 1초 안에. 100% 로컬. 폐쇄망 환경에서 AI 기능을 꺼도 모든 검색이 동작한다.

Anything — v2.5.7
● 하이브리드
키워드
시맨틱
파일명
4,287건 중 3건 · 42ms

1초 본문 검색 · RRF 하이브리드

SQLite FTS5 + usearch HNSW를 RRF로 병합. Lindera 2.0 한국어 형태소 분석 내장. 파일명을 몰라도, 열어보지 않아도, 안에 있는 문장을 찾는다.

완전 오프라인 가능

KoSimCSE-roberta(768차원) ONNX로 임베딩, PaddleOCR ONNX로 OCR — 전부 로컬. AI를 끄면 네트워크 트래픽 제로, 폐쇄망 PC에서 그대로 동작.

🜛

Tauri 2.10 · Rust 네이티브

Clean Architecture로 Parsers / Indexer / Search Engine 분리. 메모리·바이너리에서 Electron을 이긴다. MSI 하나로 배포, WebView2·VC++까지 번들.

RAG 질의응답 (선택)

"2026년 예산 얼마야?" 자연어 질문에 Gemini가 근거 문서와 페이지 번호까지 같이 답한다. BYOK 방식, API 키는 로컬에만.

04Public Legal AI · FC-RAG Platform

법령을 쉽게,
AI로 똑똑하게.

청크 RAG도 아니고 그래프 RAG도 아니다. Gemini 3 Flash가 Function Calling으로 법제처 API 46개 도구를 스스로 고르고, 조문 원문을 글자 그대로 주입해서 답한다. AI 법률 검색 · 3단 비교 · 영향 추적 · 조례 벤치마킹 · 위임 미비 · 타임머신 · 신구 diff까지.

lexdiff.gomdori.app · AI 법률 검색 · Gemini 3 Flash
LIVE · SSE
You
퇴직금을 받지 못했습니다. 어떻게 대응해야 하나요?
⚙ search_law("퇴직금")68 ms
근로자퇴직급여보장법 MST 001234
근로기준법 MST 005678
⚙ search_decisions(domain="precedent", "퇴직금 미지급")184 ms
→ 대법원 2019다12345 (2020 · 지연이자·소멸시효)
→ 대법원 2018다98765 (2019 · 지급 지연 손해배상)
Gemini 3 Flash · Answer
3단계로 대응하실 수 있습니다. ① 사업주에 지급 청구 — 퇴직 후 14일 이내 지급 의무 근퇴법 §9. ② 고용노동부 진정(무료·3개월). ③ 민사소송 — 임금채권 3년 소멸시효 주의 대법 2019다12345.
✓ 4/4 citations verified CONFIDENCE · HIGH · 4 signals aligned
🧠

AI 법률 검색 · 핵심

일상 언어 질문에 법령·판례를 근거로. Gemini 3 Flash + Function Calling 46 tools + Citation Verify. 후속 질문 맥락 기억.

법령 영향 추적기

법이 바뀌면 어디까지 파급되는가. 상위법 → 시행령 → 시행규칙 → 자치법규 연쇄 영향 + AI 심각도 자동 분류.

🏛

조례 벤치마킹

"출산장려금 조례"를 전국 226개 시군구에서 한 번에. 우리 구 vs 옆 구를 AI가 표로 비교.

🔗

위임 미비 탐지기

"대통령령으로 정한다"고 써놓고 시행령이 없는 조항을 자동 탐지. 입법 공백을 한눈에.

±

신구조문 비교 · 타임머신

개정 전후 +/− diff와 AI 한 줄 요약. 날짜를 선택하면 그 시점의 법령 원문을 현행법과 나란히.

근로기준법 §742024 → 2026
90일의 출산전후휴가
120일의 출산전후휴가
🔑

BYOK · 무료 베타

Google 로그인 후 하루 5회 무료. 본인 Gemini API 키를 브라우저 로컬에 저장하면 무제한. 서버 DB는 키를 모른다.

05Financial Disclosure · Buffett-Grade Frame

OpenDART 83 API,
15 도구로 압축했다.

공시·재무·지분·XBRL + 버핏급 애널리스트 프레임. 내부자 매수/매도 클러스터, 회계 리스크 0–100 스코어, 5지표 자동 랭킹. 증권사 리포트 없이, 원본 공시를 한 줄 프롬프트로. korean-law-mcp의 금융판.

KOREAN-DART-MCP

원본 공시,
한 줄 프롬프트로.

"삼성전자 최근 재무제표 요약해" — 공시 종류 외울 필요 없이 프리셋 22개. "임원 매매 시그널" — 보고서 파싱 대신 strong_buy_cluster 한 호출. "회계 정정 많아?" — 리스크 스코어 0–100으로 자동 플래그.

83
API → 15 Tools
22
Disclosure Presets
XBRL
Full Taxonomy + Calc
MCP 1.27 OpenDART XBRL TypeScript 19k+ Listed Firms
claude · korean-dart-mcp · stdio
$ claude --mcp korean-dart
mcp server started · 15 tools loaded
ready ●

▸ 카카오 임원 매수/매도 시그널?

→ insider_trade_cluster("005930")
↳ cluster: strong_buy · 12 signals
→ accounting_risk_score(corp)
↳ risk: 38/100 (LOW)
→ buffett_rank(ticker)
↳ ROE 18.2 · FCF 양호 · 부채비율 42%

Claude: 최근 3개월 임원 매수 12건,
매도 0건 — strong_buy_cluster.
회계 리스크 LOW, 버핏 5지표 중 4개 통과.

Insider Cluster · 시그널 자동 집계

임원·대주주의 매수 vs 매도 보고를 한 번에 클러스터링. strong_buy_cluster / strong_sell_cluster로 리턴. "Skin in the game"을 한 호출로.

0–100

회계 리스크 스코어

정정공시 비율 · 자본 스트레스 공시(유증·CB) · 감사보고서 이슈를 종합해 0–100 점수로. 임계 초과 항목은 WARN 플래그로 즉시 표시.

🏆

버핏급 5지표 자동 랭킹

ROE · FCF 흐름 · 부채비율 · 이익 지속성 · 현금흐름 대비 순이익 — Warren Buffett "Owner Earnings" 철학을 자동 점수화. 종목 리스트에 한 호출.

XBRL 전체 계정 + 계산 검증

calculation linkbase의 summation-item 관계로 "부모 = 자식 합산" 자동 검증 → 공시 오기재 즉시 탐지. 6MB XBRL → 8,905자 마크다운 (99.85% 절감).

프리셋 22개 공시 검색

DART 코드 외울 필요 없음. pblntf_ty + report_nm 정규식을 프리셋이 자동 조립. 전체시장 3개월 제약도 90일 자동분할로 우회(최대 10년).

👤

본인 종목 5–20개 투자자용

기자 편향 싫어 원본 공시 직접 보는 중급 개미 · 증권사 리포트 안 사고 직접 기업 분석하는 투자자 · 네이버 금융·HTS 정보 부족해 답답한 사람. 원본 공시로 승부.

06Public Statistics · KOSIS via MCP

통계청 KOSIS,
이제 사이트에 들어가지 않습니다.

통계표 ID 찾고, 분류 코드 조립하고, 자치구 행 스크롤하던 일을 자연어 한 줄로. 시정연설·의회 답변·정책보고서·민원 응대까지 — 모든 답변에 통계표 ID가 자동으로 붙어 그대로 인용 가능. ChatGPT가 기억으로 답한 옛 수치를 보고서에 넣는 사고를 막는다.

KOREAN-STATS-MCP

묻는 즉시,
출처와 함께.

91개 키워드 + 자연어 별칭 100종. 17개 시도 + 자치구·시군 230여 곳까지 직접 라우팅. "광진구 고용률" 한 줄이면 광역 평균에 묻히지 않고 자치구 행 정확히. 추계는 "추계"라고 명시하고, 자치구 미수록이면 광역값을 자치구인 척 답하지 않는다.

91
Keywords + 100 Aliases
230+
District-level Routing
12
MCP Tools
MCP 1.27 TypeScript KOSIS OpenAPI Fly.io · korean-stats-mcp.fly.dev 출처 통계표 ID 자동 인용
claude · korean-stats · stdio
$ claude --mcp korean-stats
mcp server started · 12 tools loaded
ready ●

▸ 강남구, 서초구, 송파구 실업률 비교해줘

→ chain_compare_regions(["강남구","서초구","송파구"], ["실업률","고용률"])
↳ 3 regions × 2 indicators matrix
↳ 통계표 DT_1ES3A03_A01S (KOSIS)

Claude: 3개 지역 × 2지표 비교
• 실업률: 최고 ○○구 · 최저 ○○구
• 고용률: 최고 ○○구 · 최저 ○○구
📊 출처: 시군구별 경제활동인구
(KOSIS DT_1ES3A03_A01S)
— 12 MCP Tools · 91 키워드 · 230+ 자치구·시군 라우팅
quick_stats ⭐
quick_trend ⭐
chain_region_brief
chain_compare_regions
chain_policy_indicator
search_statistics
get_statistics_list
get_table_info
get_statistics_data
compare_statistics
analyze_time_series
fetch_kosis_excel
📊

출처(통계표 ID) 자동 인용

모든 답변에 KOSIS DT_xxx가 따라붙는다. 추정이 아니라 인용 — 그대로 보고서·연설문·국정감사 자료에 넣을 수 있다. ChatGPT가 학습 시점 기억으로 찍어준 옛 수치를 그대로 인용하는 사고를 차단.

🎯

자치구·시군 230곳 직접 라우팅

"광진구 고용률" 한 줄이면 서울 평균이 아닌 자치구 행. KOSIS 표준 통계표(자치구 코드)를 1순위로, 미수록 분야는 자치구 통계연보 .xlsx로 보완. "부산 중구"처럼 광역 결합도 정확히 구분.

체인 3종 — 연설·의회·정책 대응

chain_region_brief는 13개 지표 종합 + 연설용 한 줄 모드. chain_compare_regions는 최대 17×8 비교 매트릭스. chain_policy_indicator는 저출산·고령화 등 7개 영역 10년 시계열.

🛡

추계 vs 실측 자동 구분

노령화지수 등 장래추계가 포함된 통계는 "이 수치는 통계청 추계"라고 자동 표기. 미래 추계를 실측처럼 인용하는 실수를 막는다. 자치구 데이터가 없으면 광역값을 자치구인 척 답하지 않고 "광역시도 값으로 대체"를 첫 문장에 명시.

🗣

자연어 별칭 · 한국 행정 어법

`집값` → 주택매매가격, `노인` → 고령인구, `연봉` → 월평균임금, `청년실업` → 실업률. 률/율 오타·공백·영문도 인식. "민선 8기", "임기 4년차", "작년 대비", "역대" 같은 기간 표현도 자동으로 연수 환산.

fetch_kosis_excel — 미지원 표 커버

KOSIS OpenAPI 미지원 분야는 .xlsx 파일통계표로. kordoc 엔진이 직접 파싱 — 자치구 통계연보의 분야 순서 자치구별 동적 매핑까지.

07Address Standardization · Civic Tool

뒤죽박죽 주소,
한방에 표준화.

광진구 아차산로 400, 자양동 870, 광진구청 — 셋 다 같은 곳이다. 표준주소실록은 이걸 같은 형식으로 돌려준다. 도로명 + 지번 + 행정동을 한 번에, 엑셀·지도·Tableau·Chrome 확장까지.

GJDONG · 표준주소실록

반나절 작업이,
3분이 된다.

광진구 15개 행정동 1,400개 표지판 전수조사 실전에서 태어났다. 엑셀 한 장이면 끝. Kakao Local API 직결, 평균 120ms. 현장방문·감사자료·민원 접수 정비 — 관공서가 매일 만나는 주소 지옥을 한 번에.

1,400
실전 배치 주소
300k
일일 변환 (Kakao 무료)
120ms
평균 응답
Next.js 15 Kakao Local API Plasmo Extension Leaflet EUC-KR/CP949 자동감지
gjdong.vercel.app · batch mode
INPUT · 1,400 rows (addr.csv)
광진구 아차산로 400
자양동 870-1
광진구청 (그냥 이름)

▸ standardize · geocode · merge

OUTPUT · addr_standardized.csv
도로명 | 지번 | 행정동 | 위도·경도
아차산로 400 | 자양동 870-1 | 자양4동 | 37.55, 127.08
아차산로 400 | 자양동 870-1 | 자양4동 | 37.55, 127.08
아차산로 400 | 자양동 870-1 | 자양4동 | 37.55, 127.08

✓ 1,400 rows · 168s · $0

엑셀 일괄 변환

CSV / XLSX 드래그 한 번. 한글 인코딩(EUC-KR · CP949) 자동 감지. 도로명·지번·행정동·위경도 컬럼을 붙여서 다시 돌려준다.

📍

지도 번호 마커

1,400개 주소를 Leaflet 지도에 한 번에. 번호 마커로 표지판 전수조사 · 민원 방문 · 현장 실측의 동선을 최단 경로로.

📊

Tableau Geocoder

CSV 올리면 위도·경도 컬럼을 붙여서 돌려준다. Tableau · Power BI로 바로 지도 시각화. 내부망에서도 쓰라고 경량 SaaS.

🧩

Chrome 익스텐션

Plasmo 기반. 민원 페이지·보고서 화면에서 주소 드래그 → 클릭 한 번에 표준 주소가 뜬다. 공무원·감사팀·현장직원용.

+딸깍 시리즈 · 가볍게 쓰는 도구

눌러서 딸깍,
그걸로 끝.

포트폴리오 7선 옆에, 혼자 쓰려고 만들었다가 공개한 작은 도구들. 로그인 없음 · 설치 없음 · 바로 딸깍.

낮에는 공무원,
밤에는 관공서 문법을 다시 씁니다.

7년 동안 HWP 파일을 밀어내며 살았다. 어느 날 전부 파싱하기로 했다.
npm 패키지 하나, MCP 서버 셋, 데스크톱 앱 둘, 웹 서비스 둘, 익스텐션 하나. 그리고 이 페이지.

github.com/chrisryugj ↗

낮에 공무원이라 겪었다. 그래서 밤에 코드로 옮겼다.