docx-comments
by kosh-jelly
README.md
# docx-comments-mcp
An MCP server for Claude Desktop that provides comprehensive read/write access to Word documents, including comments, track changes, and reply threads — features that `python-docx` doesn't fully expose.
<!-- mcp-name: io.github.kosh-jelly/docx-comments -->
## Features
- **Read documents**: Extract text, comments (with reply threads), and track changes
- **Add comments**: Anchor comments to specific text in the document
- **Reply to comments**: Create threaded replies on existing comments
- **Track changes**: Make edits with insertions and deletions tracked
- **Resolve comments**: Mark comments as done
- **Accept/reject changes**: Apply or undo tracked changes
## Installation
```bash
# Clone the repository
git clone https://github.com/your-username/docx-comments-mcp.git
cd docx-comments-mcp
# Install with uv
uv sync
```
## Usage with Claude Desktop
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"docx-comments": {
"command": "uv",
"args": ["--directory", "/path/to/docx-comments-mcp", "run", "docx-comments-mcp"]
}
}
}
```
## Available Tools
### `read_document`
Read a Word document and extract content, comments, and track changes.
**Parameters:**
- `path` (required): Path to the .docx file
- `include_text` (default: true): Include full document text
- `include_comments` (default: true): Include comments with anchors
- `include_track_changes` (default: true): Include insertions/deletions
**Returns:**
```json
{
"metadata": {
"path": "/path/to/file.docx",
"author": "Original Author",
"created": "2025-01-15T10:30:00Z",
"modified": "2025-01-18T14:22:00Z",
"word_count": 4523
},
"paragraphs": [
{"index": 0, "text": "The paragraph content...", "style": "Heading 1"}
],
"comments": [
{
"id": 0,
"author": "Dr. Smith",
"date": "2025-01-16T09:15:00Z",
"text": "Consider citing Main & Hesse here",
"anchor_text": "disorganized attachment patterns",
"anchor_paragraph": 12,
"resolved": false,
"replies": [
{
"id": 1,
"parent_id": 0,
"author": "Josh",
"date": "2025-01-17T11:00:00Z",
"text": "Added citation — see revision"
}
]
}
],
"track_changes": [
{
"id": 5,
"type": "deletion",
"author": "Dr. Smith",
"date": "2025-01-16T09:20:00Z",
"text": "invariably",
"paragraph": 8
}
]
}
```
### `create_comment`
Add a comment anchored to specific text in a Word document.
**Parameters:**
- `path` (required): Path to the .docx file
- `anchor_text` (required): Text to anchor the comment to (must exist and be unique)
- `comment_text` (required): The comment content
- `author` (default: "Claude"): Comment author name
- `output_path` (optional): Save to new file; if omitted, creates timestamped backup and overwrites
**Returns:**
```json
{
"success": true,
"comment_id": 3,
"anchored_to": "the exact text that was matched",
"paragraph": 15,
"output_path": "/path/to/output.docx"
}
```
### `create_reply`
Add a reply to an existing comment.
**Parameters:**
- `path` (required): Path to the .docx file
- `parent_comment_id` (required): ID of comment to reply to
- `reply_text` (required): The reply content
- `author` (default: "Claude"): Reply author name
- `output_path` (optional): Save to new file; if omitted, creates backup
### `create_track_change`
Make an edit with track changes enabled (insertion, deletion, or replacement).
**Parameters:**
- `path` (required): Path to the .docx file
- `find_text` (required): Text to find and modify
- `replace_with` (required): Replacement text (empty string for deletion)
- `author` (default: "Claude"): Change author name
- `output_path` (optional): Save to new file; if omitted, creates backup
### `mark_comment_resolved`
Mark a comment as resolved/done.
**Parameters:**
- `path` (required): Path to the .docx file
- `comment_id` (required): ID of comment to resolve
- `output_path` (optional): Save to new file; if omitted, creates backup
### `accept_change`
Accept a tracked change (apply permanently).
**Parameters:**
- `path` (required): Path to the .docx file
- `change_id` (required): ID of the track change to accept
- `output_path` (optional): Save to new file; if omitted, creates backup
### `reject_change`
Reject a tracked change (undo the change).
**Parameters:**
- `path` (required): Path to the .docx file
- `change_id` (required): ID of the track change to reject
- `output_path` (optional): Save to new file; if omitted, creates backup
## Safety Features
- **Automatic backups**: When modifying a file without specifying `output_path`, a timestamped backup is created (e.g., `document.backup_20250119_143022.docx`)
- **Atomic writes**: Uses temporary files and atomic moves to prevent corruption
- **Unique anchor matching**: Comments require unique anchor text to prevent ambiguity
## Development
```bash
# Install dev dependencies
uv sync
uv pip install pytest pytest-asyncio
# Run tests
uv run pytest -v
# Run specific test file
uv run pytest tests/test_reader.py -v
```
## Architecture
```
src/docx_comments_mcp/
├── __init__.py
├── server.py # MCP server with tool definitions
├── reader.py # Read operations (document, comments, track changes)
├── writer.py # Write operations (add comments, track changes)
└── xml_helpers.py # Low-level OOXML parsing utilities
```
## License
MIT
TDQS
A4.3/5.0
Scored across 9 tools
Disambiguation5/5
Each tool targets a distinct operation: comment creation, reply, resolution, track changes, acceptance/rejection, and document reading/search. No overlap in purpose.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_comment, accept_change, search_document), making the set predictable.
Tool Count5/5
With 9 tools, the count is within the ideal 3-15 range and well-scoped for the server's focus on .docx comments and track changes.
Completeness4/5
The tool set covers core CRUD for comments and track changes, but lacks a tool to delete comments entirely (only mark resolved) and to list all track changes independently, though read_document includes them.
Maintenance
ActivityInactive
ResponsivenessNo issues