DOCX MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DOCX MCP Server Open report.docx and replace all occurrences of 'draft' with 'final'."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Related MCP server: InkPaw
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
Available Tools
34 toolsdocx.changes_accept_allC
Accept all tracked changes
Inputs: docId (required).
docx.closeC
Close a DOCX document
Inputs: docId (required).
docx.comments_addC
Add a comment
Inputs: text (required), docId (required), author.
docx.comments_deleteC
Delete a comment
Inputs: id (required), docId (required).
docx.comments_listC
List comments
Inputs: docId (required).
docx.copyB
Copy document to new file and open it
Inputs: targetPath (required), sourceDocId (required).
docx.findD
Find text in document
Inputs: docId (required), query (required), mode.
docx.find_empty_table_rowsA
Find all empty rows in tables for MANUAL analysis
Inputs: docId (required).
docx.fix_paragraph_rtlA
Fix RTL direction of paragraph - USE ONLY after manual check
Inputs: docId (required), setLTR (required), paragraphIndex (required).
docx.get_table_contentB
Get content of specific table - all rows with text and empty status
Inputs: docId (required), tableIndex (required).
docx.get_textC
Extract all text
Inputs: docId (required), scope.
docx.images_listC
List all images
Inputs: docId (required).
docx.list_partsC
List document parts
Inputs: docId (required).
docx.metadata_getC
Get document metadata
Inputs: docId (required).
docx.numbering_getC
Get numbering
Inputs: docId (required).
docx.numbering_setD
Set numbering
Inputs: xml (required), docId (required).
docx.openC
Open a DOCX document
Inputs: path, bufferBase64.
docx.part_readC
Read a document part
Inputs: docId (required), partPath (required).
docx.part_writeD
Write a document part
Inputs: xml (required), docId (required), partPath (required).
docx.read_paragraph_rangeC
Read range of paragraphs with formatting info (RTL, style, alignment)
Inputs: count (required), docId (required), startIndex (required).
docx.remove_table_rowC
Remove specific table row by coordinates - USE ONLY after manual analysis
Inputs: docId (required), rowIndex (required), tableIndex (required).
docx.replace_textC
Replace text in document
Inputs: docId (required), match (required), replace (required), mode, +1 more.
docx.saveC
Save a DOCX document
Inputs: docId (required), path, returnBase64.
docx.sdt_getC
Get SDT content
Inputs: docId (required), tagOrAlias (required).
docx.sdt_putD
Set SDT content
Inputs: docId (required), tagOrAlias (required), xmlFragment (required).
docx.styles_getC
Get document styles
Inputs: docId (required).
docx.styles_setD
Set document styles
Inputs: xml (required), docId (required).
docx.table_editC
Edit table content
Inputs: op (required), docId (required), tableXPath (required).
docx.tables_listC
List all tables
Inputs: docId (required).
docx.text_find_locationsA
Find text and return exact coordinates of all occurrences - LLM can see where to edit
Inputs: docId (required), searchText (required), caseSensitive.
docx.text_run_replaceB
Replace text in SPECIFIC run by coordinates (paragraph/run/textNode indices) - precise word-level editing
Inputs: docId (required), newText (required), runIndex (required), textNodeIndex (required), +1 more.
docx.text_runs_analyzeB
Analyze ALL text runs (each <w:t> element) - LLM SEES every word/phrase with formatting
Inputs: docId (required).
docx.validate_structureC
Validate document structure and detect corruption
Inputs: docId (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 34 tools
Many tools have distinct targets, but there is meaningful overlap between find and text_find_locations, get_text and text_runs_analyze, and find_empty_table_rows and get_table_content. The descriptions help clarify intent, but an agent could easily select the wrong tool for text or table inspection tasks.
All tools share the docx. prefix, which helps, but the naming pattern is inconsistent: some are verb_noun (list_parts, get_text), some are noun_verb (metadata_get, tables_list), and a few are bare verbs (open, save, find). Synonyms like get/list/read and set/put/write are also mixed.
With 34 tools, this exceeds the 25+ threshold and feels heavy. Several tools are highly granular and could be consolidated, such as find_empty_table_rows versus get_table_content, or find versus text_find_locations, without sacrificing clarity.
The server covers a wide range of DOCX operations: text, tables, comments, styles, headers/footers, SDT content, and validation. However, obvious gaps remain, including no create-from-scratch operation, no paragraph insertion, no table creation, and no image insertion or replacement.
Maintenance
Related MCP Connectors
Document processing over MCP: merge, split and compress PDFs, run OCR, extract document text.
Parse, convert and create Office and PDF documents. OAuth at /mcp/connect/, API key at /mcp/.
Generate PDF, Word (.docx) and PowerPoint (.pptx) documents from Markdown over MCP.
Generate, edit, merge, translate and PDF-convert PowerPoint (.pptx) over MCP. 8 tools.
Related MCP Servers
- AlicenseDqualityDmaintenanceEnables reading, writing, editing, and converting Office documents (ODT, DOCX, ODS, XLSX, PDF, etc.) using MCP tools, with no external dependencies.1111 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to generate, edit, validate, and render Word documents programmatically via MCP, ensuring correct OOXML structure and style.3MIT
- AlicenseBqualityCmaintenanceProvides MCP tools for working with Microsoft Word documents, enabling reading, editing with tracked changes, formatting, table manipulation, comments, and PDF conversion via direct OOXML manipulation.37MIT
- AlicenseCqualityDmaintenanceEnables programmatic processing of DOCX/OOXML files through MCP, covering text, tables, images, headers/footers, structured data tags, comments, and track changes.2958 npmMIT