doc-fine-tuning-mcp
doc-fine-tuning-mcp —— opencode-Bürodokument-Feintuning-Markierer
Ein MCP-Server für opencode: Wenn die LLM eine feine Änderung an deinen Bürodokumenten vornehmen muss, öffnet sie das Dokument damit visuell in einem separaten Browser-App-Fenster. Du klickst auf ganze Absätze (oder ziehst eine Auswahl über zusammenhängende Zeichenfolgen für feinere Markierungen) und gibst für jede Stelle einen Änderungsprompt ein – mehrere Stellen können in einem Durchgang markiert werden. Danach wird die Kontrolle an den Agenten zurückgegeben, und die LLM führt die Änderungen anhand deiner Prompts Stelle für Stelle aus. Das Markierungsfenster schließt sich automatisch, wenn der Agent abbricht/beendet wird; bei mehreren Markierungsrunden für dasselbe Dokument wird dasselbe Fenster wiederverwendet und automatisch neu geladen.
Unterstützte Formate: .docx / .xlsx / .pptx (OOXML). v1 unterstützt keine alten Formate (.doc/.xls/.ppt).
Arbeitsablauf
用户对 opencode 说:把 D:\报告.docx 的第 3 段和标题改得更正式
│
▼
opencode 插件 doc-edit-listener 检测到"文档精细修改意图",注入引导
│
▼
LLM 调用 doc-edit_annotate_document("D:\报告.docx")
│ → 本地 HTTP 服务启动,独立浏览器应用窗口打开标注页 http://127.0.0.1:<port>/?session=xxx
│ (同一文档再次标注:复用该窗口自动重载,不重开新窗口)
▼
你在页面上:看到文档 → 点击整段/单元格/形状(或拖选连续字符串)→ 输入提示词 → 继续标注下一处 → 点【完成】
│ (标注以 loc + prompt 形式提交给服务端;完成后 agent 窗口重新聚焦)
▼
LLM 调用 doc-edit_wait_for_annotations 拿到全部标注
│ (若窗口被关闭:返回 status=closed + reason,LLM 据此决定重开或询问你)
▼
LLM 对每个标注:doc-edit_read_location 读取原文 → 依据提示词生成新内容
│ → doc-edit_apply_edit 应用修改(首次自动备份 .bak-<时间戳>)
▼
标注窗口自动重载(服务端推送),展示修改后的最新文档供你检查
│ → LLM 再次 doc-edit_wait_for_annotations 等待下一轮标注(多轮循环)
▼
你点【完成】且无标注 / 点【取消】/ 关闭窗口 → 修改流程结束Related MCP server: word-mcp-live
Architektur
opencode
├─ 插件 doc-edit-listener(监听消息 → 检测修改意图 → 注入引导)
└─ MCP 客户端 ──stdio──► doc-edit MCP server(Node/TS, @modelcontextprotocol/sdk)
├─ 标注工具:annotate_document / wait_for_annotations / cancel_session
├─ 编辑原语:read_structure / read_location / apply_edit
├─ 本地 HTTP 服务(127.0.0.1:动态端口)→ H5 标注页 + API
└─ Python 编辑引擎(python-docx / openpyxl / python-pptx)Konsistenz der Positionsbestimmung: Die Position, auf die du auf der Seite klickst (
loc), wird von der JS-Seite durch Traversieren des OOXML erzeugt; die Python-Engine parst die Position mit demselben Traversierungsalgorithmus, undtests/parity-Tests garantieren, dass die loc→Text-Zuordnung auf beiden Seiten exakt übereinstimmt (insbesondere Absätze in Word-Tabellen, mehrere Formen in PPT).Die LLM ist der Ausführende: Jeder Schritt zur Erzeugung neuer Inhalte wird von der LLM basierend auf deinen Prompts durchgeführt; der MCP-Server ist nur für „Seite öffnen, Markierungen sammeln, Dateien positionsbasiert lesen/schreiben" zuständig.
Installation
1. Projekt klonen und Abhängigkeiten installieren
cd D:\develop\doc-fine-tuning-mcp
npm install
# Python 编辑引擎(创建 .venv 并安装 python-docx/openpyxl/python-pptx)
cmd //c scripts\\setup_venv.bat2. Build
npm run build # 编译 src → dist/(MCP server)
cd web && npm install && npm run build # 构建 H5 标注页 → web/dist/3. MCP-Server in opencode registrieren
Im mcp-Block von ~/.config/opencode/opencode.jsonc hinzufügen (Entwicklungsmodus, zeigt auf lokale Build-Artefakte):
"doc-edit": {
"type": "local",
"command": ["node", "D:/develop/doc-fine-tuning-mcp/dist/index.js"],
"enabled": true
}Veröffentlichungsmodus (optional): Nach
npm packzur Erzeugung des tgz stattdessennpx -y --package <Pfad>/doc-fine-tuning-mcp-<Version>.tgz doc-fine-tuning-mcpverwenden, konsistent mit den anderen MCPs im Projekt.
4. Listener-Plugin installieren
Das Plugin besteht aus zwei Dateien: doc-edit-listener.ts und dem davon abhängigen Erkennungsmodul lib\detect.ts.
Das opencode-Plugin-Verzeichnis scannt automatisch .ts-Dateien darin als Plugins, scannt aber Unterverzeichnisse nicht rekursiv,
daher wird detect.ts im Unterverzeichnis lib\ nicht fälschlich als eigenständiges Plugin geladen.
copy plugin\doc-edit-listener.ts %USERPROFILE%\.config\opencode\plugin\doc-edit-listener.ts
mkdir %USERPROFILE%\.config\opencode\plugin\lib
copy plugin\lib\detect.ts %USERPROFILE%\.config\opencode\plugin\lib\detect.ts⚠️ Das Plugin-Modul darf nur das Plugin selbst exportieren (default). Füge
doc-edit-listener.tskeine benannten Funktions-Exporte hinzu, sonst behandelt opencode sie als zusätzliche Hooks/Plugins, was zu einem Ladefehler mit „Unexpected server error" führt (nach dem Leeren der Hooks kaskadiert der Fehler zu Provider.defaultModel-Absturz). Die Erkennungslogik gehört immer inlib/detect.ts.
Das Plugin benötigt @opencode-ai/plugin (in ~/.config/opencode/node_modules ist Version 1.18.11 bereits enthalten). Nach einem Neustart von opencode ist es aktiv.
5. End-to-End-Selbsttest
npm test # 引擎 / parity / mcp 客户端 / 插件 全部测试
node scripts/e2e-verify.ts # 输出 PASS 即闭环可用MCP-Tool-Beschreibung
Tool | Eingabeparameter | Beschreibung |
|
| Öffnet ein separates Markierungsfenster, erstellt/wiederverwendet eine Markierungssitzung, gibt |
|
| Blockiert bis |
|
| Bricht die Markierungssitzung ab |
|
| Dokumentgliederung (docx absatzweise / xlsx Stichprobe pro Sheet / pptx Formen pro Seite) |
|
| Originaltext an der angegebenen Position + angrenzender Kontext (bei docx |
|
| Wendet Änderungen an (bei docx |
|
| Ersetzt |
|
| Suchen-und-Ersetzen im gesamten Text (nur docx, normale Zeichenfolge, kein Regex; gibt |
|
| Vorschau von Änderungen in Serie (im Speicher angewendet, nicht auf die Festplatte geschrieben; gibt pro Stelle |
|
| Listet den Versionsverlauf (vor jedem |
|
| Rollt auf die angegebene Version zurück (vor dem Zurücksetzen wird der aktuelle Zustand gesnapshotet, umkehrbar) |
mode: replace / append / prepend / insert_after / delete.
style (optional): { bold, italic, sizePt, color }.
Hinweis: Die Ersetzung von
template_replace/find_replaceerfolgt mit Run-Ebene-Formattreue – wenn der Ersetzungsbereich mehrere Runs mit unterschiedlichen Formaten überspannt, wird der neue Text nach Zeichengewichtung der Quell-Runs segmentiert und erbt segmentweise das Format des jeweiligen Runs (keine Degradierung mehr auf nur das Format des ersten Runs).
Positionsdeskriptor loc
Das durch Klicken auf der Seite erzeugte loc ist der einzige Nachweis für „welche Stelle geändert werden soll", mit sechs Typen:
| { kind: "docx-paragraph", paraIndex } // Word 段落(body 文档序,0-based)
| { kind: "docx-cell", tableIndex, rowIndex, colIndex, paraIndex } // Word 表格内段落
| { kind: "xlsx-cell", sheet, row, col } // Excel 单元格(1-based,同 A1)
| { kind: "xlsx-range", sheet, row1, col1, row2, col2 }
| { kind: "pptx-shape", slideIndex, shapeIndex } // PPT 形状(1-based)
| { kind: "pptx-shape-paragraph", slideIndex, shapeIndex, paraIndex }Verwendungshinweise und Tipps
Die LLM sollte: zuerst
annotate_documentaufrufen, damit der Benutzer markieren kann →wait_for_annotationsfür die Markierungen → für jede Markierungread_locationzur Überprüfung des Originaltexts → neue Inhalte gemäß dem Prompt erzeugen →apply_edit. Nicht die Änderungsposition raten.Korrektur über Versionsverlauf: Vor jedem
apply_editwird das Dokument nach<path>.versions/gesnapshotet. Falls nach der Änderung der Inhalt auffällig ist (Ersetzungsergebnis entspricht nicht dem Prompt, Benutzer ist mit einer Runde unzufrieden), mitlist_versionsdie Snapshots ansehen, mitrestore_versionauf den Stand vor der Änderung zurückrollen und neu generieren. Nach dem Zurücksetzen können die loc-Indizes alter Markierungen ungültig sein – erneut mitread_locationprüfen oder den Benutzer neu markieren lassen (das Zurücksetzen in der ersten Runde ist am wertvollsten – die Markierungen basieren noch auf dem Originaldokument). Der „Verlauf"-Tab in der Seitenleiste des Markierungsfensters zeigt ebenfalls die Versionskette (jeder Eintrag mit Operationsbeschreibung/Zeit/Größe) und ermöglicht das Zurücksetzen mit einem Klick. Vom Benutzer durchgeführte Zurücksetzungen werden in der Sitzung unteruser_actionsprotokolliert und mitwait_for_annotationszurückgegeben – wenn die LLM inuser_actionsein restore sieht, sollte sie erkennen, dass das Dokument zurückgerollt wurde und spätere Änderungen ungültig sein können, und nach Prüfung fortfahren.Wartepolling (nie Timeout):
wait_for_annotationshat standardmäßig kein Timeout (wartet, bis der Benutzer abschickt / abbricht / das Fenster schließt, oder der Agent beendet wird). Manche Clients haben ein Timeout-Limit für einzelne Tool-Aufrufe (ca. 60s); dann wird der einzelne Aufruf abgeschnitten – ein erneuter Aufruf des Tools setzt das Warten fort, die Sitzung wird durch den Abbruch nicht beendet.Fensterschließen: Wenn der Benutzer das Markierungsfenster schließt, gibt
wait_for_annotationsclosed+reasonzurück (window_closed/page_unload/window_lost/agent_cancelled/agent_exited). Die LLM sollte je nach Grund entscheiden, ob sie das Markieren neu öffnet (erneutannotate_document) oder den Benutzer fragt.Automatisches Neuladen des Fensters (Push-Modus): Nach jeder erfolgreichen Änderung durch
apply_edit/template_replace/find_replace/restore_versionschiebt der Server automatisch ein Neuladen an das Markierungsfenster dieses Dokuments (ca. 2s Entprellung, aufeinanderfolgende Änderungen werden zu einem zusammengefasst), und das Fenster zeigt sofort den neuesten Inhalt nach der Änderung – ohne dass die LLM manuell erneutannotate_documentaufrufen muss.Erhalt des Scroll-Bereichs: Nach dem Neuladen kehrt die Seite zu deiner vorherigen Leseposition zurück (Sichtanker – der Inhalt nahe dem oberen Rand des Viewports wird aufgezeichnet und per Offset wiederhergestellt, nicht einfach zurück zum Seitenanfang), wobei das aktuelle Arbeitsblatt bei xlsx und die aktuelle Seite bei pptx erhalten bleiben.
Fensterzuordnung bei mehreren Dialogen mit gemeinsamem Server: Clients wie WorkBuddy teilen global denselben MCP-Serverprozess, alle Markierungssitzungen aller Dialoge laufen im selben Prozess. Um zu vermeiden, dass nach einer Änderung das Fenster eines anderen Dialogs neu geladen wird, sollte die LLM nach Erhalt der Markierungen aus
wait_for_annotationsdie zurückgegebenesession_idunverändert anapply_editund andere Änderungstools weitergeben (die Tools unterstützen diesen optionalen Parameter bereits); der Server lädt damit präzise das Fenster dieser Sitzung neu. Wird sie nicht übergeben, greift der Server auf „zuletzt aktive Sitzung" als Fallback zurück; bei mehrdeutigen Pfaden mit mehreren lebenden Sitzungen wird nicht neu geladen (um Fehlschüsse zu vermeiden). Das Markierungsfenster desselben Dokuments wird unter einem gemeinsamen Server wiederverwendet – es wird empfohlen, dasselbe Dokument zu einem Zeitpunkt nur in einem Dialog zu bearbeiten.Wiederverwendung desselben Dokuments: Ein erneutes
annotate_documentfür dasselbe Dokument verwendet das vorhandene Fenster wieder und lädt es automatisch neu (die Seite holt die neueste Datei, leert die Markierungen der vorherigen Runde), ohne ein neues Fenster zu öffnen.Mehrrunden-Markierungsschleife: Nachdem der Agent eine Runde Markierungen verarbeitet hat, lädt das Fenster automatisch neu, damit du die Änderungen prüfen und weiter markieren kannst; der Agent sollte erneut
wait_for_annotationsaufrufen, um auf die nächste Runde zu warten. Im Fenster auf【Fertig】klicken und keine Markierungen hinzufügen bedeutet, dass in dieser Runde keine weiteren Änderungen nötig sind; auf【Abbrechen】klicken schließt das Fenster direkt und beendet die Runde (wait_for_annotationsstoppt entsprechend).Zeichenfolgen-Ebene-Markierung: Auf der Word-Seite eine zusammenhängende Zeichenfolge auswählen, die Markierung ist dann auf diese Zeichenfolge präzise (
loc.range);apply_editersetzt nur sie.Abbrechen: Wenn der Benutzer auf der Seite auf【Abbrechen】klickt oder die LLM
cancel_sessionaufruft, wird die Sitzung aufcancelledgesetzt und das Markierungsfenster direkt geschlossen; wenn der Agentenprozess beendet wird, schließen sich alle Markierungsfenster automatisch.Änderungen sind nicht destruktiv: Vor der ersten Bearbeitung wird automatisch
Dokumentname.bak-<Zeitstempel>erzeugt, und vor jeder Änderung wird automatisch ein Snapshot in die<path>.versions/-Versionskette geschrieben (mitlist_versions/restore_versionkann beliebig weit zurückgerollt werden).
Bekannte Einschränkungen
Nur
.docx/.xlsx/.pptx(OOXML) werden unterstützt.Word: Die Renderreihenfolge von docx-preview und die body-Traversierungsreihenfolge werden als 1:1 angenommen (bei extremen Layout-Elementen kann es Abweichungen geben, siehe Kommentar oben in
web/src/viewers/docxViewer.ts).PPT: Die Formpositionierung nutzt Textabgleich als Fallback; bei doppelten Formtexten kann es ungenau sein.
Excel: SheetJS + leichtes Grid; Doppelklick auf eine Zelle zur Bearbeitung innerhalb der Seite wird unterstützt (Änderungseinträge werden als Markierungen an die LLM zur Umsetzung zurückgegeben); nicht-obere-linke Zellen bei zusammengeführten Zellen sind schreibgeschützt; bei Formelzellen ersetzt die direkte Bearbeitung die Formel durch einen normalen Wert.
Der Sitzungszustand liegt im Speicher und verfällt beim Neustart des MCP-Servers.
FAQ
F: Der Browser öffnet sich nicht automatisch?
A: Die Markierungsseite wird in einem separaten App-Fenster von Chrome/Edge geöffnet (ohne Adressleiste/Werkzeugleiste/Tabs). Falls Chrome/Edge nicht gefunden wird oder der Start fehlschlägt, gibt das Tool trotzdem url zurück; die LLM schickt dir den Link, und du öffnest ihn manuell (in diesem Fall degradiert die Fenster-Schließ-Erkennung zu einem Seiten-Herzschlag).
F: Warum schließt sich das Markierungsfenster von selbst? A: Wenn du den Agenten mit Esc abbrichst oder der Agent/opencode-Prozess beendet wird, schließt der Server das Markierungsfenster aktiv; nachdem du auf der Seite auf【Fertig】oder【Abbrechen】geklickt hast, bleibt das Fenster schreibgeschützt und wartet auf Wiederverwendung (bei derselben Runde des Dokuments wird es direkt neu geladen).
F: Die Markierungsseite lässt sich nicht öffnen / weißer Bildschirm?
A: Stelle sicher, dass cd web && npm run build ausgeführt wurde (der Server gibt bei fehlendem web/dist nur eine Platzhalter-Hinweisseite zurück); stelle sicher, dass der Dokumentpfad absolut ist und die Datei existiert.
F: Warum wird ein Plugin benötigt?
A: Das Plugin erkennt auf Nachrichtenebene die Absicht „Dokument fein ändern" und injiziert eine Führung, damit die LLM dich vor dem Handeln markieren lässt, statt Positionen zu raten und direkt zu ändern. Hinweis: Das Plugin wirkt nur bei opencode; in anderen MCP-Clients wie WorkBuddy kommt die Prozessführung der LLM aus der Tool-Beschreibung und dem next-Feld, das wait_for_annotations zurückgibt (die Mehrrunden-Schleifenkonvention ist eingebaut).
F: Nach Abschluss der Änderung lädt das Fenster automatisch neu; wenn ich erneut markiere und auf【Fertig】klicke, verarbeitet der Agent das weiter? A: Hängt davon ab, ob der Agent noch wartet:
Wenn der Agent gemäß der Führung in der Schleife „Markierungen verarbeitet → erneut
wait_for_annotations" ist, erhält er deine neu eingereichten Markierungen sofort und verarbeitet sie weiter (nahtloser Mehrrunden-Übergang);Wenn der Agent seine Runde bereits beendet hat (keine Tools mehr aufruft), werden deine Markierungen auf dem Server zwischengespeichert, aber der Agent wird nicht automatisch geweckt – sag dem Agenten dann einfach „Markierungen eingereicht, bitte weiterverarbeiten". Das ist die inhärente Grenze der Architektur „Die LLM ist der Ausführende": Der Server kann die nächste Runde nicht anstelle des Agenten aktiv übernehmen.
F: Wenn zwei Dialoge gleichzeitig dasselbe Dokument bearbeiten, vermischen sich die Fenster?
A: WorkBuddy teilt global denselben Serverprozess; das Markierungsfenster desselben Dokuments wird gemeinsam wiederverwendet. Das automatische Neuladen nach Änderungen ist jetzt präzise an die Sitzung gebunden: Wenn die LLM in apply_edit und anderen Tools die von wait_for_annotations zurückgegebene session_id mitgibt, wird nur das Fenster dieses Dialogs neu geladen; ohne Angabe greift der Fallback auf die zuletzt aktive Sitzung, und bei mehreren lebenden Sitzungen für denselben Pfad wird lieber nicht neu geladen, um Fehlschüsse zu vermeiden. Es wird empfohlen, dasselbe Dokument zu einem Zeitpunkt nur in einem Dialog zu bearbeiten.
Available Tools
11 toolsannotate_documentA
打开文档标注页面(H5):创建标注会话并启动本地 HTTP 服务,在独立浏览器应用窗口打开标注页(无地址栏/工具栏/标签页)。若同一文档已有存活窗口则直接复用(原位重载、清空上轮标注),不重新开窗。返回 {session_id, url}。多轮循环:窗口会在文档被修改后自动重载最新内容(apply_edit 成功后服务端主动推送),无需每次手动调用本工具;也可在本轮开始或需要立即刷新时主动调用。同一文档重复调用会复用现有窗口。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 目标文档绝对路径(.docx / .xlsx / .pptx) |
apply_editA
对指定位置应用修改(首次编辑前自动生成 .bak-<时间戳> 备份;同一标注轮次内只有第一次编辑会快照到版本历史,其余编辑复用该版本——一轮多个标注只产生一个版本,版本描述会汇总本轮全部修改)。mode 缺省 replace;引擎错误返回结构化错误。返回 {ok, loc, new_content, version}(version 为 null 表示本轮已快照过、未新增版本;version.desc 表达该快照为'修改前/该轮标注前的状态'——会话场景为'第 N 轮标注前的状态(本轮修改:…)',无会话为'修改前:<编辑摘要>',回退到该版本即恢复为此内容)。修改成功后,该文档的标注窗口会自动重载展示最新内容(无需再手动调用 annotate_document);用户检查后可能继续标注,此时应再次调用 wait_for_annotations 获取下一轮标注。若修改后发现内容异常,可用 list_versions / restore_version 回退到修改前再重新生成。
| Name | Required | Description | Default |
|---|---|---|---|
| loc | Yes | 统一位置描述符(docs/contracts.md §2):docx-paragraph / docx-cell / xlsx-cell / xlsx-range / pptx-shape / pptx-shape-paragraph | |
| mode | No | 编辑模式,缺省 replace | |
| path | Yes | 文档绝对路径 | |
| style | No | 格式样式提示(可选字段;缺省表示保持原样) | |
| session_id | No | (建议)标注会话 ID(wait_for_annotations 返回)。提供后窗口重载精确绑定该会话,且同一轮内的多次编辑会合并为一个版本快照 | |
| new_content | No | 新内容(mode=delete 时忽略,可为空字符串) |
cancel_sessionB
取消标注会话(用户点了“取消”)。返回 {session_id, status}。
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 标注会话 ID |
find_replaceA
在 docx 文档中全文查找并替换字符串(普通字符串,非正则;匹配范围含表格内单元格)。match_case=false 时大小写不敏感,替换文本原样插入。返回 {matched, replaced, locations}。
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | 要查找的原文(普通字符串,非正则) | |
| path | Yes | 目标 .docx 文档绝对路径 | |
| replace | Yes | 替换为的内容 | |
| match_case | No | 是否大小写敏感,默认 false | |
| session_id | No | (建议)标注会话 ID(wait_for_annotations 返回)。窗口重载精确绑定该会话 |
list_versionsA
列出文档的版本历史(.versions/ 快照链:同一标注轮次内多个编辑合并为一个版本,即每轮首个编辑前快照;新版本在前)。返回 [{index, path, size, mtime, kind?, desc?, ts?}],无版本时返回 []。每条 desc 表达'修改前/该轮标注前的状态'(如'第 1 轮标注前的状态'或'修改前:替换…'),回退到该版本即恢复为该内容。配合 restore_version 实现任意步回退。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 文档绝对路径(.docx / .xlsx / .pptx) |
preview_editsA
批量预览修改(仅内存计算,不写盘):按顺序在内存中对同一文档应用 edits 列表,返回每处的 {loc, before, after}。适合在真正 apply_edit 前检查一批修改是否符合预期。edits 元素为 {loc, new_content?, mode?, style?}。返回 [{loc, before, after}]。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 文档绝对路径 | |
| edits | Yes | 要预览的修改列表(按顺序应用,与逐个 apply_edit 一致) |
read_locationA
读取指定位置的原文与相邻上下文,供生成新内容前核对。返回 {loc, text, context}。
| Name | Required | Description | Default |
|---|---|---|---|
| loc | Yes | 统一位置描述符(docs/contracts.md §2):docx-paragraph / docx-cell / xlsx-cell / xlsx-range / pptx-shape / pptx-shape-paragraph | |
| path | Yes | 文档绝对路径 |
read_structureA
读取文档大纲:docx 逐段 {loc,text};xlsx 每 sheet 维度与抽样;pptx 每页形状文本。返回 {format, items|sheets|slides}。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 文档绝对路径 | |
| max_items | No | 限制返回条目数,默认 500 |
restore_versionA
将文档直接回退到 list_versions 给出的某个版本(回到该版本锚点:文档被覆盖为该版本内容,回退前不会快照当前状态,因此版本记录不会增加)。⚠️ 警告:该版本之后的全部修改将丢失,且回退本身不可通过新快照撤销(但既有版本链仍保留,可再回退到其它版本)。回退后旧标注的 loc 索引可能失效,应重新 read_structure 遍历后再继续编辑。返回 {restored_index, path, version_path, versions}。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 文档绝对路径 | |
| index | Yes | 要恢复的版本序号(list_versions 返回的 index) | |
| session_id | No | (建议)标注会话 ID(wait_for_annotations 返回)。窗口重载精确绑定该会话 |
template_replaceA
批量替换 docx 文档中的 {{变量}} 模板占位符。variables 为 {变量名: 值} 映射;未提供值的变量保持原样并在 missing_vars 中列出。同段落多处占位符按从右到左应用保证坐标正确;跨 run 断裂的占位符也能正确替换。返回 {matched, replaced, missing_vars, applied}。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 目标 .docx 文档绝对路径 | |
| variables | Yes | 模板变量映射,如 {"name": "张三", "date": "2026-08-26"} | |
| session_id | No | (建议)标注会话 ID(wait_for_annotations 返回)。窗口重载精确绑定该会话 |
wait_for_annotationsA
阻塞等待标注会话完成 / 取消 / 窗口关闭,返回用户提交的标注列表。返回 {session_id, status, reason?, annotations, next?},status 为 done | cancelled | closed | timeout。缺省永不超时(timeout_seconds 不传则一直等待直到用户提交/取消/关闭窗口,或 agent 退出);如客户端对单次调用有超时上限,可传 timeout_seconds 设一个安全值,被截断或超时后再次调用本工具继续等待即可(会话在服务端持续存在,不会因单次调用被截断而取消)。status=closed 表示标注窗口已关闭:reason=window_closed/page_unload 是用户主动关闭——本轮标注流程已结束,不要再调用本工具或 annotate_document(除非用户明确要求继续),直接总结结果即可;reason=window_lost(窗口崩溃/被强杀)或 agent_cancelled/agent_exited 时才考虑询问用户是否重开。status=done 且存在标注时:处理这些标注时请在 apply_edit / template_replace / find_replace / restore_version 中带上本返回值中的 session_id(确保标注窗口重载到正确的会话,多对话共享同一 server 时尤为重要);处理完后(窗口会自动重载修改后的内容)应再次调用本工具等待用户下一轮标注。status=done 且标注为空:用户确认本轮无需修改,标注流程已结束(窗口已自动关闭),不要再调用本工具或 annotate_document,直接总结结果即可。
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 标注会话 ID(annotate_document 返回) | |
| timeout_seconds | No | 本次等待超时秒数,默认 1800(30 分钟);若客户端有工具超时上限请设一个安全值并轮询调用 |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
annotate_document - First observed
apply_edit - First observed
cancel_session - First observed
find_replace - First observed
list_versions - First observed
preview_edits - First observed
read_location - First observed
read_structure - First observed
restore_version - First observed
template_replace - First observed
wait_for_annotations
TDQS
Scored across 11 tools
Most tools have clearly distinct roles in the read-annotate-edit-version workflow. The main ambiguity is among apply_edit, find_replace, and template_replace, which all modify documents, though their descriptions clarify different use cases.
Tool names are consistently lowercase snake_case and mostly follow a verb_noun pattern like read_location, apply_edit, and list_versions. template_replace and find_replace deviate slightly from the verb-first style, but the naming remains predictable and readable.
11 tools is well within the ideal range, and each tool covers a necessary part of the fine-tuning workflow: reading, annotating, waiting, editing, previewing, and versioning. There are no obvious filler or redundant tools.
The toolset covers the full annotation loop: open a session, wait for annotations, apply edits, preview changes, and roll back via versions. Features like document creation or export are outside the stated fine-tuning purpose, so no significant gaps are apparent.
Maintenance
Related MCP Connectors
Convert, create and edit Word, PowerPoint, Excel and PDF documents from any AI agent.
Online office suite for AI agents: edit docs, sheets, slides and PDFs in browser or via MCP.
Create and improve live, shared interactive documents with your agent.
Real Word and Excel for agents: open your .docx/.xlsm, read, propose, apply, get it back intact.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to directly read, edit, and manipulate Word documents, supporting image and table operations, paragraph editing, and search/replace.202MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to edit Microsoft Word documents in real time, supporting tracked changes, comments, formatting, and per-action undo across 124 tools.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to create and edit Office documents, presentations, and spreadsheets, as well as generate diagrams, charts, citations, and research project structures.14ISC
- AlicenseAqualityBmaintenanceEnables automation, inspection, and modification of Excel, Word, and PowerPoint documents through natural language, with safety features such as sandboxing, snapshots, and automatic rollback.19MIT