Skip to main content
Glama
DOCX MCP Server

DOCX MCP Server

by Mavline

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 build

Running

Development

npm run dev

Production

npm start

With Claude Code

claude mcp add --scope user --transport stdio docx -- node /path/to/dist/index.js

Tools

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 content

  • insertRow(at) - Insert row at position

  • deleteRow(at) - Delete row

  • insertCol(at) - Insert column

  • deleteCol(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 setup

Dependencies

  • @modelcontextprotocol/sdk - MCP implementation

  • jszip - ZIP archive handling

  • fast-xml-parser - Lossless XML parsing

  • @xmldom/xmldom - DOM implementation

  • fontoxpath - XPath queries

  • diff-match-patch - Text diffing

  • lru-cache - Memory-efficient caching

  • uuid - 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 tools
docx.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.headers_footers_listA

List headers and footers

Inputs: docId (required).

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

    C2.4/5.0

    Scored across 34 tools

    Disambiguation3/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      D
      quality
      D
      maintenance
      Enables reading, writing, editing, and converting Office documents (ODT, DOCX, ODS, XLSX, PDF, etc.) using MCP tools, with no external dependencies.
      11
      11 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to generate, edit, validate, and render Word documents programmatically via MCP, ensuring correct OOXML structure and style.
      3
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Provides 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.
      37
      MIT
    • A
      license
      C
      quality
      D
      maintenance
      Enables programmatic processing of DOCX/OOXML files through MCP, covering text, tables, images, headers/footers, structured data tags, comments, and track changes.
      29
      58 npm
      MIT