DOCX MCP Server
DOCX MCP Server
Universal DOCX processing server implementing the Model Context Protocol (MCP) with full OOXML support.
Features
Full OOXML Support: Read/write all DOCX document parts (document.xml, styles, numbering, headers/footers, etc.)
Text Operations: Extract, find, and replace text with literal or regex modes
Table Editing: Insert/delete rows and columns, merge cells, set cell content
Structured Data Tags (SDT): Get/set content controls by tag or alias
Images: List images, insert inline or anchored images with position/size control
Comments & Changes: List comments, add/delete comments, accept all tracked changes
Document Properties: Read/write metadata (title, author, subject, etc.)
LRU Caching: Memory-efficient caching of document parts
Stdio Transport: MCP communication via stdin/stdout
Installation
npm install
npm run buildRunning
Development
npm run devProduction
npm startWith Claude Code
claude mcp add --scope user --transport stdio docx -- node /path/to/dist/index.jsTools
Document Management
docx.open
Open a DOCX document from file or base64
{
"docId": "uuid",
"parts": ["word/document.xml", "word/styles.xml", ...],
"partCount": 42,
"props": { "core": {...}, "app": {...} }
}docx.close
Close and unload a document
docx.save
Save document to file or return as base64
Part Management
docx.list_parts
List all parts in the document
docx.part_read
Read raw XML of a specific part
docx.part_write
Write/update XML content of a part
Text Operations
docx.get_text
Extract all text from document
{
"docId": "uuid",
"scope": "document" | "headers" | "footers" | "all"
}docx.find
Search for text with context
{
"docId": "uuid",
"query": "search term",
"mode": "literal" | "regex"
}docx.replace_text
Replace text in document
{
"docId": "uuid",
"match": "old text",
"replace": "new text",
"mode": "literal" | "regex"
}Tables
docx.tables_list
List all tables with dimensions
{
"tables": [
{
"xpath": "/w:document/w:body/w:tbl[1]",
"rows": 3,
"colsApprox": 4
}
]
}docx.table_edit
Modify table structure and content
{
"docId": "uuid",
"tableXPath": "/w:document/w:body/w:tbl[1]",
"op": {
"kind": "setCellText",
"row": 0,
"col": 1,
"text": "new value"
}
}Operations:
setCellText(row, col, text)- Set cell contentinsertRow(at)- Insert row at positiondeleteRow(at)- Delete rowinsertCol(at)- Insert columndeleteCol(at)- Delete column
Structured Data (SDT)
docx.sdt_get
Get content control content by tag or alias
docx.sdt_put
Update content control
Images
docx.images_list
List all images with metadata
docx.image_add
Insert image inline or anchored
Styles & Numbering
docx.styles_get / docx.styles_set
Read/write styles.xml
docx.numbering_get / docx.numbering_set
Read/write numbering.xml
Headers/Footers
docx.headers_footers_list
List all header/footer parts
Comments
docx.comments_list
List all comments
docx.comments_add
Add new comment
docx.changes_accept_all
Accept all tracked changes in document
Metadata
docx.metadata_get
Get document properties (title, author, created, modified, etc.)
Test Scenarios
1. Basic Read/Write
# Open document
docx.open: { "path": "/path/to/document.docx" }
# Get text
docx.get_text: { "docId": "returned-id" }
# Replace text
docx.replace_text: {
"docId": "returned-id",
"match": "old text",
"replace": "new text"
}
# Save
docx.save: { "docId": "returned-id", "returnBase64": true }2. Table Manipulation
# List tables
docx.tables_list: { "docId": "id" }
# Edit cell
docx.table_edit: {
"docId": "id",
"tableXPath": "/w:document/w:body/w:tbl[1]",
"op": { "kind": "setCellText", "row": 0, "col": 0, "text": "Hello" }
}3. Images
# List images
docx.images_list: { "docId": "id" }4. Track Changes
# Accept all changes
docx.changes_accept_all: { "docId": "id" }Architecture
src/
index.ts # Entry point
errors.ts # Error definitions
logger.ts # Logging utilities
ooxml/
namespaces.ts # XML namespace definitions
emu.ts # EMU conversion utilities
dom.ts # XML DOM utilities (xmldom + fontoxpath)
xmlParser.ts # fast-xml-parser wrapper
parts.ts # DOCX ZIP part management
rels.ts # Relationships management
text.ts # Text extraction & replacement
tables.ts # Table operations
sdt.ts # Structured Data Tags
drawings.ts # Images & DrawingML
headersFooters.ts # Headers/Footers
styles.ts # Style operations
numbering.ts # Numbering operations
changes.ts # Track changes
comments.ts # Comments
store/
types.ts # Type definitions
docStore.ts # Document store + LRU cache
mcp/
schemas.ts # Tool input schemas
tools.ts # Tool implementations
server.ts # MCP server setupDependencies
@modelcontextprotocol/sdk- MCP implementationjszip- ZIP archive handlingfast-xml-parser- Lossless XML parsing@xmldom/xmldom- DOM implementationfontoxpath- XPath queriesdiff-match-patch- Text diffinglru-cache- Memory-efficient cachinguuid- Document ID generation
Performance Notes
Documents up to 10 MB supported
LRU cache with 100-part limit and 1 GB memory cap
Parts loaded on-demand, not fully into memory
Dirty-part optimization: only modified parts saved to ZIP
No deep copying of XML structures
Limitations
Headers/footers: basic support (complex section structures may need manual adjustment)
Comments: basic list/add/delete (reply chains not fully supported)
Track changes: accept-all available; detailed change inspection limited
Styles: get/set full XML; no selective style merging
EMU/sizing: calculated but rendered geometry depends on Word's layout engine
License
MIT