# korean-report-hwpx — 한국 공문서 MCP (보고서·보도자료 HWPX) ![데모: 메모 한 장 → 정식·간소화 보고서(HWPX)](https://raw.githubusercontent.com/UpstageAI/korean-report-hwpx/main/docs/demo.gif) [![PyPI](https://img.shields.io/pypi/v/korean-report-hwpx)](https://pypi.org/project/korean-report-hwpx/) [![MCP Registry](https://img.shields.io/badge/MCP%20Registry-korean--gov--docs-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=korean-report-hwpx) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Built with Upstage Solar Pro 4](https://img.shields.io/badge/Built%20with-Upstage%20Solar%20Pro%204-7A3FF2)](https://www.upstage.ai/) · [English](README-EN.md) > **0.2.0부터 업스테이지 Solar Pro 4로 개발합니다.** 간소화 모드·마크다운 출력·내부 결재 보고서는 Solar Pro 4가 코드를 작성하고, Claude가 결과를 검증했습니다. **공무원 공문서(보고서·보도자료)를 기관 서식 HWPX로.** 쓰고 있는 AI(Claude·ChatGPT 등)가 메모·초안을 공문서 구조로 정리하면, 52개 중앙행정기관의 서식 규칙값으로 한글(HWPX) 파일을 그립니다. **외부 전송 없음 · API 키 불필요** — 모든 처리는 설치한 컴퓨터 안에서 끝납니다. 원고는 이 서버 밖으로 나가지 않습니다. → [English README](README-EN.md) --- > "이 내용 공문서처럼 써 줘" 한마디로 개조식 보고서(□ → ㅇ → -) 또는 보도자료를 기관 서식대로 만듭니다. 서식은 정책브리핑 보도자료 2,670건 전수 조사로 정한 규칙값이며, 원본 문서·로고는 포함하지 않습니다. **이렇게 물어보세요** - "이 메모를 ○○부 보고서로 만들어 줘" - "회의 내용 정리한 거야. 공문서처럼 정리해 줘" (기관을 말하지 않으면 공통 서식) - "이 원고 국세청 보도자료로 만들어 줘 — 보도시점 2026. 10. 8.(목) 조간" - "아까 만든 보고서 구조에서 Ⅲ장 □ 문장만 바꿔서 다시 만들어 줘" - "산림청 보고서 서식 규칙(계층별 기호·글꼴·크기) 보여 줘" **설치 한 줄** — `claude mcp add korean-report-hwpx -- uvx korean-report-hwpx` ## 문서 종류 | 종류 | 구성 | 기관 지정 | 규칙 | |---|---|---|---| | **보고서(개조식)** | 제목 상자, 작성일·작성부서 줄(선택), 소제목(Ⅰ. Ⅱ.) → □ → ㅇ → - → *, ※ 참고, 표, 붙임·참고 쪽 | 선택 — 42개 기관 규칙, 그 외·미지정은 공통 규칙 | `rules_report/` (보도자료 참고·붙임 구간 1,326건) | | **보도자료** | 표지(로고 자리·보도자료), 보도시점·배포, 제목·부제, 본문(문단식/□식), 담당 표, 참고 쪽 | 필수 — 52개 기관 | `rules/`·`templates/` (보도자료 2,670건) | | **기안문·시행문(별지 제1호서식)** | 두문·본문·결문, 항목 번호(1.→가.→1)→가)→(1)→(가)) 자동, 붙임, "끝." 표시, 결재란(표), 협조자, 시행/접수, 주소·연락처·공개구분 | 기관 지정 없이 공통 서식(rules_official/_공통.json) | `rules_official/_공통.json` (행정업무규정 제7조·시행규칙 제2·4·6조) | **사용 흐름** — AI에게 "이 메모를 ○○부 보고서로 만들어 줘" → AI가 `get_writing_guide`로 작성 규칙 확인 → 원고를 구조 JSON으로 작성 → `build_document` → 결과의 `warnings`(고칠 점)가 있으면 AI가 고쳐 다시 생성. 문서 종류 판단 기준(가이드에 포함): 언론·국민 대상 발표·배포용이면 보도자료, 내부 보고·계획·검토면 보고서, 행정업무규정 별지 제1호서식 기안문·시행문이 필요하면 official. ## 설치 [uv](https://docs.astral.sh/uv/)가 있으면 설치 없이 바로 실행됩니다. ```json { "mcpServers": { "korean-report-hwpx": { "command": "uvx", "args": ["korean-report-hwpx"] } } } ``` Claude Code: `claude mcp add korean-report-hwpx -- uvx korean-report-hwpx` - API 키·환경변수 필요 없음. - 만든 파일은 `~/korean-report-hwpx/`에 저장됩니다(`KOREAN_REPORT_HWPX_OUT_DIR`로 변경, 이전 이름 `KOREAN_GOV_DOCS_OUT_DIR`도 인식). ## 도구 | 도구 | 하는 일 | |---|---| | `get_writing_guide` | 문서 종류 판단 기준, 작성 규칙(□ 두괄식 한 문장·ㅇ 근거·- 세부, 명사형 종결, 사실·숫자 창작 금지, 기호는 텍스트에 넣지 않음, 참고·붙임 구조, 기안문 항목 번호·날짜·금액·끝 표시·붙임), 구조 JSON 스키마·예시. MCP prompt `writing_guide`로도 제공 | | `check_structure` | 생성 전 점검: 필수 필드, text 속 기호, 계층 건너뜀, □ 두 문장 이상, 명사형 종결 아닌 문장, 긴 제목, 기안문은 필수 키·to·disclosure 허용값·결재란 drafter/approver 필수·attachments 문자열 목록 검증 | | `build_document` | 구조 JSON → 기관 서식 HWPX. 입력 정규화(기호·대시·앞 공백 제거) + 고칠 점(`warnings`) 반환. `build_from_structure`는 별칭. 기안문은 `doc_type="official"`, 금액 한글 병기 경고·날짜 정규화 포함 | | `list_ministries` | 지원 기관과 문서 종류별 지원 여부(보고서: 기관 규칙/공통 규칙, 보도자료: 본문 방식, 기안문: 공통 서식) | | `get_rules` | 기관·문서 종류별 서식 규칙값(계층별 기호·글꼴·크기·내어쓰기·빈 줄, 제목 상자·표 머리, 기안문은 rules_official/_공통.json) | ### 간소화 모드 (style="simplified") AI가 읽기 쉬운 보고서 서식(번호 체계 표준화, 서술식 문장, 단순한 표). 항목 기호를 단계별 번호로 자동 부여하고, 제목 상자·표 머리 음영을 없앤 간결한 서식. **사용법**: `build_document(..., style="simplified")` 또는 `get_writing_guide(..., style="simplified")`로 지정. **간소화 모드 특징**: - 항목 기호(□ ㅇ ○ - * ※) 대신 단계별 번호 자동 부여: Ⅰ. Ⅱ. Ⅲ. (소제목) → 1. 2. 3. (대항목) → 가. 나. 다. (중항목) → 1) 2) 3) (소항목) → 가) 나) 다) (세항목) - 번호는 서버가 구조 JSON의 계층 수준(level)에서 계산하므로 사용자가 직접 번호를 쓰지 않음 - 단계별 들여쓰기 유지 - 서술식 문장 허용 (~합니다·~했다 등 동사형 종결 가능, 명사형 종결 경고 없음) - 제목 상자(테두리·음영) 없이 일반 제목 문단 - 표 머리 음영 없음 - 표 제목 자동 번호: `〈표 1〉 제목` 형식 (caption에는 제목만 작성) - 표 셀 병합 금지: 구조에 병합이 있으면 같은 값이 행마다 반복되도록 풀어 씀 - `export_markdown=True`: 같은 구조로 .md 파일 동시 저장 (GFM 표, #, ##, ### 제목 위계) - 줄 간격 150%, 문단 위 10pt(1수준)·5pt(그 외), 빈 줄 없이 문단 간격으로 구분 - 번호는 글자로 넣음. 한글 '개요' 번호 연동은 다음 버전 예정 ### 내부 결재 보고서 (report_kind="internal") 정보공개포털 내부 결재 보고서 실물 표본 측정값 반영: 라벨 칸 없는 제목, 작성일·부서 줄 `'26. 10. 9.(금) / 과·팀명`, 줄 간격 150%, 문단 위 10pt(□)·5pt(ㅇ·-). **예시**: ```json { "title": "○○ 추진계획(안)", "date": "2026. 10. 7.", "dept": "○○과", "body": [ {"type": "h", "text": "추진 배경"}, {"type": "l1", "text": "민원 대기 시간 감소를 위해 AI 안내 도입 필요"}, {"type": "l2", "text": "하루 평균 창구 민원 약 400건"}, {"type": "caption", "text": "소요 예산"}, {"type": "table", "rows": [["구분", "금액"], ["시스템 구축", "2억"]]} ] } ``` → 간소화 모드로 생성 시: `Ⅰ. 추진 배경`, `1. 민원 대기 시간 감소를 위해 AI 안내 도입 필요`, `가. 하루 평균 창구 민원 약 400건`, `〈표 1〉 소요 예산` 형식으로 표시. 보고서 구조 JSON 예: ```json { "title": "○○ 서비스 도입 추진계획(안)", "date": "2026. 10. 7.", "dept": "○○과", "body": [{"type": "h", "text": "Ⅰ. 추진 배경"}, {"type": "l1", "text": "핵심 결론 한 문장임"}, {"type": "l2", "text": "근거·세부"}, {"type": "l3", "text": "소항목"}, {"type": "note", "text": "각주"}, {"type": "ref", "text": "참고 사항"}, {"type": "caption", "text": "소요 예산"}, {"type": "table", "rows": [["구분", "금액"], ["가", "100"]]}], "appendix": [{"title": "붙임 1", "heading": "세부 내용", "body": [{"type": "l1", "text": "..."}]}] } ``` 보도자료 구조는 `{release, distribute, title, subtitles, body, appendix, contact}`입니다(블록 종류는 같고 문단 `p`·강조 상자 `box`·그림 `image` 추가). 원고에 담당자가 없으면 담당 표를 `○○과 / 김○○ / 044-000-0000` 자리표시로 채웁니다(`placeholder_contact`). 기안문·시행문(별지 제1호서식) 구조는 `doc_type="official"`로 요청합니다. 구조: ```json { "org": "행정안전부", // 두문 행정기관명(필수). 상급기관 병기는 "국무조정실 ○○위원회"처럼 한 줄 "to": "수신자 참조", // 필수. "내부결재" | "○○장관(○○과장)" | "수신자 참조" "via": "", // 경유(선택). 있으면 "(경유)" 줄에 표시 "title": "2026년 ○○ 계획 알림", // 필수 "body": [ // 항목 번호(1.→가.→1)→가)→(1)→(가))는 서버가 부여 {"type": "l1", "text": "..."}, {"type": "l2", "text": "..."}, {"type": "l3", "text": "..."}, {"type": "table", "rows": [[...]]}, {"type": "lines", "lines": ["..."]} ], "attachments": ["○○ 계획서 1부.", "○○ 명단 1부."], // 선택 "recipients": ["○○부장관", "○○청장"], // to="수신자 참조"일 때 결문 발신 명의 다음 줄 "sender": "행정안전부장관", // 발신 명의(필수) "approval": { // 결재란(필수: drafter·approver) "drafter": {"title": "주무관", "name": "", "mark": "★"}, "reviewers": [{"title": "과장", "name": "", "opinion": false}], "approver": {"title": "국장", "name": ""}, "coordinators": [{"title": "○○과장"}] }, "doc_no": {"issue": "○○과-1234", "issue_date": "2026. 10. 14.", "receive": "", "receive_date": ""}, "contact": {"zip": "30112", "address": "세종특별자치시 ○○로 00", "homepage": "www.mois.go.kr", "phone": "044-000-0000", "fax": "044-000-0001", "email": "○○○@korea.kr", "disclosure": "공개"} } ``` 기안문 항목 번호는 l1→1. / l2→가. / l3→1) / l4→가) / l5→(1) / l6→(가). 같은 계층 안에서 순서대로 증가하고 상위 계층이 바뀌면 하위 번호 초기화(제2조①). 둘째 계층부터 상위 번호 시작 위치에서 2타(한 글자) 오른쪽 들여쓰기. 금액은 `금113,560원(금일십일만삼천오백육십원)`처럼 한글 병기를 붙여야 하며, 없으면 `warnings`에 "금액 한글 병기 필요(시행규칙 제2조②)"가 나옵니다(제2조②). 날짜는 YYYY-MM-DD·YYYY.MM.DD를 YYYY. MM. DD.로 정규화합니다(영 제7조⑤). `disclosure`는 "공개"|"부분공개"|"비공개"만 허용됩니다. ## 지원 기관 (52곳) | 기관 | 보고서 | 보도자료 | 기관 | 보고서 | 보도자료 | |---|---|---|---|---|---| | 개인정보보호위원회 | 기관 규칙 | 문단식 | 법무부 | 기관 규칙 | □식 | | 경찰청 | 기관 규칙 | 문단식 | 법제처 | 기관 규칙 | 문단식 | | 고용노동부 | 기관 규칙 | 문단식 | 병무청 | 공통 규칙 | 문단식 | | 공정거래위원회 | 기관 규칙 | 문단식 | 보건복지부 | 기관 규칙 | 문단식 | | 과학기술정보통신부 | 기관 규칙 | 문단식 | 산림청 | 기관 규칙 | 문단식 | | 관세청 | 기관 규칙 | 문단식 | 산업통상부 | 기관 규칙 | 문단식 | | 교육부 | 기관 규칙 | 문단식 | 새만금개발청 | 공통 규칙 | □식 | | 국가교육위원회 | 기관 규칙 | 문단식 | 성평등가족부 | 기관 규칙 | □식 | | 국가데이터처 | 기관 규칙 | □식 | 소방청 | 공통 규칙 | □식 | | 국가보훈부 | 기관 규칙 | 문단식 | 식품의약품안전처 | 기관 규칙 | 문단식 | | 국가유산청 | 기관 규칙 | 문단식 | 외교부 | 공통 규칙 | 문단식 | | 국무조정실 | 기관 규칙 | □식 | 우주항공청 | 기관 규칙 | 문단식 | | 국민권익위원회 | 기관 규칙 | □식 | 원자력안전위원회 | 공통 규칙 | □식 | | 국방부 | 기관 규칙 | □식 | 인구전략위원회 | 공통 규칙 | 문단식 | | 국세청 | 기관 규칙 | □식 | 인사혁신처 | 기관 규칙 | 문단식 | | 국토교통부 | 기관 규칙 | □식 | 재외동포청 | 공통 규칙 | □식 | | 금융위원회 | 기관 규칙 | 문단식 | 재정경제부 | 기관 규칙 | 문단식 | | 기본사회위원회 | 공통 규칙 | □식 | 조달청 | 기관 규칙 | 문단식 | | 기상청 | 기관 규칙 | 문단식 | 중소벤처기업부 | 기관 규칙 | 문단식 | | 기획예산처 | 기관 규칙 | 문단식 | 지식재산처 | 기관 규칙 | 문단식 | | 기후에너지환경부 | 기관 규칙 | 문단식 | 질병관리청 | 기관 규칙 | 문단식 | | 농림축산식품부 | 기관 규칙 | 문단식 | 통일부 | 공통 규칙 | □식 | | 농촌진흥청 | 기관 규칙 | 문단식 | 해양경찰청 | 공통 규칙 | □식 | | 문화체육관광부 | 기관 규칙 | 문단식 | 해양수산부 | 기관 규칙 | 문단식 | | 방송미디어통신위원회 | 기관 규칙 | 문단식 | 행정안전부 | 기관 규칙 | 문단식 | | 방위사업청 | 기관 규칙 | 문단식 | 행정중심복합도시건설청 | 기관 규칙 | 문단식 | 보고서: 기관 규칙 = 그 기관 보도자료 참고·붙임 구간 실측값(42곳), 공통 규칙 = 기관 간 최빈값(기관을 지정하지 않으면 기관명 칸은 비움). 보도자료: 문단식 = 기호 없는 기사체 문단 위주, □식 = □ → ㅇ → - 개조식. ## 기관 로고 정부상징·기관 로고는 사용 규정상 이 패키지에 포함하지 않습니다. 소속 기관 담당자가 자기 기관 로고 파일을 지정하세요. - `logo_path`로 로고 그림 파일을 지정하면 보도자료는 표지의 로고 자리(기관별 크기)에, 보고서는 제목 상자 위에 들어갑니다. 보도자료 슬로건 그림은 `slogan_path`. - 지정하지 않으면 보도자료 표지에 같은 크기의 「기관 로고」 자리표시가 들어갑니다. 한글에서 글을 지우고 그림을 넣으면 됩니다. ## 데이터 전송 안내 - 모든 처리는 로컬입니다. 이 서버는 외부 API를 부르지 않고, 원고·결과 파일을 어디로도 보내지 않습니다. - 원고를 구조로 정리하는 일은 사용자가 쓰는 AI가 합니다. 그 AI 서비스의 데이터 정책은 별도로 확인하세요. ## 근거 - 정책브리핑(korea.kr) 보도자료 HWPX **2,670건(52개 중앙행정기관)** 전수 파싱. 보도자료 본문 서식은 2,016건의 문단 35,465개·빈 줄 35,434개·표 칸 32,392개 실측. - 보고서 서식은 같은 자료 중 「참고·붙임」 보고서형 구간이 있는 **1,326건**(문단 13,757개)에서 기관별로 산출(42개 기관, 3건 이상). 공통 골격(□·-·*·※ 기호, 기호 뒤 1타, 1행 제목 상자, 표 머리 맑은 고딕·가운데·굵게)은 기관 간 90% 이상 일치. - 공식 기준: 「행정업무의 운영 및 혁신에 관한 규정 시행규칙」의 항목 구분(1. → 가. → 1) → 가) …), 경기도교육청 「한 곳에 정리한 공문서 작성법」(둘째 줄은 항목 첫 글자에 맞춤, 기호 뒤 1타, 하위 항목 2타 들여쓰기 등). - 실측: 정책브리핑 보도자료 2,670건·52개 기관(보고서 구간 1,326건)에서 기관별 기호·글꼴·빈 줄·표지 표 수치를 산출. - 규칙 문서: [보도자료 서식 규칙](korean_report_hwpx/refs/보도자료_서식_규칙.md), [보고서 서식 규칙](korean_report_hwpx/refs/보고서_서식_규칙.md). 규칙값: `rules/`, `rules_report/`, 보도자료 표지·담당 표 수치: `templates/`. - 원자료는 정책브리핑에 공공누리로 공개된 보도자료이며, 이 저장소에는 원본 파일·본문·그림을 포함하지 않고 서식 수치만 담았습니다. ## 유의 - 결과물은 초안입니다. 보고·배포 전 한글에서 확인하세요. - 줄 끝(마지막 줄 한두 글자 등)은 글자 폭 추정으로 맞추므로 일부 남을 수 있습니다. **macOS + 한컴오피스 한글**이 있으면 `polish=True`로 실제 줄 배치를 받아 문단별 자간을 다시 고릅니다(한글 창이 여러 번 열리고 수 분 걸림). - 글꼴은 사용하는 컴퓨터에 설치된 글꼴로 표시됩니다(휴먼명조·HY헤드라인M 등 미설치 시 대체 글꼴). - 기안문·시행문은 `doc_type="official"`로 지원합니다(별지 제1호서식, rules_official/_공통.json). 항목 번호(1.→가.→1)→가)→(1)→(가))는 서버가 부여, 사용자는 번호를 쓰지 않습니다. 날짜는 YYYY-MM-DD·YYYY.MM.DD를 YYYY. MM. DD.로 정규화합니다. ## 라이선스 MIT © 2026 Upstage Created by Mia(윤승미)