safe-docx
# Safe Docx
Edit Word and OpenDocument files with coding agents.
<!-- SYNC:badges BEGIN -->
[](https://github.com/usejunior/safe-docx/actions/workflows/ci.yml)
[](https://app.codecov.io/gh/usejunior/safe-docx)
[](https://www.npmjs.com/package/@usejunior/safe-docx)
[](https://github.com/UseJunior/safe-docx/blob/main/LICENSE)
[](https://github.com/UseJunior/safe-docx/commits/main)
[](https://github.com/UseJunior/safe-docx/issues?q=is%3Aissue+is%3Aclosed)
<!-- SYNC:badges END -->
<!-- SYNC:lang-nav BEGIN -->
[English](./README.md) · [Español](./README.es.md) · [简体中文](./README.zh.md) · [Português](./README.pt-br.md) · [Deutsch](./README.de.md)
<!-- SYNC:lang-nav END -->
Safe Docx is a local MCP server and CLI for reading, searching, editing, comparing, converting, and saving document files. It preserves DOCX structure and can produce clean or tracked-changes output.
## Example
Ask your coding agent:
```text
Edit NDA.docx. Change the governing law from New York to Delaware.
Save a clean copy and a tracked-changes copy. Do not change anything else.
```
Safe Docx finds the clause, applies the targeted edit, and writes both files for review. The rest of the document stays outside the requested edit.
Follow the complete [editing walkthrough](docs/tutorial.md).
## Comparisons
- [SuperDoc](docs/comparisons.md#superdoc)
- [Claude's built-in DOCX editing](docs/comparisons.md#claudes-built-in-docx-editing)
- [python-docx](docs/comparisons.md#python-docx)
- [DOCX compatibility matrix](docs/comparisons.md#compatibility-matrix)
## Install
```bash
npm install --global @usejunior/safe-docx
```
Then configure your MCP client with the installed executable's absolute path. For Claude Code:
```bash
claude mcp add safe-docx -- /absolute/path/to/safe-docx
```
### Antigravity CLI
Add Safe Docx to `~/.gemini/config/mcp_config.json`:
```json
{
"mcpServers": {
"safe-docx": {
"command": "/absolute/path/to/safe-docx",
"args": []
}
}
}
```
Restart `agy`, then ask it to edit a `.docx` file. Antigravity may ask you to approve the MCP server before first use.
See [Installation and verification](docs/installation.md) for locating the executable, pinning a version, and configuring clients.
## Documentation
- [Installation and verification](docs/installation.md)
- [Tool reference](packages/docx-mcp/docs/tool-reference.generated.md)
- [TypeScript library](packages/docx-core/README.md)
- [Architecture](docs/architecture.md)
- [Testing and evidence](docs/testing-and-evidence.md)
- [Trust and conformance](docs/trust-and-conformance.md)
- [Contributing](CONTRIBUTING.md)
## Standards Conformance
Browse the [Safe Docx Conformance Explorer](https://usejunior.com/engineering/safe-docx/conformance) to navigate ECMA-376 sections, OOXML schema declarations, capability claims, explicit non-goals, and measured cross-implementation outcomes.
The generated [repository conformance report](spec-compliance/CONFORMANCE.md) remains the source-controlled record of targeted sections, non-goals, and verification references.
## What Safe Docx Is Not Optimized For
Safe Docx is not a visual editor or layout engine. It does not provide browser rendering, real-time collaboration, or pixel-level pagination guarantees. `.dotx` templates must be converted to `.docx` before use.
TDQS
Scored across 26 tools
Each tool targets a distinct operation or resource: tracked changes, comments, footnotes, formatting, editing, etc. Even similar tools like accept_ai_edits and accept_changes are clearly differentiated by selectivity vs. blanket accept.
Most tools follow a clear verb_noun pattern (e.g., add_comment, delete_footnote, replace_text). A few exceptions like batch_edit (modifier-verb) and grep (command-like) are minor deviations.
26 tools is reasonable for a feature-rich document editing server covering tracked changes, comments, footnotes, formatting, conversion, and export. Each tool serves a clear purpose, and the count is well-scoped.
The tool set covers core lifecycle operations (create, read, update, delete) for text, comments, footnotes, and tracked changes. Minor gaps like lack of explicit paragraph deletion are workable through replace_text.