hwpx-mcp-server

hwpx-mcp-server

Enables AI agents to read, search, and modify HWPX documents directly via MCP, without requiring Hancom Word Processor. Supports pure Python, cross-platform operation.

Category
Visit Server

README

<p align="center"> <h1 align="center">๐Ÿ“„ hwpx-mcp-server</h1> <p align="center"> <strong>AI ์—์ด์ „ํŠธ๊ฐ€ HWPX ๋ฌธ์„œ๋ฅผ ๋ฐ”๋กœ ์ฝ๊ณ , ์ฐพ๊ณ , ์ˆ˜์ •ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” MCP ์„œ๋ฒ„</strong> </p> <p align="center"> ํ•œ๊ธ€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ ์—†์ด ยท ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ ยท ํฌ๋กœ์Šค ํ”Œ๋žซํผ </p> <p align="center"> <a href="https://pypi.org/project/hwpx-mcp-server/"><img src="https://img.shields.io/pypi/v/hwpx-mcp-server?style=flat-square&color=blue" alt="PyPI"></a> <a href="https://pypi.org/project/hwpx-mcp-server/"><img src="https://img.shields.io/pypi/pyversions/hwpx-mcp-server?style=flat-square" alt="Python"></a> <a href="https://github.com/airmang/hwpx-mcp-server/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue" alt="License"></a> <a href="https://github.com/airmang/hwpx-mcp-server/actions"><img src="https://img.shields.io/github/actions/workflow/status/airmang/hwpx-mcp-server/test.yml?style=flat-square&label=tests" alt="Tests"></a> </p> </p>


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

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

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

์ฐธ๊ณ  ์ด ์„œ๋ฒ„๋Š” Open XML ๊ธฐ๋ฐ˜ .hwpx ํฌ๋งท์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ .hwp ํฌ๋งท์€ ์ง์ ‘ ํŽธ์ง‘ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

<br>

์ด ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์ผ

  • Claude Desktop, VS Code, Gemini CLI ๊ฐ™์€ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ HWPX๋ฅผ ๋ฐ”๋กœ ์ฝ๊ธฐ
  • ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“  ๋’ค ์•ˆ์ „ํ•˜๊ฒŒ ๊ฒ€์ƒ‰ยท์น˜ํ™˜ยทํ‘œ ํŽธ์ง‘ยท๋ฌธ๋‹จ ์ถ”๊ฐ€ ์ˆ˜ํ–‰
  • ๋ฌธ์„œ ๊ฐœ์š”, ํ‘œ ๋งต, ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ AI๊ฐ€ ์ง์ ‘ ์กฐํšŒํ•˜๊ณ  ํ›„์† ์ž‘์—…์œผ๋กœ ์—ฐ๊ฒฐ
  • ํ•œ๊ธ€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ ์—†์ด ์„œ๋ฒ„ยทCIยท๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ฐ™์€ ํ๋ฆ„ ์œ ์ง€
  • ๊ณ ๊ธ‰ ๋ชจ๋“œ์—์„œ ๊ฒ€์ฆ, package inspection, edit planning๊นŒ์ง€ ํ™•์žฅ

Claude Desktop 5๋ถ„ ์—ฐ๊ฒฐ

์•„๋ž˜ ์„ค์ • ํ•˜๋‚˜๋งŒ ๋„ฃ์œผ๋ฉด Claude Desktop์—์„œ hwpx MCP ์„œ๋ฒ„๋ฅผ ๋ฐ”๋กœ ์žก๋Š”๋‹ค.

{
  "mcpServers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"]
    }
  }
}

Screenshot placeholder: Claude Desktop ์„ค์ • ํ™”๋ฉด์—์„œ hwpx ์„œ๋ฒ„๊ฐ€ ํ™œ์„ฑํ™”๋œ ์žฅ๋ฉด์„ ์—ฌ๊ธฐ์— ๋„ฃ์„ ์˜ˆ์ •.

์™œ ํ•„์š”ํ•œ๊ฐ€?

๊ตญ๋‚ด ๊ณต๊ณต๊ธฐ๊ด€ยทํ•™๊ตยท๊ธฐ์—…์—์„œ๋Š” ํ•œ๊ธ€ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์—…๋ฌด๊ฐ€ ๋งŽ์ง€๋งŒ, ์ž๋™ํ™”๋Š” ์˜ค๋žซ๋™์•ˆ ์šด์˜์ฒด์ œ์™€ ํ”„๋กœ๊ทธ๋žจ์— ํฌ๊ฒŒ ์˜์กดํ–ˆ์Šต๋‹ˆ๋‹ค.

hwpx-mcp-server๋Š” ์ด ์ œ์•ฝ์„ ์ค„์ด๋Š” ๋ฐ ์ดˆ์ ์„ ๋‘ก๋‹ˆ๋‹ค.

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

<br>

์‚ฌ์šฉ ์‚ฌ๋ก€

<br>

๋น ๋ฅธ ์‹œ์ž‘

1. ์„ค์น˜ ๋ฐ ์‹คํ–‰

uv ๊ธฐ์ค€:

uvx hwpx-mcp-server

๋˜๋Š” pip ์„ค์น˜ ํ›„ ์‹คํ–‰:

pip install hwpx-mcp-server
hwpx-mcp-server

์š”๊ตฌ ์‚ฌํ•ญ:

  • Python >= 3.10
  • python-hwpx >= 2.10.3

ํ˜„์žฌ ์ €์žฅ์†Œ ๊ธฐ์ค€ ๊ฒ€์ฆ ๋ฒ„์ „์€ python-hwpx 2.10.3์ž…๋‹ˆ๋‹ค (2026-06-09 ๊ฒ€์ฆ). ์ตœ์†Œ ์ง€์› ๋ฒ„์ „์€ python-hwpx >= 2.10.3์ž…๋‹ˆ๋‹ค.

2. MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ •

HWPX plugin companion launcher

The hwpx-plugins repository builds per-host bundles whose MCP launcher (plugins/<host>/hwpx-plugin/scripts/hwpx-mcp-server) can run this server. In local development, set HWPX_MCP_SERVER_REPO=/absolute/path/to/hwpx-mcp-server and PYTHON_HWPX_REPO=/absolute/path/to/python-hwpx when the repositories are not under a common parent. The launcher otherwise discovers them by walking up from the bundle directory and uses uv run --project "$HWPX_MCP_SERVER_REPO" --with-editable "$PYTHON_HWPX_REPO" --with-editable "$HWPX_MCP_SERVER_REPO" hwpx-mcp-server.

<details> <summary><b>Claude Desktop</b></summary>

claude_desktop_config.json

{
  "mcpServers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"]
    }
  }
}

</details>

<details> <summary><b>Gemini CLI</b></summary>

~/.gemini/settings.json

{
  "mcpServers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"]
    }
  }
}

</details>

<details> <summary><b>VS Code</b></summary>

.vscode/mcp.json

{
  "servers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"]
    }
  }
}

</details>

<details> <summary><b>Cursor / Windsurf</b></summary>

๊ฐ ์—๋””ํ„ฐ์˜ MCP ์„ค์ • ํŒŒ์ผ์— ๊ฐ™์€ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

{
  "mcpServers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"]
    }
  }
}

</details>

<br>

์ž‘์—…๋ณ„ ๋น ๋ฅธ ๊ฒฝ๋กœ

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

1. ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ํŒŒ์•…ํ•  ๋•Œ

  1. get_document_info
  2. get_document_outline ๋˜๋Š” get_document_text
  3. find_text, get_table_text, get_table_map ๊ฐ™์€ ์ฝ๊ธฐ ๋„๊ตฌ๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋” ๋ณธ๋‹ค.

์ด ํ๋ฆ„์€ ์›๋ณธ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ๋•Œ

  1. copy_document๋กœ ์ž‘์—…์šฉ ์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค.
  2. ์ฝ๊ธฐ ๋„๊ตฌ๋กœ ์ˆ˜์ • ๋Œ€์ƒ์„ ๋‹ค์‹œ ํ™•์ธํ•œ๋‹ค.
  3. search_and_replace, batch_replace, set_table_cell_text, add_paragraph ๊ฐ™์€ ๊ฐ€์žฅ ์ž‘์€ ๋ณ€๊ฒฝ ๋„๊ตฌ๋งŒ ์“ด๋‹ค.
  4. ์ˆ˜์ • ํ›„ ๋‹ค์‹œ ์ฝ๊ธฐ ๋„๊ตฌ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค.
  5. ๋‚ฉํ’ˆ์ด๋‚˜ handoff๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๊ฒ€ํ† ๊ฐ€ ๋๋‚œ ๋ณต์‚ฌ๋ณธ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค.

ํ•ต์‹ฌ์€ copy first, smallest edit, re-read after edits๋‹ค.

3. ๊ตฌ์กฐ ์ ๊ฒ€๊ณผ ๊ฒ€์ฆ์ด ๋ชฉ์ ์ผ ๋•Œ

  1. MCP ์„ค์ •์—์„œ HWPX_MCP_ADVANCED=1
  2. package_parts, package_get_xml, package_get_text๋กœ ๋‚ด๋ถ€ ํŒŒํŠธ๋ฅผ ๋ณธ๋‹ค.
  3. validate_structure, lint_text_conventions, plan_edit, preview_edit๋Š” ๊ธฐ๋ณธ ํŽธ์ง‘ ํ๋ฆ„๊ณผ ์„ž์ง€ ์•Š๊ณ  ์ ๊ฒ€/๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

4. ํ•œ์ปด์—์„œ ์—ด๋ฆฌ์ง€ ์•Š๋Š” HWPX๋ฅผ ๋ณต๊ตฌํ•  ๋•Œ

  1. ์›๋ณธ์„ ์ง์ ‘ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  repair_hwpx(source_filename, output_filename)๋กœ ๋ณต๊ตฌ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค.
  2. ์ผ๋ฐ˜ ZIP open์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ central directory ์†์ƒ์ด ์˜์‹ฌ๋˜๋ฉด recover=true๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  3. ๋ฐ˜ํ™˜๊ฐ’์˜ crcOk, validatePackage.ok, reordered, recovered๋ฅผ ํ™•์ธํ•œ๋‹ค.
  4. ์ตœ์ข… handoff ์ „์—๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด Hancom Office HWP ๋˜๋Š” viewer๋กœ ์‹ค์ œ ์—ด๋žŒํ•œ๋‹ค.

์•ˆ์ „ํ•œ ์‚ฌ์šฉ ์›์น™

์ด ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‘œ๋ฉด์€ ํ˜„์žฌ README์— ์ ํžŒ MCP ๋„๊ตฌ ์ง‘ํ•ฉ์ด๋‹ค. ์›Œํฌํ”Œ๋กœ ๋ฌธ์„œ๋‚˜ ์Šคํ‚ฌ ์˜ˆ์‹œ๋Š” ์ด ๋„๊ตฌ๋“ค์„ ์กฐํ•ฉํ•˜๋Š” ์‚ฌ์šฉ ํŒจํ„ด์ด์ง€, ๋ณ„๋„์˜ ์ƒˆ public tool ๊ณ„์•ฝ์ด ์•„๋‹ˆ๋‹ค.

์‹ค์ „์—์„œ๋Š” ์•„๋ž˜ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค.

  1. ๋จผ์ € get_document_info, get_document_text, find_text ๊ฐ™์€ ์ฝ๊ธฐ ๋„๊ตฌ๋กœ ๋ฌธ์„œ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.
  2. ์ˆ˜์ • ์ „ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์กดํ•ด์•ผ ํ•˜๋ฉด copy_document๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•œ๋‹ค.
  3. ์ˆ˜์ • ๋„๊ตฌ๋Š” ํ˜ธ์ถœ ์ฆ‰์‹œ ์ €์žฅ๋˜๋ฏ€๋กœ, ๊ฒ€ํ† ์šฉ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์›๋ณธ ๋Œ€์‹  ๋ณต์‚ฌ๋ณธ์—์„œ ์ž‘์—…ํ•œ๋‹ค.
  4. ๊ฒฐ๊ณผ๋ฌผ์„ ๋”ฐ๋กœ ๋„˜๊ฒจ์•ผ ํ•˜๋ฉด ๊ฒ€ํ† ๊ฐ€ ๋๋‚œ ๋ณต์‚ฌ๋ณธ ํŒŒ์ผ์„ handoff ๊ฒฝ๊ณ„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  5. package inspection, edit planning, validation์€ HWPX_MCP_ADVANCED=1์ผ ๋•Œ๋งŒ ์“ฐ๊ณ , ๊ธฐ๋ณธ ํ๋ฆ„๊ณผ ์„ž์–ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์งง๊ฒŒ ๋งํ•˜๋ฉด:

  • read first
  • copy before risky edits
  • mutating tools persist immediately
  • explicit handoff uses the reviewed copy
  • advanced mode๋Š” ์ ๊ฒ€/๊ฒ€์ฆ์šฉ์œผ๋กœ ๋ถ„๋ฆฌ

๋„๊ตฌ ๋™์ž‘ ๋น ๋ฅธ ๊ฐ๊ฐ

๊ตฌ๋ถ„ ๋Œ€ํ‘œ ๋„๊ตฌ ํŠน์ง•
ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ฝ๊ธฐ ์ „์šฉ get_document_info, get_document_text, get_paragraph_text, get_location_text, get_paragraphs_text, find_text, get_table_text, get_table_map, find_cell_by_label, list_styles, list_available_documents ๊ธฐ์กด .hwpx ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ํƒ์ƒ‰๋งŒ ํ•œ๋‹ค. ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ฆ‰์‹œ ์ €์žฅ ์ƒ์„ฑ/ํŽธ์ง‘ create_document, create_document_from_plan, create_proposal_document, search_and_replace, batch_replace, replace_in_paragraph, replace_by_anchor, add_heading, add_paragraph, insert_paragraph, delete_paragraph, add_table, fill_by_path, set_table_cell_text, add_page_break, add_memo, add_memo_by_anchor, remove_memo, format_text, create_custom_style, merge_table_cells, split_table_cell, format_table ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ ๊ณง ๋Œ€์ƒ ํŒŒ์ผ ๋ณ€๊ฒฝ์ด๋‹ค. ๊ฒ€ํ† ์šฉ์ด๋ฉด ๋จผ์ € ๋ณต์‚ฌ๋ณธ์—์„œ ์ž‘์—…ํ•œ๋‹ค.
์„ ์–ธํ˜• ์ƒ์„ฑ ๊ฒ€์ฆ validate_document_plan, analyze_document_plan, inspect_document_authoring_quality, inspect_operating_plan_quality, inspect_document_quality, analyze_template_formfit agent๊ฐ€ ๋งŒ๋“  hwpx.document_plan.v1, P6 baseline, ๋˜๋Š” ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. validate_document_plan, analyze_document_plan, analyze_template_formfit์€ ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
repair/recover repair_hwpx ์›๋ณธ์„ ๋ณด์กดํ•˜๊ณ  ์ƒˆ output์— mimetype-first repair-repack ๋˜๋Š” Local File Header scan ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋ณต์ œ / handoff ๊ฒฝ๊ณ„ copy_document ์›๋ณธ ๋ณดํ˜ธ์™€ reviewable working copy ๋ถ„๋ฆฌ์— ์“ด๋‹ค. ํ˜„์žฌ FastMCP surface์—๋Š” ๋ณ„๋„ public save / save_as tool์ด ์—†๋‹ค.
payload/url ๊ธฐ๋ฐ˜ ์ถ”์ถœ hwpx_to_markdown, hwpx_to_html, hwpx_extract_json ํŒŒ์ผ๋ช…์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. HWPX payload ๋˜๋Š” URL์„ ์ฝ์–ด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋งŒ ๋Œ๋ ค์ค€๋‹ค.
๊ณ ๊ธ‰ ์ ๊ฒ€/๊ฒ€์ฆ 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 HWPX_MCP_ADVANCED=1์ผ ๋•Œ๋งŒ ํ™œ์„ฑํ™”ํ•œ๋‹ค. package/๊ตฌ์กฐ ์ ๊ฒ€์šฉ์ด๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋ณธ ๋ชจ๋“œ์—์„œ 52๊ฐœ HWPX ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ณ ๊ธ‰ ๋ชจ๋“œ(HWPX_MCP_ADVANCED=1)์—์„œ๋Š” ์ ๊ฒ€ยท๊ฒ€์ฆ์šฉ ๋„๊ตฌ๊นŒ์ง€ ์ด 62๊ฐœ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

์œ„์น˜ ๊ณ„์•ฝ

paragraph_index๋Š” ๋ฌธ์„œ ๋ณธ๋ฌธ ์ง์† ๋ฌธ๋‹จ์˜ 0-based ์ธ๋ฑ์Šค๋‹ค. ํ‘œ ์•ˆ ๋ฌธ๋‹จ์€ ์ด ์ธ๋ฑ์Šค์— ์„ž์ง€ ์•Š๊ณ  location ๊ฐ์ฒด๋กœ ์ง€์ •ํ•œ๋‹ค. ํ‘œ ์…€ ๋ฌธ๋‹จ location์€ {"kind":"table_cell_paragraph","table_index":0,"row":0,"col":1,"cell_paragraph_index":0} ํ˜•ํƒœ์ด๋ฉฐ, get_table_map๊ณผ find_text๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ get_paragraph_text, get_location_text, add_memo, replace_in_paragraph์— ๊ทธ๋Œ€๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“– ์ฝ๊ธฐ ๋ฐ ํƒ์ƒ‰

๋„๊ตฌ ์„ค๋ช…
get_document_info ๋ฌธ์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์„น์…˜, ๋ฌธ๋‹จ, ํ‘œ ๊ฐœ์ˆ˜ ์กฐํšŒ
get_document_text ๋ฌธ์„œ ์ „์ฒด ํ…์ŠคํŠธ ์ถ”์ถœ (max_chars ์ง€์›)
get_document_outline ์ œ๋ชฉ๊ณผ ๊ฐœ์š” ๊ตฌ์กฐ ์ถ”์ถœ
get_paragraph_text ๋ณธ๋ฌธ ๋ฌธ๋‹จ ๋˜๋Š” location์œผ๋กœ ์ง€์ •ํ•œ ํ‘œ ์…€ ๋ฌธ๋‹จ ํ…์ŠคํŠธ ์กฐํšŒ
get_location_text get_table_map/find_text๊ฐ€ ๋ฐ˜ํ™˜ํ•œ location์œผ๋กœ ํ…์ŠคํŠธ ์กฐํšŒ
get_paragraphs_text ๋ฌธ๋‹จ ๋ฒ”์œ„ ์กฐํšŒ
list_available_documents ํด๋” ์•ˆ์˜ .hwpx ํŒŒ์ผ ๋ชฉ๋ก ์กฐํšŒ

๐Ÿ”Ž ๊ฒ€์ƒ‰ ๋ฐ ์น˜ํ™˜

find_text๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๊ณ , search_and_replace / batch_replace๋Š” ํ˜ธ์ถœ ์ฆ‰์‹œ ์ €์žฅ๋œ๋‹ค.

๋„๊ตฌ ์„ค๋ช…
find_text ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰๊ณผ ์ฃผ๋ณ€ ๋ฌธ๋งฅ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ location/anchor ๋ฐ˜ํ™˜
search_and_replace ๋‹จ์ผ ํ…์ŠคํŠธ ์น˜ํ™˜
replace_in_paragraph ๋ณธ๋ฌธ/ํ‘œ ์…€ ๋ฌธ๋‹จ ํ•˜๋‚˜์—์„œ run ์„œ์‹์„ ์œ ์ง€ํ•˜๋ฉฐ ๋ถ€๋ถ„ ์น˜ํ™˜
replace_by_anchor find_text๊ฐ€ ๋ฐ˜ํ™˜ํ•œ anchor์˜ ์ •ํ™•ํ•œ ์œ„์น˜์—์„œ ๋ถ€๋ถ„ ์น˜ํ™˜
batch_replace ์—ฌ๋Ÿฌ ์น˜ํ™˜ ์ž‘์—… ์ผ๊ด„ ์‹คํ–‰

โœ๏ธ ๋ฌธ์„œ ํŽธ์ง‘

์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋„๊ตฌ๋Š” ๋Œ€์ฒด๋กœ ๋Œ€์ƒ ํŒŒ์ผ์— ์ฆ‰์‹œ ๋ฐ˜์˜๋œ๋‹ค. ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ „์—๋Š” copy_document๋กœ ์ž‘์—…์šฉ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ , handoff๋Š” ๊ฒ€ํ† ๊ฐ€ ๋๋‚œ ๋ณต์‚ฌ๋ณธ ํŒŒ์ผ ๊ธฐ์ค€์œผ๋กœ ์žก๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.

๋„๊ตฌ ์„ค๋ช…
add_heading ์ œ๋ชฉ(ํ—ค๋”ฉ) ๋ฌธ๋‹จ ์ถ”๊ฐ€
add_paragraph / insert_paragraph / delete_paragraph ๋ฌธ๋‹จ ์ถ”๊ฐ€, ์‚ฝ์ž…, ์‚ญ์ œ
add_page_break ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ ์ถ”๊ฐ€
add_memo / add_memo_by_anchor / remove_memo ๋ณธ๋ฌธ ๋ฌธ๋‹จ ๋˜๋Š” ํ‘œ ์…€ ๋ฌธ๋‹จ์— ๋ฉ”๋ชจ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰ anchor ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ ์ถ”๊ฐ€, ์ œ๊ฑฐ

๐Ÿงพ ์„ ์–ธํ˜• ๋ฌธ์„œ ์ƒ์„ฑ

hwpx.document_plan.v1์€ agent๊ฐ€ OWPML์„ ์ง์ ‘ ๋งŒ์ง€์ง€ ์•Š๊ณ  ์ œ๋ชฉ, ๋ฌธ๋‹จ, bullet, ํ‘œ, ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ƒ์„ฑ ๊ณ„์•ฝ์ด๋‹ค.

๋„๊ตฌ ์„ค๋ช…
validate_document_plan plan์„ ๊ฒ€์ฆํ•˜๊ณ  ์ •๊ทœํ™” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŒŒ์ผ์€ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
analyze_document_plan ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š๊ณ  ์ƒ์„ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€, ์ •๊ทœํ™” plan, ์„ ํƒํ•œ ํ’ˆ์งˆ ํ”„๋กœํ•„์˜ preview๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
create_document_from_plan plan์„ HWPX๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ฆ‰์‹œ ์ €์žฅํ•œ ๋’ค reopen/package/schema ๊ฒ€์ฆ๊ณผ ํ’ˆ์งˆ ํ”„๋กœํ•„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
inspect_document_authoring_quality ์ƒ์„ฑ๋œ HWPX์˜ document-plan ํ’ˆ์งˆ ๊ทผ๊ฑฐ๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•œ๋‹ค. quality_profile="operating_plan"์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
inspect_operating_plan_quality ์šด์˜ ๊ณ„ํš์„œ ์ œ์ถœ ํ›„๋ณด์˜ ์„น์…˜, ์ผ์ •ํ‘œ, ์‚ฌ์—…๋น„ ๊ทผ๊ฑฐ, ๊ธฐ๋Œ€ ํšจ๊ณผ, ๋งˆ๊ฐ ๋ฌธ๊ตฌ, placeholder ์ž”์—ฌ๋ฌผ์„ ์ง์ ‘ ๊ฒ€์‚ฌํ•œ๋‹ค.
analyze_template_formfit P6 ๊ธฐ์ค€์„  ๊ธฐ๋ฐ˜ ์–‘์‹ ๋ณด์กด ์ƒ์„ฑ ๊ณ„ํš์„ ๋น„ํŒŒ๊ดด ๋ถ„์„ํ•œ๋‹ค.
apply_template_formfit ๋ถ„์„๋œ ๊ณ„ํš์„ ์›๋ณธ๊ณผ ๋‹ค๋ฅธ destination ๋ณต์‚ฌ๋ณธ์—๋งŒ ์ ์šฉํ•˜๊ณ  ๊ฒ€์ฆํ•œ๋‹ค.
create_proposal_document / inspect_document_quality ์ œ์•ˆ์„œ/๊ธฐํš์•ˆ ํŠนํ™” ํ˜ธํ™˜ ๊ฒฝ๋กœ

visual_review_required=true๋Š” ๊ตฌ์กฐ/ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์€ ํ†ต๊ณผํ–ˆ์ง€๋งŒ ๋ Œ๋”๋ง๋œ ์‹œ๊ฐ ๋ ˆ์ด์•„์›ƒ์€ ์•„์ง ์ฆ๋ช…๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋‹ค. ์šด์˜ ๊ณ„ํš์„œ์™€ template-formfit ๊ฒฐ๊ณผ๋ฅผ ์ตœ์ข… ์ œ์ถœ ๊ฐ€๋Šฅ(submission-ready) ์ƒํƒœ๋กœ ์ฃผ์žฅํ•˜๋ ค๋ฉด ../hwpx-skill/scripts/visual_review.py ๋˜๋Š” ComputerUse๋กœ ์—ด๋ฆฐ ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ•ด hwpx.visual-review.v1 ์ฆ๊ฑฐ๋ฅผ ๋‚จ๊ธฐ๊ณ  current.status="observed_pass"์—ฌ์•ผ ํ•œ๋‹ค. HWPX viewer๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” fallback ์ฆ๊ฑฐ๋ฅผ current.status="blocked"๋กœ ๊ธฐ๋กํ•˜๊ณ  ์ž”์—ฌ ์œ„ํ—˜์„ ์œ ์ง€ํ•œ๋‹ค.

validate_document_plan ๊ฒฐ๊ณผ๊ฐ€ ok=false์ด๋ฉด issues[].code, issues[].path, repairHints[]๋ฅผ ๋ณด๊ณ  plan์„ ์ˆ˜์ •ํ•œ ๋’ค ๋‹ค์‹œ ๊ฒ€์ฆํ•œ๋‹ค. ์ด๋•Œ can_create=false์ด๋ฏ€๋กœ create_document_from_plan์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. table ์˜ค๋ฅ˜๋Š” columns[].key์™€ rows[] key๋ฅผ ๋งž์ถ”๊ณ , style warning์€ ์ง€์› token์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ƒ๋žตํ•œ๋‹ค. ์ƒ์„ฑ ํ›„ package/schema ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด quality.validation.*.issues[]์™€ quality.recovery.repair_hints[]๋ฅผ ํ™•์ธํ•ด ์žฌ์ €์žฅ ๋˜๋Š” ์žฌ์ƒ์„ฑํ•œ๋‹ค.

์šด์˜ ๊ณ„ํš์„œ ์ž‘์„ฑ์€ ๋‹ค์Œ ์ˆœ์„œ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

  1. validate_document_plan(document_plan)์œผ๋กœ schema์™€ block/table ์˜ค๋ฅ˜๋ฅผ ๋จผ์ € ๊ณ ์นœ๋‹ค.
  2. analyze_document_plan(document_plan, quality_profile="operating_plan")์œผ๋กœ ํŒŒ์ผ ์ƒ์„ฑ ์—†์ด ํ’ˆ์งˆ preview๋ฅผ ํ™•์ธํ•œ๋‹ค.
  3. handoff_status="ready"์ด๋ฉด create_document_from_plan(filename, document_plan, quality_profile="operating_plan")์œผ๋กœ ๋ช…์‹œํ•œ ๊ฒฝ๋กœ์—๋งŒ ์ƒ์„ฑํ•œ๋‹ค.
  4. handoff_status="needs_revision"์ด๋ฉด quality.gaps[]์™€ quality.profiles.operating_plan.repair_hints[]๋ฅผ ๋ฐ˜์˜ํ•ด plan์„ ๋ณด๊ฐ•ํ•œ๋‹ค.
  5. ์ƒ์„ฑ ํ›„ get_document_text, get_table_text๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ฝ๋Š”๋‹ค.
  6. visual_review_required=true์ด๋ฉด visual_review.py ๋˜๋Š” ์—ด๋ฆฐ ๋ฌธ์„œ ๊ฒ€ํ† ๋กœ hwpx.visual-review.v1 ์ฆ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. current.status="observed_pass"๊ฐ€ ์•„๋‹ˆ๋ฉด handoff_status="ready"๋ฅผ ์ตœ์ข… ์ œ์ถœ ๊ฐ€๋Šฅ(submission-ready)์œผ๋กœ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์Šน์ธ๋œ HWPX ์–‘์‹์„ ๋ณด์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” create_document_from_plan์œผ๋กœ ์ƒˆ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๊ณ  P6 baseline ๊ธฐ๋ฐ˜ form-fit ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  1. analyze_template_formfit(source_filename, baseline, content, destination_filename)์œผ๋กœ ์›๋ณธ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”์ง€์™€ required anchor ํ•ด์†Œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  2. unresolved_count > 0์ด๋ฉด unresolved[].reason์— ๋”ฐ๋ผ content ๋˜๋Š” baseline locator๋ฅผ ๋ณด๊ฐ•ํ•œ๋‹ค.
  3. apply_template_formfit(analysis=..., confirm=true)๋กœ ์›๋ณธ๊ณผ ๋‹ค๋ฅธ destination์—๋งŒ ์ ์šฉํ•œ๋‹ค.
  4. source.preserved, validation.validate_package.ok, validation.validate_document.ok, residual_markers.blocking == []๋ฅผ ํ™•์ธํ•œ๋‹ค.
  5. visual_review_required=true์ด๋ฉด visual_review.py ๋˜๋Š” ์—ด๋ฆฐ ๋ฌธ์„œ ๊ฒ€ํ† ๋กœ hwpx.visual-review.v1 ์ฆ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. current.status="observed_pass"๊ฐ€ ์•„๋‹ˆ๋ฉด handoff_status="ready"๋ฅผ ์ตœ์ข… ์ œ์ถœ ๊ฐ€๋Šฅ(submission-ready)์œผ๋กœ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿงฏ ํŒจํ‚ค์ง€ ๋ณต๊ตฌ

repair_hwpx๋Š” ์›๋ณธ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ output ๊ฒฝ๋กœ์— ๋ณต๊ตฌ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค.

๋„๊ตฌ ์„ค๋ช…
repair_hwpx recover=false์ด๋ฉด mimetype ์ฒซ ์—”ํŠธ๋ฆฌ/ZIP_STORED ์žฌํŒจํ‚น๊ณผ CRC self-check๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. recover=true์ด๋ฉด central directory ์†์ƒ ZIP์„ Local File Header scan์œผ๋กœ ๋ณต๊ตฌํ•œ ๋’ค ์žฌํŒจํ‚นํ•œ๋‹ค.

ํ™•์ธํ•  ์‘๋‹ต ํ•„๋“œ๋Š” crcOk, validatePackage.ok, reordered, recovered, entryCount๋‹ค. ๊ธฐ๊ณ„ ๊ฒ€์ฆ ํ›„์—๋„ ์ œ์ถœยท๋‚ฉํ’ˆ ์ „์—๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด Hancom Office HWP ๋˜๋Š” viewer์—์„œ ์‹ค์ œ ์—ด๋žŒํ•œ๋‹ค.

๐Ÿ’พ ๋ณต์ œ

์ด ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ์ˆ˜์ • ์›Œํฌํ”Œ๋กœ์˜ ์•ˆ์ „ ์žฅ์น˜๋‹ค. ์›๋ณธ ๋ณดํ˜ธ์™€ reviewable working copy ๋ถ„๋ฆฌ์— ์“ด๋‹ค.

๋„๊ตฌ ์„ค๋ช…
copy_document ์›๋ณธ์„ ๊ฑด๋“œ๋ฆฌ๊ธฐ ์ „์— ์ž‘์—…์šฉ ์‚ฌ๋ณธ ์ƒ์„ฑ

๐Ÿ“Š ํ‘œ ํŽธ์ง‘

get_table_text, get_table_map, find_cell_by_label๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค. fill_by_path, set_table_cell_text, merge_table_cells, split_table_cell, format_table์€ ํ˜ธ์ถœ ์ฆ‰์‹œ ์ €์žฅ๋œ๋‹ค.

๋„๊ตฌ ์„ค๋ช…
add_table / get_table_text ํ‘œ ์ƒ์„ฑ, ์กฐํšŒ
get_table_map ํ‘œ๊ฐ€ ๋งŽ์€ ๋ฌธ์„œ์—์„œ ํ‘œ ์œ„์น˜, ํฌ๊ธฐ, caption/์ง์ „ ๋ฌธ๋‹จ ๋ฌธ๋งฅ, ์…€ ๋ฌธ๋‹จ location์„ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰
find_cell_by_label ํ•œ๊ตญ์–ด ์–‘์‹/ํ…œํ”Œ๋ฆฟ์—์„œ ๋ผ๋ฒจ ์…€ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅ ๋Œ€์ƒ ์…€ ์ฐพ๊ธฐ
fill_by_path ์„ฑ๋ช… > right, ์†Œ์† > right, ํ•ฉ๊ณ„ > down > right ๊ฐ™์€ ๊ฒฝ๋กœ ๊ตฌ๋ฌธ์œผ๋กœ ์…€ ์ฑ„์šฐ๊ธฐ
set_table_cell_text ์…€ ํ…์ŠคํŠธ ์ˆ˜์ •. ๊ธฐ๋ณธ๊ฐ’์€ ๊ธฐ์กด charPr ์„œ์‹ ๋ณด์กด์ด๋ฉฐ, split_paragraphs=true๋กœ ๋ฉ€ํ‹ฐ๋ผ์ธ์„ ์—ฌ๋Ÿฌ hp:p๋กœ ๋ถ„๋ฆฌ
merge_table_cells / split_table_cell ์…€ ๋ณ‘ํ•ฉ, ๋ถ„ํ• 
format_table ํ‘œ ํ—ค๋” ๋“ฑ ๊ธฐ๋ณธ ์„œ์‹ ์ ์šฉ

๋ณ€๊ฒฝ ๋„๊ตฌ๋Š” ํ˜ธ์ถœ ์‹œ ์ฆ‰์‹œ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€ํ† ์šฉ ์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๋ฉด copy_document๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ณ , ๋‚ฉํ’ˆ๋ณธ์€ ๊ฒ€ํ† ๊ฐ€ ๋๋‚œ ๋ณต์‚ฌ๋ณธ ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”.

๐ŸŽจ ์„œ์‹ ๋ฐ ์Šคํƒ€์ผ

list_styles๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค. format_text, create_custom_style์€ ๋ฌธ์„œ๋ฅผ ์ง์ ‘ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋„๊ตฌ ์„ค๋ช…
format_text ํ…์ŠคํŠธ ๋ฒ”์œ„ ์„œ์‹ ์ ์šฉ
create_custom_style ์ปค์Šคํ…€ ์Šคํƒ€์ผ ์ƒ์„ฑ
list_styles ๋ฌธ์„œ ์Šคํƒ€์ผ ๋ชฉ๋ก ์กฐํšŒ

์Šคํƒ€์ผ ์ฐธ์กฐ ํŒ: add_paragraph(..., style=...)์™€ insert_paragraph(..., style=...)๋Š” list_styles์˜ id, create_custom_style์ด ๋ฐ˜ํ™˜ํ•˜๋Š” style_id, ์Šคํƒ€์ผ ์ด๋ฆ„์„ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ค ์ถ”์ถœ

์ด ์นดํ…Œ๊ณ ๋ฆฌ๋Š” filename ๊ธฐ๋ฐ˜ ํŽธ์ง‘ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. HWPX payload ๋˜๋Š” URL์„ ์ฝ์–ด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋„๊ตฌ ์„ค๋ช…
hwpx_to_markdown HWPX ๋ฌธ์„œ๋ฅผ Markdown์œผ๋กœ ๋ณ€ํ™˜
hwpx_to_html HWPX ๋ฌธ์„œ๋ฅผ HTML๋กœ ๋ณ€ํ™˜
hwpx_extract_json HWPX ๋ฌธ์„œ๋ฅผ ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ์ถ”์ถœ

๐Ÿ”ฌ ๊ณ ๊ธ‰ ๋„๊ตฌ

HWPX_MCP_ADVANCED=1์ผ ๋•Œ ํ™œ์„ฑํ™”:

๋„๊ตฌ ์„ค๋ช…
package_parts OPC ํŒŒํŠธ ๋ชฉ๋ก ์กฐํšŒ
package_get_xml / package_get_text ํŒŒํŠธ XML ๋˜๋Š” ํ…์ŠคํŠธ ์กฐํšŒ
object_find_by_tag / object_find_by_attr XML ์š”์†Œ ๊ฒ€์ƒ‰
plan_edit / preview_edit / apply_edit ํŽธ์ง‘ ๊ณ„ํš, ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ ์šฉ
validate_structure / lint_text_conventions ๊ตฌ์กฐ ๊ฒ€์ฆ, ํ…์ŠคํŠธ ๊ทœ์น™ ์ ๊ฒ€

๐Ÿฉบ ์„œ๋ฒ„ ์ง„๋‹จ

๋„๊ตฌ ์„ค๋ช…
mcp_server_health transport, timeout, sandbox ๊ฒฝ๋กœ ์•ˆ๋‚ด, ๋Œ€์šฉ๋Ÿ‰ ๋ฌธ์„œ/์œ ํœด stdio/์›๊ฒฉ fetch timeout ๊ฐ™์€ disconnect ๊ฐ€๋Šฅ ์กฐ๊ฑด๊ณผ keepalive ์ ๊ฒ€ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜

<br>

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๋ณ€์ˆ˜ ์„ค๋ช… ๊ธฐ๋ณธ๊ฐ’
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
LOG_LEVEL ๋กœ๊ทธ ๋ ˆ๋ฒจ INFO

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํฌํ•จ MCP ์„ค์ • ์˜ˆ์‹œ:

{
  "mcpServers": {
    "hwpx": {
      "command": "uvx",
      "args": ["hwpx-mcp-server"],
      "env": {
        "HWPX_MCP_MAX_CHARS": "12000",
        "HWPX_MCP_AUTOBACKUP": "1",
        "HWPX_MCP_ADVANCED": "0",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

<br>

ํ…Œ์ŠคํŠธ

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

# ์ „์ฒด ํ…Œ์ŠคํŠธ
python -m pytest -q

์ถ”๊ฐ€ ์ฐธ๊ณ :

  • ์‚ฌ์šฉ ์‚ฌ๋ก€: docs/use-cases.md
  • ์ข…ํ•ฉ ๋ฆฌํฌํŠธ: tests/hwpx_mcp_report_updated.md
  • ์Šคํ‚ฌ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ: docs/skill-first-workflows.md

<br>

License

Apache License 2.0. See LICENSE and NOTICE.

<br>

์ž‘์„ฑ์ž

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

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured