Skip to content

airmang/hwpx-mcp-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

287 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“„ hwpx-mcp-server

AI ์—์ด์ „ํŠธ๊ฐ€ HWPX ๋ฌธ์„œ๋ฅผ ๋ฐ”๋กœ ์ฝ๊ณ , ์ฐพ๊ณ , ์ฑ„์šฐ๊ณ , ๋งŒ๋“ค๊ฒŒ ํ•˜๋Š” MCP ์„œ๋ฒ„

ํ•œ๊ธ€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ ์—†์ด ยท ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ ยท ํฌ๋กœ์Šค ํ”Œ๋žซํผ

PyPI Python License Tests


๐Ÿงฉ HWPX Stack (3์ข…)

๊ณ„์ธต ๋ ˆํฌ ์—ญํ• 
๐Ÿ“ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ python-hwpx ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ HWPX ํŒŒ์‹ฑยทํŽธ์ง‘ยท์ƒ์„ฑ ์ฝ”์–ด
๐Ÿ”Œ MCP ์„œ๋ฒ„ hwpx-mcp-server MCP ํด๋ผ์ด์–ธํŠธ(Claude Desktop, VS Code ๋“ฑ)์—์„œ HWPX ์กฐ์ž‘
๐ŸŽฏ ์—์ด์ „ํŠธ ์Šคํ‚ฌ hwpx-plugins ์—์ด์ „ํŠธ๊ฐ€ HWPX๋ฅผ ๋ฐ”๋กœ ์“ฐ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ณต์‹ ์Šคํ‚ฌ/ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒˆ๋“ค

์™œ / ๋ฌด์—‡์„ ํ•˜๋‚˜

hwpx-mcp-server๋Š” ๋ชจ๋ธ ์ปจํ…์ŠคํŠธ ํ”„๋กœํ† ์ฝœ(MCP) ํ‘œ์ค€ ์„œ๋ฒ„๋กœ, python-hwpx ์œ„์—์„œ HWPX ๋ฌธ์„œ์˜ ์—ด๋žŒยท๊ฒ€์ƒ‰ยทํŽธ์ง‘ยท์–‘์‹์ฑ„์›€ยท์ƒ์„ฑยท์ถ”์ถœ์„ AI ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • ์šด์˜์ฒด์ œ ๋ฌด๊ด€ โ€” Windows, macOS, Linux์—์„œ ๋™์ž‘
  • ํ•œ๊ธ€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ ๋ถˆํ•„์š” โ€” ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ ์ฒ˜๋ฆฌ, ์„œ๋ฒ„ยทCIยท๋กœ์ปฌ ์–ด๋””์„œ๋‚˜ ๊ฐ™์€ ํ๋ฆ„
  • AI ์—ฐ๋™ ์ค‘์‹ฌ โ€” Claude Desktop, VS Code, Gemini CLI ๋“ฑ MCP ํด๋ผ์ด์–ธํŠธ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ
  • ๋ฌธ์„œ ์กฐ์ž‘์„ ๋„๊ตฌ ํ˜ธ์ถœ๋กœ ํ‘œ์ค€ํ™” โ€” ์ฝ๊ธฐยทํŽธ์ง‘ยท๋ณต์ œยท์–‘์‹์ฑ„์›€ยท๊ฒ€์ฆ์„ ํ•˜๋‚˜์˜ ๋„๊ตฌ ์ง‘ํ•ฉ์œผ๋กœ ๋…ธ์ถœ
  • stateless ํ˜ธ์ถœ โ€” ๋„๊ตฌ๋งˆ๋‹ค filename์„ ๋ช…์‹œํ•˜๋Š” ์ผ๊ด€๋œ ๋ฐฉ์‹

์ฐธ๊ณ  ์ด ์„œ๋ฒ„๋Š” 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 >= 2.29.1

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",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

hwpx-plugins ๋ฒˆ๋“ค์˜ ๋Ÿฐ์ฒ˜(plugins/<host>/hwpx-plugin/scripts/hwpx-mcp-server)๋กœ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ๋ ˆํฌ๊ฐ€ ๊ณตํ†ต ๋ถ€๋ชจ ์•„๋ž˜์— ์—†์œผ๋ฉด HWPX_MCP_SERVER_REPO, PYTHON_HWPX_REPO๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•˜์„ธ์š”.

ํ•˜๋‚˜์˜ ํ๋ฆ„๋ถ€ํ„ฐ

์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ์™ธ์šธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ์•„๋ž˜ ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฝ๊ธฐ โ€” get_document_info โ†’ get_document_outline / get_document_text โ†’ find_text, get_table_map ๋“ฑ์œผ๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ. (์ €์žฅํ•˜์ง€ ์•Š์Œ)
  2. ์•ˆ์ „ ์ˆ˜์ • โ€” copy_document๋กœ ์‚ฌ๋ณธ ์ƒ์„ฑ โ†’ ์ฝ๊ธฐ ๋„๊ตฌ๋กœ ๋Œ€์ƒ ํ™•์ธ โ†’ search_and_replace, set_table_cell_text, apply_edits ๋“ฑ ๊ฐ€์žฅ ์ž‘์€ ๋ณ€๊ฒฝ โ†’ ๋‹ค์‹œ ์ฝ์–ด ํ™•์ธ โ†’ ๊ฒ€ํ† ๊ฐ€ ๋๋‚œ ๋ณต์‚ฌ๋ณธ์„ 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_edits๋Š” ์—ฐ์‚ฐ ๋ชฉ๋ก ์›์ž ์ ์šฉ(์ค‘๊ฐ„ ์‹คํŒจ ์‹œ ์ „์ฒด ๋กค๋ฐฑยทdry_runยทexpected_revision ๋™์‹œ์„ฑ ๊ฐ€๋“œยทidempotency_key), undo_last_edit๋Š” .bak ๋ณต์›, byte_preserving_patch๋Š” ๋ฏธ์ˆ˜์ • ์˜์—ญ ๋ฐ”์ดํŠธ ๋ณด์กด, add_tracked_edit๋Š” ๋ณ€๊ฒฝ ์ถ”์ (redline).
  • ๐Ÿ“Š ํ‘œยท์–‘์‹์ฑ„์›€ โ€” add_table, set_table_cell_text, merge_table_cells/split_table_cell, format_table, table_compute(ํ•ฉ๊ณ„ยทํ‰๊ท ยท์†Œ๊ณ„), fill_by_path(์„ฑ๋ช… > right ๊ฒฝ๋กœ ๊ตฌ๋ฌธ). ๋ฐ”์ดํŠธ ๋ณด์กด ๊ตฌ์กฐ์  ์–‘์‹์ฑ„์›€: ์…€ ๋ฐ”์ดํŠธ ์ฑ„์›€(๋นˆ/๋‹ค์ค‘ ๋ฌธ๋‹จ)ยทํ–‰/์—ด/ํ‘œ ์‚ญ์ œยท๋ณต์ œ ์‚ฝ์ž…ยท์—ด ๋„ˆ๋น„ ์ž๋™๋งž์ถคยทํฐํŠธ ์ถ•์†Œ๋งž์ถค์„ ์–‘์‹ ์„œ์‹์„ ์žฌ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•˜๋ฉฐ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ค์ œ ํ•œ์ปด์œผ๋กœ ๊ฒ€์ฆ(verify_fill). analyze_template_formfit/apply_template_formfit์€ ์Šน์ธ๋œ ์–‘์‹์„ ์›๋ณธ๊ณผ ๋‹ค๋ฅธ destination์—๋งŒ ๋ฐ˜์˜.
  • ๐Ÿ–Š๏ธ ๋ˆ„๋ฆ„ํ‹€ ์–‘์‹ โ€” list_form_fields, fill_form_field(์„œ์‹ ๋ณด์กด), analyze_form_fill(๋ผ๋ฒจ ๋งค์นญ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰).
  • ๐Ÿงพ ์„ ์–ธํ˜• ๋ฌธ์„œ ์ƒ์„ฑ โ€” hwpx.document_plan.v1๋กœ OWPML์„ ์ง์ ‘ ๋งŒ์ง€์ง€ ์•Š๊ณ  ์„ ์–ธ: validate_document_plan/analyze_document_plan(ํŒŒ์ผ ๋ฏธ์ƒ์„ฑ) โ†’ create_document_from_plan(์ƒ์„ฑ+๊ฒ€์ฆ), inspect_document_authoring_quality, inspect_operating_plan_quality, create_proposal_document. compose_exam์€ ์–‘์‹ HWPX+๋งˆํฌ๋‹ค์šด โ†’ ์‹œํ—˜์ง€ ์žฌ์กฐํŒ(verify_question_splits).
  • ๐Ÿ›๏ธ ๊ณต๋ฌธ์„œยท๋น„๊ตยท๋Œ€๋Ÿ‰ ์ƒ์‚ฐ โ€” inspect_official_document_style(ํ–‰์ •์—…๋ฌด ๊ทœ์ • lint: ํ•ญ๋ชฉ๊ธฐํ˜ธ ์œ„๊ณ„ยท"๋."ยท๋ถ™์ž„ยท๋‚ ์งœ), inspect_reference_consistency, doc_diff/create_comparison_table_document(์‹ ๊ตฌ๋Œ€์กฐํ‘œ), mail_merge(ํ…œํ”Œ๋ฆฟ+CSV/JSON โ†’ N๋ถ€ยทํŒŒ์ผ๋ช… ํŒจํ„ดยทzip), inspect_mail_merge_placeholders.
  • ๐ŸŽจ ์„œ์‹ยท๊ทธ๋ฆผยท์ƒ์„ฑ๊ธฐ โ€” 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, plan_edit/preview_edit/apply_edit, validate_structure, lint_text_conventions.

์œ„์น˜ ๊ณ„์•ฝ โ€” 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 ๊ฒŒ์ดํŠธ(VisualComplete)๋ฅผ ํ†ต๊ณผํ•˜๋ฉฐ ์šฐํšŒ ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๋ฌด๊ฒฐ์„ฑยทXMLยทOPC/IDยท์—ด๋ฆผ์•ˆ์ „ยทFormFitยท๋ ˆ์ด์•„์›ƒยท์‹œ๊ฐ ์˜ค๋ผํด โ†’ ํ•˜๋‚˜์˜ ๋ฆฌํฌํŠธ).

  • ๋ชจ๋“  ์“ฐ๊ธฐ ์‘๋‹ต์— visualComplete ๋ธ”๋ก์ด ์‹ค๋ฆฝ๋‹ˆ๋‹ค: ok, status(verified/unverified/failed), errorCodes, warnings, suggestedRetry.
  • quality ๋ธ”๋ก์œผ๋กœ ๊ฒŒ์ดํŠธ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค(์ƒ๋žต ์‹œ transparent = ์—ด๋ฆผ์•ˆ์ „๋งŒ). ์˜ˆ: apply_edits(..., quality="strict") ๋˜๋Š” quality={"mode":"strict","overflowPolicy":"fail","layoutLint":"strict"}.
  • ๊ฒŒ์ดํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ €์žฅ์ด ๋ณด๋ฅ˜๋˜๊ณ (ok=false), ๊ตฌ์กฐํ™”๋œ ์˜ค๋ฅ˜ ์ฝ”๋“œ(FIELD_OVERFLOW, STALE_LINESEG_DETECTED, VISUAL_COMPLETE_FAILED, โ€ฆ)์™€ suggestedRetry๋กœ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • 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_SANDBOX_ROOT ์„ค์ • ์‹œ ์ด root ๋‚ด๋ถ€ ์ƒ๋Œ€/์ ˆ๋Œ€๊ฒฝ๋กœ๋งŒ ํ—ˆ์šฉ unset
HWPX_MCP_FETCH_TIMEOUT_SECONDS URL ๊ธฐ๋ฐ˜ HWPX fetch timeout 20.0
HWPX_MCP_QUALITY ์ „์—ญ ๊ธฐ๋ณธ ์ €์žฅ ๊ฒŒ์ดํŠธ ์ •์ฑ…(transparent/strict). ๋„๊ตฌ๋ณ„ quality๊ฐ€ ์šฐ์„  transparent
HWPX_MCP_REQUIRE_CAPABILITY 0์ด๋ฉด capability skew fail-closed๋ฅผ ๋”(์ง„๋‹จ/์ „๋ฌธ๊ฐ€์šฉ) 1
LOG_LEVEL ๋กœ๊ทธ ๋ ˆ๋ฒจ INFO

๋” ๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ

python -m pip install -e ".[test]"   # ํ…Œ์ŠคํŠธ ์˜์กด์„ฑ ์„ค์น˜
python -m pytest -q                   # ์ „์ฒด ํ…Œ์ŠคํŠธ

๊ฐ์‚ฌ์˜ ๋ง

์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ python-hwpx ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์•„๋ž˜ ๊ณต๊ฐœ ํ‘œ์ค€ยทํ”„๋กœ์ ํŠธ์— ๋นš์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

License

Apache License 2.0. See LICENSE and NOTICE.

์ž‘์„ฑ์ž

๊ณ ๊ทœํ˜„ โ€” ๊ด‘๊ต๊ณ ๋“ฑํ•™๊ต ์ •๋ณดยท์ปดํ“จํ„ฐ ๊ต์‚ฌ

About

MCP server for AI agents to read, edit, inspect, and validate local HWPX documents.

Topics

Resources

License

Stars

65 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages