doc-control
Status: file engine working (pre-1.0; the API may still change). The live Word engine is not built yet. See
status/specification.mdandstatus/plan.md.
A deterministic tool that lets AI agents work on Word documents quickly, precisely and safely, ideally live in the Word window the writer has open. Every content change is a tracked change the writer can accept or reject.
For anyone — writers and editors first — who wants an AI agent's help inside a Word document without a single silent change.
Usage
Install with pip install doc-control (or run it without installing: uvx doc-control).
Python 3.11+, no other dependencies.
Command line, JSON in and JSON out:
doc-control outline --json '{"doc": "Novela.docx"}'
doc-control find --json '{"doc": "Novela.docx", "query": "lluvia"}'
doc-control batch --json '{"doc": "Novela.docx", "ops": [
{"op": "text.replace", "at": "p12#a7b2a7b2:4-10", "text": "nieve"},
{"op": "comment.add", "at": "p40#c0ffee00", "text": "¿Seguro?"}]}'
doc-control help batch # the JSON Schema of any operation
Every write is a tracked change by DOC_CONTROL_AUTHOR (default Claude), made after a
backup and verified, with undo and history.* to go back. Addresses like
p12#a7b2a7b2 come from read results and fail loudly if the paragraph changed.
From Python, a document can be held open for many reads, with whole results:
from doc_control import api
with api.open("Novela.docx") as doc:
for p in doc.paragraphs(normalized=True, pages=True):
print(p["at"], p["style_name"], p["page"], p["text"][:40])
chapters = doc.run("segment", {"unit": "chapters"})["chapters"]
Recipes propose batches of fixes (Spanish typography, quotes, dashes, spacing, empty
paragraphs and more): recipe.list, then recipe.run returns a batch to review and apply.
References: operations · errors.
Planned shape
- One core, two engines, one API
- File engine: edits a closed
.docxwith the Python standard library only, rewriting only the parts it touches. - Live engine: controls the open Word (Windows/COM first, Mac later).
- File engine: edits a closed
- Two front doors: a CLI with JSON in/out, and an MCP server
(
doc-control mcp, stdio) for Claude Desktop / Cowork and other MCP clients. - Safety first: lock-file and on-disk change detection, backup before every
write, verification, automatic restore, operation log with undo, and
unintended_changes == 0as a gate. - No AI inside. Judgment belongs to the agent; approval belongs to the writer.
It will replace docx-fixer, whose rules become packs built on this tool, and
serve literary-critic as its first downstream consumer.
MCP server
doc-control mcp serves every operation as an MCP tool over stdio, one tool per
operation (para.move becomes para_move), with the same JSON Schemas and the
same response envelope as the CLI. It needs nothing beyond the package itself:
{
"mcpServers": {
"doc-control": { "command": "uvx", "args": ["doc-control", "mcp"] }
}
}
Documents
- Operation reference and error reference, generated from the code
- Initial research: tooling and risks
Development
This repo uses claude-arsenal
(spec-driven workflow, gated tasks in arsenal/tasks/). See CLAUDE.md.
Related projects
Same author:
- claude-arsenal — a Claude Code skill and plugin marketplace: specs before code, failing tests first, gates with numbers.
- literary-critic — lets an LLM index, analyse and advise on a full novel manuscript the way a professional editor would; doc-control's first planned consumer.
- drawspec — declarative diagram spec → clean, themeable SVG; JSON with no coordinates, so an LLM can write it.
- integral-job-search — a candidate-centred job search run as a conversation in Claude Code.
License
Metadata
Release files for doc-control 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| doc_control-0.3.0.tar.gz | 433.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| doc_control-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 711.6 kB
Release files / doc_control-0.3.0.tar.gz
| Download URL | doc_control-0.3.0.tar.gz |
|---|---|
| Size | 433.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
869e267e4b254d6df282b30f5511accc38bb958b940d9177e9fde542867352c5
|
|
BLAKE2b-256 checksum How to use checksums |
df7fdfb360e57123026828be50532b7e280c9cc43004dde2e44fa61ae9fd658e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logRelease files / doc_control-0.3.0-py3-none-any.whl
| Download URL | doc_control-0.3.0-py3-none-any.whl |
|---|---|
| Size | 277.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5b2dce892644e86d011f3e0cc91abe35a4c70e2fb93fcd6bf4481fd0e297d4fe
|
|
BLAKE2b-256 checksum How to use checksums |
3ec9b8c210b8ab2bc8d20de13f735d407c09694e3160d97b72665e1000c36125
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency log