Skip to main content

MCP server for reading, editing, inspecting, and validating local HWPX documents with AI agents.

Project description

๐Ÿ“„ 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 >= 3.0.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๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•˜์„ธ์š”.

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

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

  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_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์€ ์šด์˜์ž๊ฐ€ ๋Œ€์ƒ์„ ์‹ ๋ขฐํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ๊ฒฝ๊ณ„๋ฅผ ๋ณ„๋„๋กœ ํ†ต์ œํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋” ๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ

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

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

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

License

Apache License 2.0. See LICENSE and NOTICE.

์ž‘์„ฑ์ž

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hwpx_mcp_server-3.0.0.tar.gz (380.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hwpx_mcp_server-3.0.0-py3-none-any.whl (282.9 kB view details)

Uploaded Python 3

File details

Details for the file hwpx_mcp_server-3.0.0.tar.gz.

File metadata

  • Download URL: hwpx_mcp_server-3.0.0.tar.gz
  • Upload date:
  • Size: 380.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for hwpx_mcp_server-3.0.0.tar.gz
Algorithm Hash digest
SHA256 5562d333ea7f7c2169c313cc872ab35717c7ccad92e8a9bfa1c2db965a97a8ac
MD5 15fcc7cd9709c2b31a39f2d8f48ddcef
BLAKE2b-256 82b35a98f36024e75d26580a0c31d812af98f1b2c21e9841998834954fbcf04b

See more details on using hashes here.

Provenance

The following attestation bundles were made for hwpx_mcp_server-3.0.0.tar.gz:

Publisher: release.yml on airmang/hwpx-mcp-server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hwpx_mcp_server-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: hwpx_mcp_server-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 282.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for hwpx_mcp_server-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a01df353985edc42134a06b099586cff798cfed34a929443fba1efe6dc69b0b4
MD5 7d1dd13da487bc9298851004c64983d7
BLAKE2b-256 1c6f24e8c7b94cc3544b256515deecdedbc7c05da569da21ef7895e35da64efc

See more details on using hashes here.

Provenance

The following attestation bundles were made for hwpx_mcp_server-3.0.0-py3-none-any.whl:

Publisher: release.yml on airmang/hwpx-mcp-server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page