mcpField
D
doc-control

doc-control

本地服务
github.com/nuncaeslupus生产力01 周前更新

关于 doc-control

doc-control 是供 AI Agent 使用的本地 Word 文档读写工具,通过地址定位段落并执行编辑。修改会以修订和评论形式呈现,并配有备份、验证与撤销,便于作者审核。

主要功能

  1. 01按地址定位段落和文本
  2. 02修订、评论与审核工具
  3. 03备份、验证和撤销历史
  4. 04编辑文件或打开的文档
  5. 05通过 stdio 提供 60 多种 MCP 工具

适用场景

  1. 01提出 .docx 修改供作者审核
  2. 02为稿件中的指定段落添加评论
  3. 03应用前预览一批编辑操作
  4. 04撤销或恢复文档修改

MCP 相关

通过 stdio 将 60 多种文档操作作为 MCP 工具提供,包括读取、修订编辑、审核、历史记录和实时窗口控制。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nuncaeslupus-doc-control": {
"command": "uvx",
"args": [
"doc-control"
]
}
}
}
启动命令uvx doc-control

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidoc-control0.10.1

工具

67

收录的工具列表 · 更新于 1 周前

参数类型必填说明
atstring是一个段落内的范围,例如 p142#a7b2a7b2:10-15,或整个段落或句子(p142#a7b2a7b2.s3)。
docstring是.docx 文件的路径。
contextinteger否要保留的前缀和后缀字符数。

详细介绍

README 配图 doc-control

基于 claude-arsenal 构建

PyPI CI 许可证:MIT doc-control MCP 服务 – Glama 上的质量和维护评分

doc-control:Agent 发送一个 JSON 批次来替换单词并添加批注;打开的 Word 页面将替换内容显示为带有“接受”和“拒绝”按钮的修订删除和插入,并在页边气泡中显示批注

让 AI Agent 以修订形式编辑 Word 文档,供作者接受或拒绝。

当 Agent 被要求修正 .docx 文件时,通常会重写文件,并希望其他内容没有发生变化。 这个工具为它提供了一个确定性接口:按段落地址读取文档,然后发送编辑内容,将其作为修订和批注写入,同时每次写入都会备份、验证并支持撤销。它既能处理已关闭的文件,也能通过 LibreOffice Writer 或 Windows 上的 Microsoft Word 操作作者当前打开的文档。工具本身不包含 AI:由 Agent 做决定,由作者审批。

尚未稳定:API 仍可能变更。

快速开始

Python(版本见 pyproject.toml),无需其他依赖。

pip install doc-control            # or run without installing: uvx doc-control ...
doc-control text.find --json '{"doc": "story.docx", "query": "rain"}'

若要在 Windows 上实时控制 Word,请安装 doc-control[live](会添加 pywin32); LibreOffice 无需额外软件包。

无需 Python 即可安装(Windows)

最新发布页面 中的每个版本都附带 Claude Desktop 扩展和安装程序。两者都为当前用户安装, 无需管理员权限,可与任何 Claude 账户配合使用(包括免费套餐),并可实时控制 Microsoft Word。完整指南(校验和、更新、卸载): docs/install-windows.md。

Claude Desktop 扩展(.mcpb)
  1. 从最新发布页面下载 doc-control-X.Y.Z-windows-x64.mcpb。
  2. 将文件拖到 Claude Desktop 的设置 > 扩展页面,然后点击安装。

Claude Desktop 会警告此扩展可以访问计算机上的所有内容;每个本地扩展都会收到此警告。双击文件不会安装扩展。

安装程序(-setup.exe),用于命令行
  1. 从最新发布页面下载 doc-control-X.Y.Z-windows-x64-setup.exe。
  2. 双击运行。
  3. 如果 Windows SmartScreen 显示“Windows 已保护你的电脑”,请点击更多信息,然后点击仍要运行(安装程序未经代码签名)。
  4. 点击安装、下一步和完成,然后打开新的终端:在那里运行 doc-control server.capabilities 即可。

示例

一个包含两个段落的 story.docx。先查找一个单词,再将其替换,并在下一个段落添加批注,全部在一个批次中完成(较长的输出内容已用 ... 截断;其余部分为实际输出):

$ doc-control text.find --json '{"doc": "story.docx", "query": "rain"}'
{"api": "1.0", "ok": true, "op": "text.find", ..., "result": {"matches": [{"at": "p1#bfa780f9:4-8",
 "text": "rain", "context": "The rain had not stopped since Tuesday…"}], "total": 1, ...}}

$ doc-control doc.batch --json '{"doc": "story.docx", "ops": [
    {"op": "text.replace", "at": "p1#bfa780f9:4-8", "text": "snow"},
    {"op": "comment.add", "at": "p2#f8b24a64", "text": "Which window?"}]}'
{"api": "1.0", "ok": true, "op": "doc.batch", ..., "result": {"applied": 2, "dry_run": false,
 "preview": [{"op": 0, "at": "p1#bfa780f9:4-8", "before": "rain", "after": "snow"},
             {"op": 1, "at": "p2#f8b24a64", "before": "Ana closed the window and waited.",
              "after": "(comment c0 by Claude: Which window?)"}],
 ..., "author": "Claude", "backup": ".../.doc-control/story.docx/backups/20261020T091845Z-0ff4dc24.docx",
 "op_id": "h-000001"}, "warnings": [], "next": null}

$ doc-control review.list --json '{"doc": "story.docx"}'
{..., "result": {"totals": {"comments": 1, "insert": 0, "delete": 0, "replace": 1, ...},
 "paragraphs": [{"at": "p1#c6f909ff", "text": "The snow had not stopped since Tuesday.",
   "changes": [{"type": "replace", "ids": ["1", "2"], "author": "Claude", "old": "rain", "new": "snow", ...}]},
  {"at": "p2#f8b24a64", "text": "Ana closed the window and waited.",
   "comments": [{"id": "0", "author": "Claude", "text": "Which window?", "quote": "Ana closed the window and waited.", ...}]}]}, ...}

Word 会将替换内容显示为修订删除和插入,并在页边显示批注。编辑后若重用旧地址,则会报错,而不是猜测:

$ doc-control text.replace --json '{"doc": "story.docx", "at": "p1#bfa780f9:4-8", "text": "fog"}'
{"api": "1.0", "ok": false, "op": "text.replace", "error": {"code": "STALE_ADDRESS",
 "message": "p1#bfa780f9 no longer matches the document",
 "hint": "Re-read the paragraph (para.get) or resolve its anchor, then retry.",
 "details": {"address": "p1#bfa780f9", "current": "p1#c6f909ff"}}}

与 AI Agent 搭配使用

MCP 服务

doc-control mcp 通过 stdio 提供 60 多项操作作为 MCP 工具,每项操作对应一个工具(doc.batch 会变为 doc_batch),并使用与 CLI 相同的 JSON Schema 和响应封套。每个工具都会声明一个 outputSchema;调用成功时还会以 structuredContent 返回该封套。仅使用标准库。

{
  "mcpServers": {
    "doc-control": { "command": "uvx", "args": ["doc-control", "mcp"] }
  }
}

要在 Windows 上使用实时 Word,请使用 "args": ["--from", "doc-control[live]", "doc-control", "mcp"],或安装上方的 .mcpb 扩展。live_places 还附带 MCP Apps UI(一个 ui:// 页面),页面上的按钮会调用 live_select。

分组工具
读取doc_outline、para_list、para_get、para_locate、text_find、doc_stats、doc_segment、review_list、comment_list、revision_list
编辑(跟踪)doc_batch、text_replace、para_insert、para_delete、comment_add、note_add、term_rename、table_row_insert、table_row_delete
审阅revision_accept、revision_reject、doc_diff、doc_compare
布局和字段layout_get、layout_apply、field_list、field_update、toc_insert、caption_add、xref_add、index_mark、index_insert
样式style_*、styleset_*
安全history_list、history_undo、history_restore、history_search、...
实时窗口live_status、live_open、live_select、live_places、live_save、live_close、...
发现server_capabilities、server_help、recipe_list、recipe_run

使用 {"op": "<name>"} 调用 server_help,可返回任意操作的 Schema 和摘要。

从 CLI 使用

Agent 可以直接驱动 CLI。它不会提示用户,且只有在使用 --json - 时才会读取 stdin。它会在 stdout 上准确输出一个 JSON 封套:{"ok": true, "result": ...} 或 {"ok": false, "error": {"code", "message", "hint", "details"}}。 退出代码:0 表示成功,1 表示操作错误,2 表示用法错误(未知操作或无效请求)。错误代码列于 docs/errors.md。

建议的工作循环:读取内容(doc.outline、para.list、text.find),构建一个 doc.batch,使用 "dry_run": true 运行以获取预览,然后应用更改,并引导撰写者查看 Word 的“审阅”窗格。history.undo 可撤销写入。

工作原理

  • 使用地址,而非偏移量。 p12#a7b2a7b2:4-10 表示第 12 段、该段的文本指纹和字符范围。段落发生变化时,会返回包含当前地址的 STALE_ADDRESS。编辑后,anchor.create / anchor.resolve 可再次查找某段内容。
  • 所有内容更改都会被跟踪,作者为 DOC_CONTROL_AUTHOR(默认为 Claude)。对于撰写者已批准的编辑,文本编辑操作和 history.restore 可使用 "tracked": false(仅文件引擎支持)。
  • **安全层:**锁文件和磁盘更改检测、每次写入前备份、回读验证、失败时自动恢复,以及支持撤销的操作日志。
  • **文件引擎和实时引擎共用一个 API。**文件引擎使用 Python 标准库编辑已关闭的 .docx 文件,只重写其实际修改的部分;读取也支持 .txt、.md 和 .odt。实时引擎可操控 LibreOffice Writer 或 Word(Windows,COM)中打开的文档。
  • 配方会提出修复批次(西班牙语排版、引号、破折号、间距、空段落):先运行 recipe.list,再运行 recipe.run,它会返回供审核和应用的批次。

用法

操作命名为 resource.action;任何单项编辑操作都会作为仅包含一项编辑的 doc.batch 运行。doc-control server.help <op> 会打印操作的 Schema。从 Python 调用:

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("doc.segment", {"unit": "chapters"})["chapters"]
注释、页眉、页脚和表格

读取范围默认为正文;在 stories 中添加 "notes"(脚注、尾注)或 "headers"(页眉、页脚)即可扩展读取范围。这些段落带有前缀地址(fn3/p1#0c9e0c9e、hdr1.default/...),可用于编辑。

doc-control para.list --json '{"doc": "Tesis.docx", "stories": ["body", "notes"]}'
doc-control text.replace --json '{"doc": "Tesis.docx", "at": "fn3/p1#0c9e0c9e:4-10", "text": "2019"}'
doc-control note.add --json '{"doc": "Tesis.docx", "at": "p40#c0ffee00:17", "kind": "footnote", "text": "Ver el cap. 2."}'
doc-control table.row.insert --json '{"doc": "Tesis.docx", "table": 1, "after_row": 2, "cells": ["a", "b"]}'
页面布局和字段

layout.get 按节返回页面方案(起始位置、分隔符、编号、各类型的页眉和页脚);layout.apply 会将文档调整为相同格式的方案。以下示例为小说设置无页码的标题页,然后从右侧页面开始第 1 章,页码为 1,奇数页页眉显示章节标题,偶数页页眉显示书名:

doc-control layout.apply --json '{"doc": "Novela.docx", "untracked": true, "plan": {
  "version": 1, "two_sided": true, "mirror_margins": true,
  "sections": [
    {"from": "p1#ea7412aa", "break": "nextPage",
     "numbering": {"shown": false, "start": 1, "format": "lowerRoman"},
     "header": {"default": "", "even": ""}, "footer": {"default": "", "even": ""}},
    {"from": "p2#5fac7aad", "break": "oddPage",
     "numbering": {"shown": true, "start": 1, "format": "decimal"},
     "header": {"default": "{chapter}", "even": "La casa del río"},
     "footer": {"default": "{PAGE}", "even": "{PAGE}"}}]}}'

{PAGE}、{NUMPAGES} 和 {chapter} 会成为字段。分隔符和编号会被跟踪;Word 无法跟踪新建的页眉部分和双面设置,因此会标记为 untracked: true。请先尝试 "dry_run": true。field.list、toc.insert、caption.add、xref.add 和 index.insert 用于处理字段;field.update 通过无头模式的 LibreOffice 刷新这些字段。

实时操作:作者当前打开的文档
doc-control live.open --json '{"doc": "Novela.docx"}'
doc-control doc.batch --json '{"doc": "Novela.docx", "engine": "live", "ops": [
  {"op": "comment.add", "at": "p40#c0ffee00", "text": "¿Seguro?"}]}'
doc-control live.close --json '{"doc": "Novela.docx", "save": true}'

实时 doc.batch 支持 comment.add、text.replace 和 para.insert。如果没有可用的应用,它会返回 ENGINE_UNAVAILABLE 和原因;live.status 会列出找到的应用,以及 LibreOffice 的 UNO 桥接所需的 Python。关闭时不会丢弃未保存的工作。

环境变量
变量作用
DOC_CONTROL_AUTHOR修订和批注的作者(默认值为 Claude)
DOC_CONTROL_STOREappdata 会将备份和历史记录保存在用户存储区,而不是文档旁边的 .doc-control/ 中
DOC_CONTROL_STORE_DIR覆盖存储根目录
DOC_CONTROL_HOME用户存储区和配方文件夹
DOC_CONTROL_UPDATE_CHECK1 表示每天最多检查一次 GitHub Releases,并在 server.capabilities 中报告较新版本;不会下载任何内容

所有操作均在本地运行。关闭更新检查(默认设置)后,不会有任何内容离开本机。

它不是什么

  • 它不是 AI:不会调用模型,也不会做判断。它只执行 Agent 发送的指令。
  • macOS 上尚不支持实时控制;实时 doc.batch 仅支持部分编辑类型。
  • 索引由 Word 生成(F9);引用字段不会被更改。

文档

开发

uv sync
make check     # ruff, mypy, pytest, hygiene script

工作计划通过 claude-arsenal 按设有门槛的任务制定; 请参阅 CLAUDE.md。

相关项目

  • claude-arsenal — 规范驱动的 Claude Code 工作流和设有门槛的任务队列。
  • drawspec — 声明式图表规范 → 简洁的 SVG/PNG/文本,可由大模型编写;内含 MCP 服务。
  • literary-critic — 以专业编辑的方式分析大模型手稿。
  • integral-job-search — 在 Claude Code 中运行、以求职者为中心的求职工具。

许可证

MIT — 参见 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。