MCP server for reading, editing, inspecting, and validating local HWPX documents with AI agents.
Project description
๐ hwpx-mcp-server
AI ์์ด์ ํธ๊ฐ HWPX ๋ฌธ์๋ฅผ ๋ฐ๋ก ์ฝ๊ณ , ์ฐพ๊ณ , ์ฑ์ฐ๊ณ , ๋ง๋ค๊ฒ ํ๋ MCP ์๋ฒ
ํต์ฌ ํ์ผ ์ฒ๋ฆฌ๋ ํ๊ธ ์๋ํ๋ก์ธ์ ์์ด ยท ์์ ํ์ด์ฌ ยท ํฌ๋ก์ค ํ๋ซํผ
๐งฉ HWPX Stack (3์ข )
| ๊ณ์ธต | ๋ ํฌ | ์ญํ |
|---|---|---|
| ๐ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | python-hwpx |
์์ ํ์ด์ฌ HWPX ํ์ฑยทํธ์งยท์์ฑ ์ฝ์ด |
| ๐ MCP ์๋ฒ | hwpx-mcp-server |
MCP ํด๋ผ์ด์ธํธ(Claude Desktop, VS Code ๋ฑ)์์ HWPX ์กฐ์ |
| ๐ฏ ์์ด์ ํธ ์คํฌ | hwpx-plugin |
์์ด์ ํธ๊ฐ HWPX๋ฅผ ๋ฐ๋ก ์ฐ๊ฒ ํด์ฃผ๋ first-party ํ๋ฌ๊ทธ์ธยท์คํฌ ๋ฒ๋ค |
hwpx-mcp-server๋ python-hwpx ํ๋ก์ ํธ๊ฐ ์ง์ ์ ์ง๋ณด์ํ๋ first-party MCP ์๋ฒ์
๋๋ค.
์ด๋ ํ์ปด์ ๊ณต์ ์ ํ ๋๋ ์ธ์ฆ ์๋ฒ๋ผ๋ ๋ป์ด ์๋๋๋ค.
ํ์ฌ ๊ณต๊ฐ ๋ฆด๋ฆฌ์ค๋ hwpx-mcp-server 4.2.1์ด๋ฉฐ ์ต์ ํธํ ์ฝ์ด๋
python-hwpx 3.3.0, ๋์ ์คํฌ ์ต์ ๋ฒ์ ์ 0.5.0์
๋๋ค. ๊ธฐ๋ณธ 121๊ฐยท๊ณ ๊ธ ๋ชจ๋
ํฌํจ 132๊ฐ ๋๊ตฌ์ 28๊ฐ skill-required ๋๊ตฌ๋ ์ ์ง๋๋ฉฐ ๊ณ์ฝ ํด์๋
fff2c9093ca4677b์
๋๋ค.
MCP ์๋ฒ๋ ํ์ฌ ๋ณ๋์ Development Status classifier๋ฅผ ์ ์ธํ์ง ์์ต๋๋ค. ๋ฆด๋ฆฌ์ค ๋ฒ์ ๊ณผ
์ง์ ๋ฒ์ ์ ๋ฌธ์ํํ๋, classifier๊ฐ ์ถ๊ฐ๋๊ธฐ ์ ๊น์ง ์ฑ์๋๋ฅผ ์์๋ก ์น๊ฒฉํ์ง ์์ต๋๋ค.
์ / ๋ฌด์์ ํ๋
hwpx-mcp-server๋ ๋ชจ๋ธ ์ปจํ ์คํธ ํ๋กํ ์ฝ(MCP) ํ์ค ์๋ฒ๋ก, python-hwpx ์์์ HWPX ๋ฌธ์์ ์ด๋ยท๊ฒ์ยทํธ์งยท์์์ฑ์ยท์์ฑยท์ถ์ถ์ AI ํด๋ผ์ด์ธํธ์์ ์ง์ ์ํํ๊ฒ ํฉ๋๋ค.
- ์ด์์ฒด์ ๋ฌด๊ด โ Windows, macOS, Linux์์ ๋์
- ํต์ฌ ํ์ผ ์ฒ๋ฆฌ์ ํ๊ธ ์๋ํ๋ก์ธ์ ๋ถํ์ โ ์์ ํ์ด์ฌ ์ฒ๋ฆฌ, ์๋ฒยทCIยท๋ก์ปฌ ์ด๋์๋ ๊ฐ์ ํ๋ฆ
- AI ์ฐ๋ ์ค์ฌ โ Claude Desktop, VS Code, Gemini CLI ๋ฑ MCP ํด๋ผ์ด์ธํธ์ ์ง์ ์ฐ๊ฒฐ
- ๋ฌธ์ ์กฐ์์ ๋๊ตฌ ํธ์ถ๋ก ํ์คํ โ ์ฝ๊ธฐยทํธ์งยท๋ณต์ ยท์์์ฑ์ยท๊ฒ์ฆ์ ํ๋์ ๋๊ตฌ ์งํฉ์ผ๋ก ๋ ธ์ถ
- ๋ช ์์ ์ธ ํ์ผ ์์น ๊ณ์ฝ โ ํ์ผ ์์ ๋๊ตฌ๋ง๋ค locator์ ์ ๋ ฅยท์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ์ผ๊ด๋ ๋ฐฉ์
ํ์ผ ์์ ๋๊ตฌ๋ ๋ช ์์ ์ธ locator์ ์ ๋ ฅยท์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ฉด ์ฅ๊ธฐ workflow, ๋ ๋ ํ, revision/idempotency ๊ธฐ๋ก์ ์๋์ ์ผ๋ก ์ํ๋ฅผ ๋ณด์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฒ ์ ์ฒด๋ฅผ stateless๋ผ๊ณ ํํํ์ง ์์ต๋๋ค.
์ฐธ๊ณ ์ด ์๋ฒ๋ Open XML ๊ธฐ๋ฐ
.hwpxํฌ๋งท์ ์ง์ํฉ๋๋ค. ๋ฐ์ด๋๋ฆฌ.hwp๋ ์ง์ ํธ์ง ๋์์ด ์๋๋๋ค.
๋น ๋ฅธ ์์
์ค์น ๋ฐ ์คํ
uv ๊ธฐ์ค:
uvx hwpx-mcp-server
๋๋ pip ์ค์น ํ ์คํ:
pip install hwpx-mcp-server
hwpx-mcp-server
๋น-HWPX ๋ฌธ์(PDF/DOCX/XLSX/HTML/TXT)๋ฅผ document_to_markdown ๊ฒฝ๋ก๋ก ์ฝ์ผ๋ ค๋ฉด MarkItDown adapter extra๋ฅผ ํจ๊ป ์ค์นํฉ๋๋ค.
pip install "hwpx-mcp-server[ingest]"
์๊ตฌ ์ฌํญ: Python >= 3.10 ยท python-hwpx >= 3.3.0
MCP ํด๋ผ์ด์ธํธ ์ค์
์ค์ ํ์ผ์ ์๋ ๋ธ๋ก ํ๋๋ง ๋ฃ์ผ๋ฉด hwpx ์๋ฒ๋ฅผ ๋ฐ๋ก ์ก์ต๋๋ค.
- Claude Desktop โ
claude_desktop_config.json - Gemini CLI โ
~/.gemini/settings.json - VS Code โ
.vscode/mcp.json(ํค๊ฐmcpServers๋์servers) - Cursor / Windsurf โ ๊ฐ ์๋ํฐ์ MCP ์ค์ ํ์ผ
{
"mcpServers": {
"hwpx": {
"command": "uvx",
"args": ["hwpx-mcp-server"]
}
}
}
ํ๊ฒฝ ๋ณ์๋ฅผ ๋๊ธธ ๋๋ env ๋ธ๋ก์ ์ถ๊ฐํฉ๋๋ค.
{
"mcpServers": {
"hwpx": {
"command": "uvx",
"args": ["hwpx-mcp-server"],
"env": {
"HWPX_MCP_MAX_CHARS": "12000",
"HWPX_MCP_ADVANCED": "0",
"HWPX_MCP_WORKSPACE_ROOTS": "[\"/absolute/path/to/workspace\"]",
"LOG_LEVEL": "INFO"
}
}
}
}
hwpx-plugins๋ฒ๋ค์ ๋ฐ์ฒ(plugins/<host>/hwpx-plugin/scripts/hwpx-mcp-server)๋ก๋ ์คํํ ์ ์์ต๋๋ค. ๋ก์ปฌ ๊ฐ๋ฐ ์ ๋ ํฌ๊ฐ ๊ณตํต ๋ถ๋ชจ ์๋์ ์์ผ๋ฉดHWPX_MCP_SERVER_REPO,PYTHON_HWPX_REPO๋ฅผ ์ ๋๊ฒฝ๋ก๋ก ์ง์ ํ์ธ์.
ํ๋์ ํ๋ฆ๋ถํฐ
์ฒ์๋ถํฐ ๋ชจ๋ ๋๊ตฌ๋ฅผ ์ธ์ธ ํ์๋ ์์ต๋๋ค. ๋ณดํต ์๋ ํ๋๋ก ์์ํฉ๋๋ค.
- ์ฝ๊ธฐ โ
get_document_infoโget_document_outline/get_document_textโfind_text,get_table_map๋ฑ์ผ๋ก ํ์ํ ๋ถ๋ถ๋ง. (์ ์ฅํ์ง ์์) - ์์ ์์ โ
copy_document๋ก ์ฌ๋ณธ ์์ฑ โ ์ฝ๊ธฐ ๋๊ตฌ๋ก ๋์ ํ์ธ โsearch_and_replace,set_table_cell_text๊ฐ์ ์ ๋ฌธ ๋๊ตฌ ๋๋ ์ด์ข ํธ์ง์ฉapply_document_commands๋ก ๊ฐ์ฅ ์์ ๋ณ๊ฒฝ โ ๋ค์ ์ฝ์ด ํ์ธ โ ๊ฒํ ๊ฐ ๋๋ ๋ณต์ฌ๋ณธ์ handoff.
ํต์ฌ์ copy first ยท smallest edit ยท re-read after edits์ ๋๋ค.
๋ฌด์์ ํ๋
๊ธฐ๋ณธ ๋ชจ๋์์ ๋ค์์ HWPX ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ณ ๊ธ ๋ชจ๋(HWPX_MCP_ADVANCED=1)์์ ์ ๊ฒยท๊ฒ์ฆ์ฉ ๋๊ตฌ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์๋๋ ํ
๋ง๋ณ ๋ํ ํ์ด๋ผ์ดํธ์
๋๋ค. ์ ์ฒด ๋๊ตฌ ๋ชฉ๋กยท์๊ทธ๋์ฒ๋ docs/use-cases.md์ docs/skill-first-workflows.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๐ ์ฝ๊ธฐยทํ์ โ
get_document_info,get_document_text,get_document_outline,find_text,get_table_text,get_table_map,find_cell_by_label,list_styles.get_document_map์ ์์๋ผ์ธยทํ ์ง๋ยท๋๋ฆํยท์ต์ปค๋ฅผ ํ ํธ์ถ๋ก ๋ฐํ(์๋ณต ์ต์ํ). (์ ์ฅํ์ง ์์) - ๐ฅ ๋ก์ปฌ ๋ฌธ์ ingest โ
document_to_markdown,document_extract_json,markdown_to_document_plan์ด ๋ก์ปฌ ๋ฌธ์๋ฅผ Markdown/JSON/document plan์ผ๋ก ๋ณํํฉ๋๋ค. HWPX๋python-hwpx์์ง์ ์ฐ์ ์ฌ์ฉํ๊ณ , ๋น-HWPX๋[ingest]extra ์ค์น ์ MarkItDown adapter๋ก ์ฒ๋ฆฌํฉ๋๋ค. - ๐ ๊ฒ์ยท์นํ โ
search_and_replace,batch_replace,replace_in_paragraph,replace_by_anchor. (find_text์ธ ์ฆ์ ์ ์ฅ) - โ๏ธ ํธ์งยทํธ๋์ญ์
โ
add_heading,add_paragraph/insert_paragraph/delete_paragraph,add_page_break,add_memo๊ณ์ด.apply_document_commands๋ ์ด์ข command ๋ชฉ๋ก์ ํ ๋ฒ์ ์์ ์ ์ฉํ๋ฉฐ ์ ์ฒด ๋กค๋ฐฑยทdry_runยทexpected_revisionยทidempotency_key๋ฅผ ์ง์ํฉ๋๋ค.apply_edits๋ ์ ํ๊ธฐ ํธํ facade์ ๋๋ค.undo_last_edit๋.bak๋ณต์,byte_preserving_patch๋ ๋ฏธ์์ ์์ญ ๋ฐ์ดํธ ๋ณด์กด,add_tracked_edit๋ ๋ณ๊ฒฝ ์ถ์ (redline)์ ๋ด๋นํฉ๋๋ค. - ๐งฉ ๋ค์ค story ์์ ํธ์ง โ
apply_document_commandsํ ํธ์ถ์์ ๋ณธ๋ฌธ, ํ ์ , ๊ธฐ์กด ๊ตฌ์ญ์ ๋จ์BOTH๋จธ๋ฆฌ๊ธ ํ ์คํธ๋ฅผ ํจ๊ป ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํ๋๋ผ๋ ์คํจํ๋ฉด ์ถ๋ ฅ ์ ์ฒด๋ฅผ ๋กค๋ฐฑํ๋ฉฐ, ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ฒ ๋ณด์กดํ ์ ์๋ rich/control ๋จธ๋ฆฌ๊ธ์ ๋ณ๊ฒฝ ์์ด ๊ฑฐ๋ถํฉ๋๋ค. - ๐ ํยท์์์ฑ์ โ
add_table,set_table_cell_text,merge_table_cells/split_table_cell,format_table,table_compute(ํฉ๊ณยทํ๊ท ยท์๊ณ). ํผํฉ ์์์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋analyze_form_fillโapply_form_fillโverify_form_fill์ด๋ฉฐ ์ ยทํ๋ยท๋ณธ๋ฌธ ๋ฏธ์์ ์์ญ์ ๋ฐ์ดํธ ๋ณด์กด ์ฆ๊ฑฐ๋ฅผ ํจ๊ป ๋ฐํํฉ๋๋ค.fill_by_path์ template-formfit ์์ ์ ํ๊ธฐ ํธํ ๊ฒฝ๋ก์ ๋๋ค. - ๐๏ธ ํผํฉ ์์ ๋จ์ผ ํธ๋์ญ์
โ
list_form_fields์ ์ฝ๊ธฐ ๋๊ตฌ๋ก ๋์์ ํ์ธํ ๋คanalyze_form_fill(plan=...)โapply_form_fill(plan=compiledPlan)โverify_form_fill(plan=...)๋ก native fieldยทlabel cellยทcanonical pathยทbody anchor๋ฅผ ํ ๋ฒ์ ์์ ์ ์ฉํฉ๋๋ค.fill_form_field๋ ๋จ์ผ ๋ค์ดํฐ๋ธ ํ๋ ํธํ ๊ฒฝ๋ก์ด๊ณ , ํ๊ฐ๊ณํ์apply_evalplan_fill, ์ํ์ง๋compose_exam์ ๋ ๋ฆฝ ์ ๋ฌธ ๊ฒฝ๋ก๋ฅผ ์ ์งํฉ๋๋ค. - ๐งพ ์ ์ธํ ๋ฌธ์ ์์ฑ โ
hwpx.document_plan.v1๋ก OWPML์ ์ง์ ๋ง์ง์ง ์๊ณ ์ ์ธ:validate_document_plan/analyze_document_plan(ํ์ผ ๋ฏธ์์ฑ) โcreate_document_from_plan(์์ฑ+๊ฒ์ฆ),inspect_document_authoring_quality,inspect_operating_plan_quality. ์ ์์๋ document plan ๊ฒฝ๋ก๊ฐ ๊ธฐ๋ณธ์ด๋ฉฐcreate_proposal_document๋ ํธํ facade์ ๋๋ค.compose_exam์ ์์ HWPX+๋งํฌ๋ค์ด โ ์ํ์ง ์ฌ์กฐํ(verify_question_splits). - ๐๏ธ ๊ณต๋ฌธ์ยท๋น๊ตยท๋๋ ์์ฐ โ
inspect_official_document_style(ํ์ ์ ๋ฌด ๊ท์ lint: ํญ๋ชฉ๊ธฐํธ ์๊ณยท"๋."ยท๋ถ์ยท๋ ์ง),inspect_reference_consistency,doc_diffํ comparison document plan์create_document_from_plan์ผ๋ก ์์ฑํ๋ ์ ๊ตฌ๋์กฐํ,mail_merge(ํ ํ๋ฆฟ+CSV/JSON โ N๋ถยทํ์ผ๋ช ํจํดยทzip),inspect_mail_merge_placeholders.create_comparison_table_document๋ ํธํ facade์ ๋๋ค. - ๐จ ์์ยท๊ทธ๋ฆผยท์์ฑ๊ธฐ โ
set_paragraph_format,set_page_setup,set_header_footer,set_page_number,set_list_format,format_text,create_custom_style(์ ๋ ฅ์ pt/mm/% ์ธ๊ฐ ๋จ์);insert_picture(manifest ์๋ ๋ฑ๋ก)/replace_picture;build_image_grid(์ฌ์ง๋์ง)ยทbuild_meeting_nameplatesยทbuild_organization_chart. - ๐ฅ๏ธ ํ๋ฆฌ๋ทฐยท์ถ์ถยท๋ณต๊ตฌยท์ง๋จ โ
render_preview(HTML/PNG ์๊ฐ ์๊ธฐ๊ฒ์ฆ),hwpx_to_markdown/hwpx_to_html/hwpx_extract_json(payloadยทURL ์ ๋ ฅ, ํ์ผ ๋ฏธ์์ ),repair_hwpx(์๋ณธ ๋ณด์กดยทmimetype-first ์ฌํจํน,recover=true๋ก ์์ ZIP LFH scan ๋ณต๊ตฌ; ์๋ตcrcOk/validatePackage.ok/recoveredํ์ธ),mcp_server_health(๋ฐฐํฌ ์คํ ์๊ธฐ์ง๋จยทcapability handshake). - ๐ฌ ๊ณ ๊ธ(
HWPX_MCP_ADVANCED=1) โpackage_parts,package_get_xml/package_get_text,object_find_by_tag/object_find_by_attr,validate_structure,lint_text_conventions๋ฑ ์ ์์ค ์ ๊ฒ ๋๊ตฌ.plan_edit/preview_edit/apply_edit๋ ํ ์ ํ ๊ธฐ๊ฐ๋ง ์ ์งํ๋ deprecated stub์ด๋ฉฐ ์ ๊ท ํ๋ฆ์apply_document_commands๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์น ๊ณ์ฝ โ
paragraph_index๋ ๋ณธ๋ฌธ ์ง์ ๋ฌธ๋จ์ 0-based ์ธ๋ฑ์ค์ ๋๋ค. ํ ์ ๋ฌธ๋จ์ ์ด ์ธ๋ฑ์ค์ ์์ง ์๊ณ{"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0}๊ฐ์location๊ฐ์ฒด๋ก ์ง์ ํ๋ฉฐ,get_table_map/find_text๊ฐ ๋ฐํํ ๊ฐ์ ๊ทธ๋๋ก ๋๊ธธ ์ ์์ต๋๋ค.
์์ ์ฌ์ฉ ์์น
์ด ์๋ฒ์ ๊ณต๊ฐ ํ๋ฉด์ ์ MCP ๋๊ตฌ ์งํฉ์ ๋๋ค. ์ํฌํ๋ก ๋ฌธ์๋ ์คํฌ ์์๋ ์ด ๋๊ตฌ๋ค์ ์กฐํฉ ํจํด์ด์ง ๋ณ๋ ๊ณ์ฝ์ด ์๋๋๋ค.
- read first โ ๋จผ์ ์ฝ๊ธฐ ๋๊ตฌ๋ก ๋ฌธ์๋ฅผ ํ์ ํ๋ค.
- copy before risky edits โ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด์กดํด์ผ ํ๋ฉด
copy_document๋ฅผ ๋จผ์ ํธ์ถํ๋ค. - mutating tools persist immediately โ ์์ ๋๊ตฌ๋ ํธ์ถ ์ฆ์ ์ ์ฅ๋๋ฏ๋ก ๊ฒํ ์ฉ์ ๋ณต์ฌ๋ณธ์์ ์์ ํ๋ค.
- explicit handoff uses the reviewed copy โ ๋ฉํยทhandoff๋ ๊ฒํ ๊ฐ ๋๋ ๋ณต์ฌ๋ณธ ํ์ผ ๊ธฐ์ค.
- advanced mode๋ ์ ๊ฒ/๊ฒ์ฆ์ฉ์ผ๋ก ๋ถ๋ฆฌ โ package inspectionยทedit planningยทvalidation์
HWPX_MCP_ADVANCED=1์ผ ๋๋ง ์ฐ๊ณ ๊ธฐ๋ณธ ํ๋ฆ๊ณผ ์์ง ์๋๋ค.
ํ์ง ๊ฒ์ดํธ ๊ณ์ฝ (no raw XML)
๋ชจ๋ธ์ operation/plan๋ง ๋ณด๋ด๊ณ raw XML์ ์ง์ ํธ์งํ์ง ์์ต๋๋ค. raw_xml_replace, arbitrary_xpath_mutation ๊ฐ์ ์์ XML ํ๋ฉด์ public ๋๊ตฌ๋ก ๋
ธ์ถ๋์ง ์์ต๋๋ค. ์ผ๋ฐ ๋ฌธ์ ์ ์ฅ ๊ฒฝ๋ก๋ python-hwpx์ SavePipeline ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํด ๋ฌด๊ฒฐ์ฑยทXMLยทOPC/IDยท์ด๋ฆผ์์ ์ ๊ฒ์ฌํ๊ณ , ์์ฒญํ ํ์ง ์์ค์ ๋ฐ๋ผ FormFitยท๋ ์ด์์ยท์๊ฐ ์ค๋ผํด๊น์ง ์ ์ฉํฉ๋๋ค.
quality๋ฅผ ๋ฐ๋ ์ผ๋ฐ ์ ์ฅ ๋๊ตฌ๋ ์๋ต์visualComplete๋ฅผ ์ฃ์ต๋๋ค:ok,status(verified/unverified/failed),errorCodes,warnings,suggestedRetry.quality๋ฅผ ์๋ตํ๋ฉด transparent(์ด๋ฆผ์์ ),"strict"๋๋{"mode":"strict","overflowPolicy":"fail","layoutLint":"strict"}๋ก ์ฌ๋ฆฌ๋ฉด ์ถ๊ฐ ๊ฒ์ดํธ๋ฅผ ์ ์ฉํฉ๋๋ค.byte_preserving_patch,apply_table_ops,apply_body_ops,apply_evalplan_fill์ untouched package byte๋ฅผ ์ ์งํ๊ธฐ ์ํ ๋ช ์์ carveout์ ๋๋ค. ์ด ๊ฒฝ๋ก๋ guarded publication, open-safety, byte/member diff์ ๊ณตํต verification receipt๋ฅผ ์ฌ์ฉํ๋ฉฐvisualComplete๋ฅผ ์ฃผ์ฅํ์ง ์์ต๋๋ค. ํยทํ๊ฐ๊ณํ์ ์์ฒญ ์ ์ค์ ๋ ๋ ๊ฒ์ฌ๋ฅผ ๋ณ๋ ์ํํ๊ณ , ๋ณธ๋ฌธ fast path๋ ์ ์ฒด ์ฌ๋ ๋๋ฅผ ํ์ง ์์ต๋๋ค.- ํด๋น ๊ฒฝ๋ก์ ๊ฒ์ดํธ๊ฐ ์คํจํ๋ฉด ์ ์ฅ์ด ๋ณด๋ฅ๋๊ฑฐ๋ ์์ ํ ํ๋ณด๋ง ์๋ณต๋๊ณ (
ok=false), ๊ตฌ์กฐํ๋ ์ค๋ฅ ์ฝ๋๋ก ์ฌ์๋ ์ฌ๋ถ๋ฅผ ์๋ฆฝ๋๋ค. - capability handshake๊ฐ core/mcp/plugin ๋ฒ์ +ํด์๋ฅผ ์ ๊ฒํ๊ณ , skew ์ ์ฐ๊ธฐ๋ฅผ fail-closed๋ก ์ฐจ๋จํฉ๋๋ค(
mcp_server_health.capability). ์ง๋จ/์ฐํ๋HWPX_MCP_REQUIRE_CAPABILITY=0.
visual_review_required=true๋ ๊ตฌ์กฐ/ํ์ผ ๊ธฐ๋ฐ ๊ฒ์ฆ์ ํต๊ณผํ์ง๋ง ๋ ๋๋ง๋ ์๊ฐ ๋ ์ด์์์ ์์ง ์ฆ๋ช ๋์ง ์์๋ค๋ ๋ป์ ๋๋ค. ์ด์ ๊ณํ์ยทtemplate-formfit ๊ฒฐ๊ณผ๋ฅผ ์ต์ข ์ ์ถ ๊ฐ๋ฅ(submission-ready)์ผ๋ก ์ฃผ์ฅํ๋ ค๋ฉด ์ด๋ฆฐ ๋ฌธ์๋ฅผ ๊ฒํ ํดhwpx.visual-review.v1์ฆ๊ฑฐ๋ฅผ ๋จ๊ธฐ๊ณcurrent.status="observed_pass"์ฌ์ผ ํฉ๋๋ค.
ํ๊ฒฝ ๋ณ์
| ๋ณ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
HWPX_MCP_MAX_CHARS |
ํ ์คํธ ๋ฐํ ๋๊ตฌ ๊ธฐ๋ณธ ์ต๋ ๊ธธ์ด | 10000 |
HWPX_MCP_AUTOBACKUP |
1์ด๋ฉด ์ ์ฅ ์ .bak ๋ฐฑ์
์์ฑ |
1 |
HWPX_MCP_ADVANCED |
1์ด๋ฉด ๊ณ ๊ธ ๋๊ตฌ ํ์ฑํ |
0 |
HWPX_MCP_WORKSPACE_ROOTS |
ํ์ฉํ workspace ์ ๋๊ฒฝ๋ก์ JSON ๋ฐฐ์ด(๋ณต์ root ์ง์). ์๋๊ฒฝ๋ก๋ ์ฒซ root ๊ธฐ์ค | unset(ํ๋ก์ธ์ค cwd) |
HWPX_MCP_SANDBOX_ROOT |
๋จ์ผ root ๊ตฌ๋ฒ์ ํธํ ๋ณ์. ์ ์ค์ ์์๋ HWPX_MCP_WORKSPACE_ROOTS ์ฌ์ฉ |
unset |
HWPX_MCP_FETCH_TIMEOUT_SECONDS |
URL ๊ธฐ๋ฐ HWPX fetch timeout | 20.0 |
HWPX_MCP_ALLOW_PRIVATE_NETWORK |
1์ด๋ฉด ์ ๋ขฐ๋ ์ฌ์ค/๋ฃจํ๋ฐฑ HTTPS ๋์ ํ์ฉ. ๋งํฌ๋ก์ปฌยทmetadataยท์์ฝ ์ฃผ์๋ ๊ณ์ ์ฐจ๋จ |
0 |
HWPX_MCP_QUALITY |
์ ์ญ ๊ธฐ๋ณธ ์ ์ฅ ๊ฒ์ดํธ ์ ์ฑ
(transparent/strict). ๋๊ตฌ๋ณ quality๊ฐ ์ฐ์ |
transparent |
HWPX_MCP_REQUIRE_CAPABILITY |
0์ด๋ฉด capability skew fail-closed๋ฅผ ๋(์ง๋จ/์ ๋ฌธ๊ฐ์ฉ) |
1 |
LOG_LEVEL |
๋ก๊ทธ ๋ ๋ฒจ | INFO |
๊ฒฝ๋ก๋ ๊ธฐ๋ณธ์ ์ผ๋ก workspace ๋ฐ traversal๊ณผ symlink escape๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. URL ์ ๋ ฅ๊ณผ HTTP storage/render transport๋ HTTPS ๋ฐ ๊ณต๊ฐ IP๋ง ํ์ฉํ๊ณ , ๋ฆฌ๋ค์ด๋ ํธ์ ์ค์ ์ฐ๊ฒฐ ํผ์ด๋ฅผ ๋ค์ ๊ฒ์ฌํฉ๋๋ค. ์ฌ์ค๋ง opt-in์ ์ด์์๊ฐ ๋์์ ์ ๋ขฐํ๊ณ ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๋ณ๋๋ก ํต์ ํ ๋๋ง ์ฌ์ฉํ์ธ์.
macOS์ renameat2๋ฅผ ์ ๊ณตํ๋ Linux์ canonical mixed-form ๋ฐ byte-preserving form ๊ฒ์ ๊ฒฝ๋ก๋ root/parent descriptor์
๋์ byteยทidentity snapshot์ ๋ฌถ์ฌ ๋์ renameยทsymlink ๊ต์ฒด๋ ์คํจ ํ ์๋ณตํฉ๋๋ค.
Windows์ ๊ทธ ์์ ๊ตํ primitive๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ธฐํ POSIX ํธ์คํธ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
fallback์ ๋์ผํ handle-relative ๋ณด์ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด ํธ์คํธ์์๋ ๋ก์ปฌ
workspace๋ฅผ ์ ๋ขฐ๋ ๋๋ ํฐ๋ฆฌ๋ก ์ทจ๊ธํ๊ณ ACL ๋๋ host sandbox๋ก ๊ฐ์ ์ฌ์ฉ์ ๊ถํ์
๋์ reparse/rename์ ๋ง์์ผ ํฉ๋๋ค.
๋ ๋ณด๊ธฐ
- ์ค์ ์ฌ์ฉ ์ฌ๋ก:
docs/use-cases.md - ์คํฌ ๊ธฐ๋ฐ ์ํฌํ๋ก:
docs/skill-first-workflows.md - ๋ณด์ยทํ๋๋ ๊ฐ์ด๋:
docs/hardening_guide_ko.md - ๋๊ตฌ ๊ณ์ฝ:
docs/tool-contract.md - 4.2.1์ ์์ฑ ๊ณ์ฝ:
docs/tool-contract.generated.json - ์ญ์ฌ์ 4.0.0 ๊ธฐ๊ณ ํ๋
๊ณ์ฝ delta:
docs/tool-contract-delta-4.0.0.json - ์ญ์ฌ์ 3.0.0 ์ ํ ๊ฒฝ๊ณ ์ ํ:
docs/product-boundary-migration-3.0.0.md - ์ญ์ฌ์ 3.0.0 ๊ธฐ๊ณ ํ๋
๊ณ์ฝ delta:
docs/tool-contract-delta-3.0.0.json - ๋ณ๊ฒฝ ์ด๋ ฅ:
CHANGELOG.md
ํ ์คํธ
python -m pip install -e ".[test]" # ํ
์คํธ ์์กด์ฑ ์ค์น
python -m pytest -q # ์ ์ฒด ํ
์คํธ
๊ฐ์ฌ์ ๋ง
์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ python-hwpx ์์์ ๋์ํ๋ฉฐ, ์๋ ๊ณต๊ฐ ํ์คยทํ๋ก์ ํธ์ ๋น์ง๊ณ ์์ต๋๋ค.
- OWPML โ ๊ฐ๋ฐฉํ ์๋ํ๋ก์ธ์ ๋งํฌ์ ์ธ์ด (KS X 6101) โ HWPX๊ฐ ๊ธฐ๋ฐํ๋ ํ๊ตญ ์ฐ์ ํ์ค
- hancom-io/hwpx-owpml-model โ OWPML ์์ ๊ตฌ์กฐ ์ฐธ์กฐ ๋ชจ๋ธ ยท neolord0/hwpxlib โ ์ค๋ผํด ์ํ ์ฝํผ์ค
- edwardkim/rhwp โ ๋ฉฑ๋ฑ์ฑยท๊ฒ์ฆ ๊ฒ์ดํธ ์ค๊ณ ์๊ฐ
License
Apache License 2.0. See LICENSE and NOTICE.
์์ฑ์
๊ณ ๊ทํ โ ๊ด๊ต๊ณ ๋ฑํ๊ต ์ ๋ณดยท์ปดํจํฐ ๊ต์ฌ
- ์ด๋ฉ์ผ: kokyuhyun@hotmail.com
- GitHub: @airmang
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hwpx_mcp_server-4.2.1.tar.gz.
File metadata
- Download URL: hwpx_mcp_server-4.2.1.tar.gz
- Upload date:
- Size: 472.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04507f1bc32d95d5a9899dcf366901a1fcd9ef4bb58aa932a086276b9f7ac50e
|
|
| MD5 |
6095c20b76537df81bb46030086ca890
|
|
| BLAKE2b-256 |
165b89f8195e663fc3266159a0414e4c5d15c74f34af63450c7691872abbfd34
|
Provenance
The following attestation bundles were made for hwpx_mcp_server-4.2.1.tar.gz:
Publisher:
release.yml on airmang/hwpx-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hwpx_mcp_server-4.2.1.tar.gz -
Subject digest:
04507f1bc32d95d5a9899dcf366901a1fcd9ef4bb58aa932a086276b9f7ac50e - Sigstore transparency entry: 2193107114
- Sigstore integration time:
-
Permalink:
airmang/hwpx-mcp-server@e07490f85c95c387145ebcdfde92f038b866c546 -
Branch / Tag:
refs/tags/v4.2.1 - Owner: https://github.com/airmang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e07490f85c95c387145ebcdfde92f038b866c546 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hwpx_mcp_server-4.2.1-py3-none-any.whl.
File metadata
- Download URL: hwpx_mcp_server-4.2.1-py3-none-any.whl
- Upload date:
- Size: 346.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
557ce7ac1c0cd9249ba5b5e882fe2ff89333e85f7fc81882016cc316f22ddabb
|
|
| MD5 |
66a735fcfb1c0d9241fdda7f5798c0c4
|
|
| BLAKE2b-256 |
deee14529f7c90744bf1fdc1fb445d0af089a5f38324a4bf911f34e08ac1f0cb
|
Provenance
The following attestation bundles were made for hwpx_mcp_server-4.2.1-py3-none-any.whl:
Publisher:
release.yml on airmang/hwpx-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hwpx_mcp_server-4.2.1-py3-none-any.whl -
Subject digest:
557ce7ac1c0cd9249ba5b5e882fe2ff89333e85f7fc81882016cc316f22ddabb - Sigstore transparency entry: 2193107373
- Sigstore integration time:
-
Permalink:
airmang/hwpx-mcp-server@e07490f85c95c387145ebcdfde92f038b866c546 -
Branch / Tag:
refs/tags/v4.2.1 - Owner: https://github.com/airmang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e07490f85c95c387145ebcdfde92f038b866c546 -
Trigger Event:
push
-
Statement type: