Skip to main content
Glama

doc-agent-mcp

CI PyPI Python License: MIT

Ein Model Context Protocol-Server, der KI-Agenten stabile, semantische Operationen auf Dokumenten bietet – anstatt sie rohen Text hin- und herschieben zu lassen.

Human ─────┐
           ↓
        Document          ← Markdown (.md/.markdown) and DOCX today,
           ↑                 Tiptap / SuperDoc / Shimo / Google Docs tomorrow
AI Agent ──┘

LLM-Agenten, die Dokumente als einen großen String bearbeiten, zerstören Dinge: Sie verunstalten Formatierungen, die sie nicht sehen können, verlieren Bilder und Kommentare und können nicht ausdrücken „einen Absatz nach Abschnitt 3 einfügen“. doc-agent-mcp stellt das Dokument als normalisierte, adressierbare Struktur dar (Überschriften, Absätze, Listenelemente, Tabellen mit stabilen IDs) und ermöglicht Agenten, in einer sicheren Schleife zu arbeiten:

read  →  propose change  →  inspect diff  →  apply  →  export

Nichts berührt Ihre Datei, bis apply_changes aufgerufen wird. Jeder Lesevorgang akzeptiert einen doc_hash, sodass, wenn sich die Datei während der Aufgabe unter dem Agenten ändert, weitere Bearbeitungen lautstark fehlschlagen (stale_document), anstatt die Datei zu beschädigen.


Das Problem, das dies löst

Rohtext-Bearbeitung (heutzutage üblich)

doc-agent-mcp

Agent schreibt die gesamte Datei neu, um ein Wort zu ändern

Agent ersetzt einen exakten Zeichenbereich in einem Block

DOCX-Roundtrips durch Textkonverter zerstören Stile/Kommentare

Bearbeitungen werden im ursprünglichen OOXML-Paket angewendet; unberührter Inhalt wird durchgereicht

Keine Möglichkeit zu überprüfen, was sich ändern wird, bevor es sich ändert

Jede Bearbeitung wird mit einem Unified Diff bereitgestellt; Anwenden ist explizit

Stille Konflikte, wenn Menschen gleichzeitig bearbeiten

Optimistisches Sperren per Inhalts-Hash; veraltete Bearbeitungen werden abgelehnt

Format-spezifische Hacks, die in Prompts fest verdrahtet sind

Eine Tool-Oberfläche, beliebiges Backend

Related MCP server: docx-mcp-server

Architektur

MCP interface (13 tools)
        ↓
Document operation layer      ← staging, diffs, hashes, search, sessions
        ↓                          (doc_agent_mcp/service.py)
Normalized document model     ← Block(h-0, p-1, li-2, tbl-0), Comment,
        ↓                          ProposedChange   (core/model.py)
Backend adapters              ← parse() + serialize() per format
        ↓                          (adapters/*_adapter.py)
Markdown · DOCX · future editors (Tiptap, SuperDoc, Shimo, Google Docs)

Wichtige Eigenschaft: Die MCP-Tools wissen nie, welches Backend darunterliegt. Das Hinzufügen eines neuen Editor-Backends bedeutet, zwei Methoden zu implementieren – siehe ADAPTER_GUIDE.md.

Installation

Von PyPI (empfohlen für Benutzer):

pip install doc-agent-mcp

Erfordert Python 3.10+.

Aus dem Quellcode (Entwicklung):

git clone https://github.com/xyyyang97/doc-agent-mcp.git
cd doc-agent-mcp

python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"

Überprüfen:

doc-agent-mcp --version
# doc-agent-mcp 0.1.0

MCP-Konfiguration

Der Server spricht standardmäßiges MCP über stdio.

Claude Desktop

claude_desktop_config.json:

{
  "mcpServers": {
    "doc-agent": {
      "command": "/absolute/path/to/doc-agent-mcp/.venv/bin/doc-agent-mcp",
      "args": ["--roots", "/Users/you/Documents"]
    }
  }
}

Claude Code / Codex CLI

claude mcp add doc-agent -- /absolute/path/to/doc-agent-mcp/.venv/bin/doc-agent-mcp --roots ~/Documents

Generischer MCP-Client (JSON)

{
  "mcpServers": {
    "doc-agent": {
      "command": "/absolute/path/to/doc-agent-mcp/.venv/bin/doc-agent-mcp",
      "args": [],
      "env": {}
    }
  }
}

--roots DIR [DIR ...] schränkt optional alle Lese-/Schreibvorgänge auf diese Verzeichnisse ein (empfohlen). Ohne diese Option kann der Server jeden Pfad berühren, den sein Prozess erreichen kann – behandeln Sie die Serverkonfiguration wie Dateisystem-Anmeldeinformationen.

Verfügbare Tools

Leseoperationen (mutieren nie)

Tool

Zweck

read_document(path, section_id?, include_spans?, doc_hash?)

Strukturierte Blöcke mit IDs; optionale Einzelabschnittsansicht; meldet unmodeled_features

get_outline(path, doc_hash?)

Überschriften flach + verschachtelter Baum mit Pfaden

find_text(path, query, scope_element_id?, is_regex?, case_sensitive?, doc_hash?)

Exakte Vorkommen mit (element_id, start, end)-Offsets, bereit für propose_replace_text; Tabellentreffer als editable: false markiert

get_comments(path, doc_hash?)

Native Kommentare (Autor, Text, Ankerelement, zitierter Bereich)

Vorschlagsoperationen (Änderung stufen; noch nichts geschrieben)

Tool

Zweck

propose_replace_text(path, element_id, start, end, text)

Zeichenbereich innerhalb eines Blocks ersetzen; gibt Diff-Vorschau zurück

propose_insert_block(path, anchor_id, position, kind, text, level?)

Absatz/Überschrift/Listenelement vor oder nach einem beliebigen Element einfügen (deckt Einfügen-vor/nach/Anhängen ab)

propose_delete_block(path, element_id)

Einen ganzen Block löschen

propose_add_comment(path, anchor_id, body, quote?, author?)

Nativer Word-Kommentar (DOCX); nur für die Sitzung bei Markdown (siehe Einschränkungen)

Committen & Überprüfen

Tool

Zweck

get_changes(path)

Alle bereitgestellten Änderungen mit Unified Diffs

discard_changes(path, change_ids?)

Bereitgestellte Änderungen verwerfen (alle oder ausgewählte)

apply_changes(path, change_ids?, doc_hash?)

Atomar auf die Festplatte schreiben; gibt neuen doc_hash + Warnungen zurück

export_document(path, target_format, output_path?, title?)

Über das Modell konvertieren: md↔docx in beide Richtungen

list_backends()

Registrierte Backends und unterstützte Konvertierungen

Jeder mutierende/Lese-Aufruf akzeptiert den doc_hash, den Sie vom vorherigen Aufruf erhalten haben. Wenn sich die Datei seitdem geändert hat (auch durch einen anderen Prozess), erhalten Sie {"code": "stale_document", ...} und Ihre bereitgestellten Änderungen werden verworfen – lesen Sie zuerst erneut.

Beispiel-Workflow

Dies ist die exakte Schleife, die examples/demo_workflow.py ausführt (gegen echte Dateien):

from doc_agent_mcp.service import DocumentService

svc = DocumentService()                      # same facade the MCP tools wrap

# 1. Understand the document
outline = svc.get_outline("brief.md")
summary = next(h for h in outline["headings"] if h["title"] == "Executive Summary")
section = svc.read_document("brief.md", section_id=summary["id"])

# 2. Locate exact text
hit = svc.find_text("brief.md", "30 percent")["matches"][0]

# 3. Stage a change (file is untouched)
proposal = svc.propose_replace_text(
    "brief.md", hit["element_id"], hit["start"], hit["end"],
    "at least 30 percent (validated with finance)",
)

# 4. Review the diff
changes = svc.get_changes("brief.md")
print(changes["changes"][0]["diff"])

# 5. Commit, then export
svc.apply_changes("brief.md", doc_hash=proposal["doc_hash"])
svc.export_document("brief.md", "docx", output_path="brief.docx")

Über MCP sind dieselben Schritte jeweils ein Tool-Aufruf – siehe Tool-Tabelle oben.

Führen Sie die vollständige Demo aus (Markdown + DOCX + Export + Stale-Guard, alles verifiziert):

.venv/bin/python examples/demo_workflow.py

Beispieldokumente befinden sich in examples/documents/: sample.md und sample.docx (letzteres mit zwei nativen Word-Kommentaren, regenerierbar über scripts/make_sample_docx.py).

Fehlerbehandlung

Alle Fehler sind strukturiertes JSON – keine Tracebacks über die Leitung:

{
  "code": "element_not_found",
  "message": "Element 'p-99' not found. Call get_outline ...",
  "details": {"element_id": "p-99"}
}

Code

Bedeutung

document_not_found

Pfad existiert nicht

unsupported_format

Kein Backend für diese Erweiterung

element_not_found

Veraltete/unbekannte Element-ID

match_not_found / ambiguous_match

Suche hat nichts gefunden / für Disambiguierung reserviert

validation_error

Ungültiger Bereich, ungültiger Zitat-Anker, Tabellenzellen-Ersetzung, Pfad außerhalb der Wurzeln...

stale_document

Datei hat sich seit Ihrer Momentaufnahme geändert; bereitgestellte Änderungen wurden verworfen

change_not_found

Unbekannte oder bereits verworfenen change_id

export_error

Nicht unterstütztes Konvertierungspaar

Testen

.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest                 # unit + integration + MCP protocol tests
.venv/bin/ruff check src tests   # lint
.venv/bin/ruff format --check .  # formatting
.venv/bin/mypy                   # strict type checking

Die Suite enthält DOCX-Roundtrip-Tests (Bearbeitungen werden durch erneutes Öffnen der gespeicherten Datei mit python-docx und auf roher OOXML-Ebene verifiziert) sowie einen End-to-End-MCP-Test, der den Server über stdio startet und echte Protokollnachrichten spricht.

Einschränkungen (mit Absicht, nicht aus Versehen)

Das normalisierte Modell deckt ab, was Markdown und DOCX zuverlässig darstellen können. Alles andere wird explizit als unmodeled_features bei jedem Lesevorgang angezeigt – nie stillschweigend zerstört:

  • DOCX: Bilder/Zeichnungen, Kopf- und Fußzeilen, Fußnoten/Endnoten, Inhaltssteuerelemente, nachverfolgte Änderungen in der Quelle werden unberührt erhalten, sind aber für das Modell unsichtbar. Tabellen sind reine Textzellen (Zellenformatierung nicht modelliert). replace_text lehnt Absätze mit Hyperlinks ab (die Umschreibung würde sie zerstören).

  • Markdown: Die Serialisierung ist modelltreu, nicht bytetreu – Inhalte überleben Roundtrips, die ursprüngliche Zeilenumbruch-/Markierungsstil kann es nicht. Blockzitate werden auf ihre Absätze reduziert (gekennzeichnet). Referenzstil-Linkdefinitionen werden aufgelöst und inline eingefügt. Kommentare haben keine native Heimat: propose_add_comment speichert sie nur für die Sitzung und weist darauf hin.

  • Tabellen: durchsuchbar (als editable: false gekennzeichnet), aber Zellenebene-Bearbeitung ist noch nicht implementiert – stattdessen löschen/neu einfügen.

  • Gleichzeitige Agenten: Letzter Schreiber gewinnt pro Datei, abgesichert durch Hash-Prüfungen; es gibt keine Merge-Engine.

Roadmap-Ideen

  • Tabellenzellen-Operationen (update_table_cell)

  • Tiptap/SuperDoc-Adapter über ihre JSON-Modelle

  • Google-Docs-Adapter über Drive-API (Kommentare werden nativ abgebildet)

  • Verankerter Vorschlagsmodus für Markdown (<!-- suggestion -->-Blöcke)

  • Multi-Datei-Arbeitsbereiche und umbenennungssichere Sitzungen

Lizenz

MIT

A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Persistent docs and memory for AI agents — read, write, organize & search a shared workspace.

  • MCP-native collaborative markdown editor with real-time AI document editing

  • AI document editing for agents: draft, edit, export .docx/PDF. 37 MCP tools; agent self-signup.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/xyyyang97/doc-agent-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server