hwp-mcp
Claude Β· Cursor Β· ChatGPT λ± MCP νΈν AIμμ νκΈ λ¬Έμ(.hwp / .hwpx) λ₯Ό μ½κ³ μμ νκ³ μλ‘ λ§λ€ μ μκ² ν΄μ£Όλ μλ²μ
λλ€.

hwp-mcpμ νμ»΄μ€νΌμ€ λ¬Έμλ₯Ό AI μμ΄μ νΈκ° μ§μ λ€λ£¨λλ‘ ν΄μ£Όλ MCP(Model Context Protocol) μλ²μ
λλ€. μ½κΈ°λΏ μλλΌ ν
μ€νΈ μμ , ν
νλ¦Ώ μ±μ°κΈ°, μ λ¬Έμ μμ±κΉμ§ κ°λ₯ν©λλ€.
π λ§₯μμλ λ©λλ€. κΈ°μ‘΄ HWP μλν λꡬ λλΆλΆμ νμ»΄μ€νΌμ€ COM API κΈ°λ°μ΄λΌ Windows μ μ©μ΄μ§λ§, hwp-mcpλ WebAssembly μμ§μ΄λΌ macOS(Apple Silicon ν¬ν¨) Β· Windows Β· Linux μ΄λμλ νμ»΄μ€νΌμ€ μ€μΉ μμ΄ λμν©λλ€.
π’ νμ¬ μ μ²΄κ° κ°μ΄ μ°λ €λ©΄: κ°μ νμ΄ λ§λ Trina AXλ νμ¬ μλ²μμ Claude Codeλ₯Ό λ리λ μ€νμμ€ μ
무 곡κ°μ
λλ€. ν ν΄λμ HWP/HWPXΒ·PDFΒ·Office λ¬Έμμ ν μ€ν¬, MCP μλ²λ₯Ό μ§μ λͺ¨λκ° κ°μ ν΄λ κΆν μμμ ν¨κ» μλλ€.
μ΄λ€ νλ‘μ νΈμΈκ°μ?
μ΄ νλ‘μ νΈλ λ λΆλΆμΌλ‘ λλ©λλ€.
-
π§ ν΅μ¬ μμ§: rhwp β Edward Kim λμ rhwpλ νκΈ ν¬λ§·(HWP 5.0 binary, HWPX/OWPML)μ Rust + WebAssemblyλ‘ κ΅¬νν μ€νμμ€ μμ§μ
λλ€. νμ±, νΒ·μ΄λ―Έμ§Β·μμΒ·λ¨Έλ¦¬λ§ μΆμΆ, SVG λ λλ§, νμ»΄ νΈν Field API λ± ν¬λ§· μ²λ¦¬ λ₯λ ₯μ μ 곡ν©λλ€.
-
π€ hwp-mcp κ° ν μΌ (μμ΄μ νΈ μ΄λν°) β @rhwp/core μμ μΉμ MCP μλ² layer. μ°λ¦¬κ° μΆκ°ν κ²μ:
read_hwp, fill_hwp_template, replace_hwp_text κ°μ μμ΄μ νΈ μΉνμ λꡬ μκ·Έλμ² β Claude/Cursor κ°μ LLMμ΄ μμ°μ΄λ‘ νΈμΆν μ μκ²
- λ³Έλ¬ΈΒ·νΒ·μ΄λ―Έμ§Β·λ¨Έλ¦¬λ§Β·κΌ¬λ¦¬λ§Β·κ°μ£ΌΒ·μμμ ν λ²μ dump νλ μλλ¦¬μ€ μ€μ¬ traversal walker
- ν μ
λ³ν© μλ μ²λ¦¬, footnote/equation μλ ν©λ³Έ κ°μ μ¬μ© νΈμ layer
- rhwp 0.7.7 μ
exportHwpx λΌμ΄λνΈλ¦½ νκ³λ₯Ό μ°ννκΈ° μν .hwpx ZIP-level mutation layer (μ€μ μ°κΈ°λ₯Ό κ°λ₯νκ² νλ ν΅μ¬)
- npm
hwp-mcp ν¨ν€μ§ (ν μ€ μ€μΉ) + Node.js WASM λΆνΈμ€νΈλ©
μμ½: AI μμ΄μ νΈκ° νκΈ λ¬Έμλ₯Ό μ½κ³ μΈ μ μκ² ν΄μ£Όλ μ΄λν°μ
λλ€. ν¬λ§· μ²λ¦¬λ rhwp, μμ΄μ νΈ μ°λμ hwp-mcp κ° λ΄λΉν©λλ€.
μ€μΉ
Claude Code
claude mcp add hwp-mcp -- npx -y hwp-mcp
Claude Desktop / Cursor / VS Code (settings JSON)
{
"mcpServers": {
"hwp-mcp": {
"command": "npx",
"args": ["-y", "hwp-mcp"]
}
}
}
Node.js 20 μ΄μ νμ. macOS Β· Windows Β· Linux λͺ¨λ μ§μ β μμ§μ΄ WebAssembly κΈ°λ°μ΄λΌ νμ»΄μ€νΌμ€ μ€μΉ μμ΄ OS 무κ΄νκ² λμν©λλ€. pywin32Β·COM μλνμ²λΌ Windowsμ λ¬Άμ΄μ§ μμ λ§₯λΆμμλ μ ν μ€λ‘ λμ
λλ€.
μ€μΉ νμΈ
claude mcp list | grep hwp-mcp
# hwp-mcp: npx -y hwp-mcp - β Connected
β Connected κ° λ¨λ©΄ λ.
μ²μ μ¨λ³΄κΈ° (60μ΄)
μ€μΉ μ§ν λμ νμΈμ© κ°μ₯ μ§§μ κ²μ¦:
λ: μ hwpx λ¬Έμ λ§λ€μ΄μ€. νμΌ μ΄λ¦μ hello.hwpx μ΄κ³ "μλ
νκΈ" ν μ€λ§ λ€μ΄κ°κ².
AI: HWPX λ¬Έμ μμ± μλ£ (created): hello.hwpx
λ: hello.hwpx μ½μ΄μ€.
AI: # hello.hwpx
μλ
νκΈ
μ λ λ¨κ³κ° λλ©΄ μ½κΈ°Β·μ°κΈ° μμͺ½ λ€ λμν©λλ€. μ΄μ μ€μ λ¬Έμλ‘:
~/Downloads/κ³΅κ³ λ¬Έ.hwp μ½μ΄μ€
report.hwpx μ {{μ΄λ¦}}μ λ¨λνμΌλ‘, {{λ μ§}}λ₯Ό 2026-05-26μΌλ‘ μ±μμ€
document.hwpx μ 첫 νμ΄μ§λ₯Ό SVGλ‘ λ³΄μ¬μ€
μ λλ©΄?
| μ¦μ | μμΈ / ν΄κ²° |
|---|
β Failed to connect | v0.2.0 bin symlink λ²κ·Έ β v0.2.1 μ΄μμΌλ‘ μ
κ·Έλ μ΄λ (μλ) |
μ€μΉλ λλλ° mcp__hwp-mcp__* λκ΅¬κ° μ 보μ | Claude Code / Cursor μΈμ
μ¬μμ νμ (MCP λꡬλ μΈμ
μμ μμ μ λ‘λλ¨) |
npx: command not found λλ ESM μλ¬ | Node 20+ μΈμ§ νμΈ: node --version. Node 18 μ EOL β nvm install 20 λλ 곡μ μ€μΉ |
npx κ° μ λ²μ μ μΊμ | claude mcp add hwp-mcp -- npx -y hwp-mcp@latest (@latest λͺ
μ) λλ npm cache clean --force |
| Claude Desktop / Cursor μμ μ 보μ | μ€μ JSON μ μ₯ ν μ± μμ μ’
λ£ + μ¬μ€ν (λ°±κ·ΈλΌμ΄λ νΈλ μ΄λ μ’
λ£) |
v0.2.0 β v0.2.1 μ
κ·Έλ μ΄λ:
claude mcp remove hwp-mcp
claude mcp add hwp-mcp -- npx -y hwp-mcp@latest
claude mcp list | grep hwp-mcp # β Connected
μ€μ νμΌ λ°©μ(Claude Desktop/Cursor)μ΄λ©΄ args λ₯Ό ["-y", "hwp-mcp@latest"] λ‘:
{
"mcpServers": {
"hwp-mcp": {
"command": "npx",
"args": ["-y", "hwp-mcp@latest"]
}
}
}
μ¬μ ν μ λλ©΄: Issues μ node --version, claude mcp list μΆλ ₯, μ€ν OS μ μ΄μ μλ €μ£ΌμΈμ.
λꡬ λͺ©λ‘
hwp-mcp v0.3μ΄ λ
ΈμΆνλ 35κ° MCP λꡬμ
λλ€. μ½κΈ°Β·λ λλ .hwp/.hwpx λͺ¨λ μ§μ, μ°κΈ°λ .hwpx μ μ©μ
λλ€.
μ½κΈ° / λ³ν (6)
| λꡬ | .hwp | .hwpx | μ€λͺ
|
|---|
read_hwp | β
| β
| λ³Έλ¬Έ + ν(λ§ν¬λ€μ΄) + μ΄λ―Έμ§ λͺ©λ‘ ν λ²μ |
read_hwp_text | β
| β
| λ³Έλ¬Έ + λ¨Έλ¦¬λ§ + κΌ¬λ¦¬λ§ + κ°μ£Ό + μμ ν΅ν© ν
μ€νΈ |
read_hwp_tables | β
| β
| νλ₯Ό GitHub λ§ν¬λ€μ΄μΌλ‘ (μ
λ³ν© μ²λ¦¬) |
convert_hwp_markdown | β
| β
| λ¬Έμ β Markdown λ³ν (λ¬Έμ μμ μ μ§, ν GFM μ μ리, μ΄λ―Έμ§ μΆμΆ+μλλ§ν¬, μμ $β¦$, κ°μ£Ό λ¬Έμ λ) |
list_hwp_images | β
| β
| μλ² λλ μ΄λ―Έμ§ λͺ©λ‘ (mime, λ°μ΄νΈ) |
extract_hwp_images | β
| β
| μ΄λ―Έμ§λ₯Ό λμ€ν¬λ‘ μΆμΆ |
λ©ν / μ‘°ν (5)
| λꡬ | .hwp | .hwpx | μ€λͺ
|
|---|
get_hwp_info | β
| β
| λ²μ Β·νμ΄μ§Β·κΈκΌ΄Β·ν/μ΄λ―Έμ§/κ°μ£Ό/μμ ν΅κ³ |
get_hwp_page_def | β
| β
| μΉμ
λ³ μ©μ§ ν¬κΈ°Β·μ¬λ°±Β·λ¨Β·ν€λ/νΈν° λ§μ§ |
list_hwp_fields | β
| β
| νμ»΄ νλ λͺ©λ‘ |
get_hwp_field_value | β
| β
| νλ κ° μ‘°ν |
list_hwp_bindata | β | β
| .hwpx BinData/ μνΈλ¦¬ λͺ©λ‘ |
μκ° λ λ (4)
| λꡬ | .hwp | .hwpx | μ€λͺ
|
|---|
render_hwp_page | β
| β
| νΉμ νμ΄μ§ β SVG (μΈλΌμΈ/νμΌ) |
render_hwp_all_pages | β
| β
| μ 체 νμ΄μ§ SVG μΌκ΄ |
render_hwp_html | β
| β
| νμ΄μ§ β HTML |
render_hwp_equation_svg | β | β | OWPML μμ script β SVG |
μ°κΈ° β ν
μ€νΈ (5)
| λꡬ | .hwpx | μ€λͺ
|
|---|
replace_hwp_text | β
| νΉμ λ¬Έμμ΄ μ°Ύμ λ°κΎΈκΈ° |
fill_hwp_template | β
| {{μ΄λ¦}} λ± λ€μ€ μ리νμμ |
set_hwp_paragraph_text | β
| Nλ²μ§Έ λ¬Έλ¨ ν
μ€νΈ ν΅μ§Έ κ΅μ²΄ |
set_hwp_cell_text | β
| ν μ
(ν, μ΄) ν
μ€νΈ μ§μ μ€μ |
set_hwp_field_value | β
| νλ κ° μ€μ |
μ°κΈ° β ꡬ쑰 (9)
| λꡬ | .hwpx | μ€λͺ
|
|---|
append_hwp_paragraph | β
| λ³Έλ¬Έ λμ μ λ¬Έλ¨ |
delete_hwp_paragraph | β
| Nλ²μ§Έ λ¬Έλ¨ μμ |
append_hwp_table_row | β
| ν λ§μ§λ§μ μ ν |
delete_hwp_table_row | β
| ν ν μμ |
append_hwp_table_column | β
| ν λμ μ μ΄ (λͺ¨λ νμ) |
delete_hwp_table_column | β
| ν μ΄ μμ |
merge_hwp_cells_horizontal | β
| κ°λ‘ μ
λ³ν© (colSpan) |
merge_hwp_cells_vertical | β
| μΈλ‘ μ
λ³ν© (rowSpan) |
replace_hwp_image | β
| μλ² λλ μ΄λ―Έμ§ κ΅μ²΄ |
μ°κΈ° β μμ (2)
| λꡬ | .hwpx | μ€λͺ
|
|---|
apply_hwp_text_style | β
| κΈμ μΒ·λ³ΌλΒ·μ΄ν€λ¦Β·λ°μ€Β·ν¬κΈ° (charPr μΆκ°) |
apply_hwp_paragraph_style | β
| λ¬Έλ¨ μ λ ¬Β·λ€μ¬μ°κΈ°Β·μ€κ°κ²© (paraPr μΆκ°) |
μ°κΈ° β μ΄λ―Έμ§ / ν / μ κ· (4)
| λꡬ | .hwpx | μ€λͺ
|
|---|
insert_hwp_image | β
| μ μ΄λ―Έμ§ μΆκ° (BinData + manifest + <hp:pic>) |
delete_hwp_image | β
| BinData/ μνΈλ¦¬ μμ |
insert_hwp_table | β οΈ | μ OWPML ν μ½μ
(μ€νμ β νμΌ valid, rhwp μΈμ λΉμμ ) |
create_hwpx_document | β
| ν
μ€νΈλ‘ μ .hwpx λ§λ€κΈ° |
컨ν
μΈ μΆμΆ λ§€νΈλ¦μ€
| 컨ν
μΈ | μΆμΆ | λΉκ³ |
|---|
| λ³Έλ¬Έ λ¬Έλ¨ ν
μ€νΈ | β
| read_hwp_text, read_hwp |
| ν (μ
λ³ν© ν¬ν¨) | β
| read_hwp_tables κ° markdown μΌλ‘ |
| μλ² λλ μ΄λ―Έμ§ | β
| PNG/JPG/BMP λ± μΆμΆ |
| λ¨Έλ¦¬λ§ / κΌ¬λ¦¬λ§ | β
| read_hwp_text κ²°κ³Όμ --- headers --- / --- footers --- λΈλ‘ |
| κ°μ£Ό(footnote) | β
| κ²°κ³Ό λμ --- footnotes --- λΈλ‘, [1] λ³Έλ¬Έβ¦ νν |
| μμ(equation) | β
| OWPML script νν (μ: TIMES LEFT ( {a} over {b} RIGHT )), --- equations --- λΈλ‘ |
| νμ΄μ§ SVG λ λ | β
| render_hwp_page |
| ν
μ€νΈλ°μ€ λ³Έλ¬Έ | β | rhwpμ createShapeControlμ λ§λ€μ§λ§ getTextBoxControlIndex λ°ν ν¨ν΄μ΄ λΉλͺ
μμ β v0.3μμ trace |
| λ―Έμ£Ό(endnote) | β | rhwp μ체 λ―Έμ§μ (footnoteλ§) |
| μ°¨νΈ(chart) | β | v0.3 μ΄ν |
μμ± λ§€νΈλ¦μ€
| μμ
| .hwp | .hwpx | λΉκ³ |
|---|
| ν
μ€νΈ λ¨μΌ μΉν | β | β
| replace_hwp_text |
| λ€μ€ μ리νμμ μ±μ°κΈ° | β | β
| fill_hwp_template |
| λ¬Έλ¨ ν
μ€νΈ ν΅μ§Έ κ΅μ²΄ | β | β
| set_hwp_paragraph_text |
| ν μ
μ§μ μμ | β | β
| set_hwp_cell_text (νΒ·μ΄ μ§μ ) |
| νλ κ° μ€μ | β | β
| set_hwp_field_value |
| μ λ¬Έλ¨ μΆκ° / μμ | β | β
| append_hwp_paragraph / delete_hwp_paragraph |
| ν ν μΆκ° / μμ | β | β
| append_hwp_table_row / delete_hwp_table_row |
| μ΄λ―Έμ§ κ΅μ²΄ / μμ | β | β
| replace_hwp_image / delete_hwp_image |
| μ λ¬Έμ μμ± (ν
μ€νΈ) | β | β
| create_hwpx_document |
| μ λ¬Έμ μμ± (ν) | β | β οΈ | ν
μ€νΈ νμΌλ‘ ννν (v0.3μμ μ§μ§ OWPML ν) |
| μ μ΄λ―Έμ§ μ½μ
| β | β
| insert_hwp_image |
| ν μ΄ μΆκ° / μμ | β | β
| append_hwp_table_column / delete_hwp_table_column |
| μ
λ³ν© (κ°λ‘Β·μΈλ‘) | β | β
| merge_hwp_cells_horizontal / merge_hwp_cells_vertical |
| κΈμ μμ (μΒ·λ³ΌλΒ·μ΄ν€λ¦Β·λ°μ€Β·ν¬κΈ°) | β | β
| apply_hwp_text_style |
| λ¬Έλ¨ μμ (μ λ ¬Β·λ€μ¬μ°κΈ°Β·μ€κ°κ²©) | β | β
| apply_hwp_paragraph_style |
| μ ν μ½μ
(μ§μ§ OWPML) | β | β οΈ | insert_hwp_table (μ€νμ ) |
| 머리λ§/κΌ¬λ¦¬λ§ μ κ· μ½μ
| β | β | v0.3 |
| μ°¨νΈΒ·λΆλ§ν¬Β·μ€νμΌ μ μ | β | β | v0.3 |
.hwp λ°μ΄λ리 μ°κΈ°λ rhwp 0.7.7 μ exportHwp λΌμ΄λνΈλ¦½ νκ³λ‘ v0.2μμ λ―Έμ§μ. νμ»΄μ€νΌμ€μμ .hwpxλ‘ λ€λ₯Έ μ΄λ¦ μ μ₯ ν μ°κΈ° λꡬλ₯Ό μ¬μ©νμκ±°λ, v0.3 릴리μ€λ₯Ό κΈ°λ€λ €μ£ΌμΈμ.
μ¬μ© μμ
μ λΆ νκΈ λ¬Έμ μ½κΈ°
λ: /Users/me/2026λ
_μνκ³ν.hwpx μ½μ΄μ€
AI: # 2026λ
_μνκ³ν.hwpx
νμ: .HWPX | λ¬Έλ¨: 153κ° | ν: 15κ° | μ΄λ―Έμ§: 2κ°
β
. μΆμ§ λ°°κ²½
β‘ (κΈλ‘λ² νν©) μ μΈκ³ AI μ루μ
μμ₯ κ·λͺ¨λ ...
### ν 9 (7ν x 4μ΄)
| λλ©μΈ | μ
λ ₯ λ°μ΄ν° | νμ΅ λ΄μ© | μ°μ
AI μ루μ
μ μ© κΈ°λ₯ μμ |
| --- | --- | --- | --- |
| κΈ°κ³ | Β· μΌμ λ°μ΄ν° λ‘κ·Έ ... | ... | ... |
ν
νλ¦Ώ μ±μ°κΈ°
λ: /path/to/form.hwpx μμ {{μ΄λ¦}}=λ¨λν, {{νμ¬}}=ν¬ν
λ© μΌλ‘ μ±μμ€
AI: μ μ₯ μλ£ (saved): form_filled.hwpx
μ΄ 2건 μΉν (2 replacements)
'{{μ΄λ¦}}' β 1건
'{{νμ¬}}' β 1건
ν
μ€νΈ μΉν
λ: /path/to/doc.hwpx μ "μ°μ
AI" λ₯Ό "μ°μ
-AI" λ‘ λ°κΏμ€
AI: 'μ°μ
AI' β 'μ°μ
-AI': 18건 κ΅μ²΄ (replaced 18)
μ μ₯ (saved): doc_modified.hwpx
μ .hwpx λ§λ€κΈ°
λ: employees.hwpx μ "μ¬μ λͺ
λΆ" μ "λ λ²μ§Έ μ€" λ μ€μ κ°μ§ λ¬Έμ λ§λ€μ΄μ€
AI: HWPX λ¬Έμ μμ± μλ£ (created): employees.hwpx
μ΄λ―Έμ§ μΆμΆ
λ: /path/to/document.hwpx μμ μ΄λ―Έμ§ λΉΌμ€
AI: μ΄λ―Έμ§ 2κ°λ₯Ό μΆμΆνμ΅λλ€ (extracted 2 images):
μ μ₯ μμΉ: /path/to/document_images
- image_001.bmp
- image_002.bmp
νμ΄μ§λ₯Ό SVGλ‘ λ λ (μκ° λΆμμ©)
λ: /path/to/document.hwpx μ 첫 νμ΄μ§λ₯Ό SVGλ‘ λ³΄μ¬μ€
AI: <svg xmlns="..." width="793" height="1122" viewBox="...">
<defs>...</defs>
...
</svg>
λλ λμ€ν¬λ‘ μ μ₯:
λ: /path/to/document.hwpx λͺ¨λ νμ΄μ§ SVGλ‘ μ μ₯ν΄μ€
AI: 9/9 νμ΄μ§ SVG μ μ₯ (rendered 9/9 pages):
μ μ₯ μμΉ: /path/to/document_pages
- page_001.svg
- page_002.svg ...
νκ³
hwp-mcp v0.2μ μλ €μ§ μ μ½ μ¬νμ
λλ€.