Release wordcraft-mcp and gridcraft-mcp 0.3.0: client-neutral skills, Cursor plugins.
This commit is contained in:
1 parent
debdf92877
commit
4c7e3ff720
26 files changed
+1008
-236
No files matched your search
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: wordcraft-mcp
|
||||
description: Word-Dokumente (.docx, .odt, .md, PDF) über den WordCraft-MCP-Server erstellen, bearbeiten und prüfen, inkl. Nachverfolgung – mit erprobten Fallen aus WordCraft 0.8.0.
|
||||
description: "Word-Dokumente (.docx, .odt, .md, PDF) mit dem WordCraft-MCP-Server erstellen, bearbeiten und prüfen (inkl. Nachverfolgung). Verwenden, wenn WordCraft-Werkzeuge verbunden sind oder der Nutzer WordCraft nennt; typisch für Angebote, Briefe, Betriebsanleitungen, Arbeitsanweisungen, 8D-Reports, Vorlagen. Nicht für eingebaute docx-Hilfen ohne WordCraft-Server."
|
||||
---
|
||||
|
||||
# Dokumente mit WordCraft (MCP)
|
||||
@@ -9,25 +9,11 @@ WordCraft ist ein Open-Source-Textverarbeitungsprogramm (Rust), das Word-Paritä
|
||||
|
||||
## Voraussetzung
|
||||
|
||||
Die Werkzeuge heißen `list_commands`, `execute`, `render_page` … mit einem Präfix, der vom Client und vom Namen der Erweiterung abhängt (z. B. `mcp__…__WordCraft_for_Claude__list_commands`). Sind sie zurückgestellt, per ToolSearch nach dem Werkzeugnamen ohne Präfix suchen (z. B. `list_commands`) und alle benötigten in einem Aufruf laden. Fehlen sie auch dann, dem Nutzer den Grund nennen statt auszuweichen.
|
||||
|
||||
**Standardweg:** WordCraft aus dem ArtCraft-Launcher und die Claude-Desktop-Erweiterung „WordCraft for Claude“ sind installiert und eingeschaltet (siehe `docs/INSTALLATION.md`). Fehlen die Tools: ArtCraft-Installation und Einstellungen → Erweiterungen prüfen, Claude komplett beenden (auch Taskleiste) und neu starten – nicht auf ein anderes Programm ausweichen.
|
||||
|
||||
**Alternative (Entwickler):** Eintrag `wordcraft` in `claude_desktop_config.json` mit `wordcraft-cli.exe mcp --author Claude --automation-read-root <Ordner> --automation-write-root <Ordner>\claude_out`. Store-Pfad: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\`. Die App kann den Eintrag beim Speichern eigener Einstellungen überschreiben – dann neu eintragen und sofort neu starten.
|
||||
|
||||
Alternativ laufende App steuern (nicht auf Ordner beschränkt): `wordcraft --control 7981` und `wordcraft-cli mcp --connect 127.0.0.1:7981`.
|
||||
Die Werkzeuge `list_commands`, `execute`, `render_page` … müssen verbunden sein. Ihr Präfix hängt vom Client und vom Namen der Erweiterung bzw. des Servers ab (z. B. `mcp__…__WordCraft_for_Claude__list_commands`). Sind sie zurückgestellt, nach dem Werkzeugnamen ohne Präfix suchen und alle benötigten auf einmal laden. Fehlen sie, dem Nutzer sagen, dass der Server nicht verbunden ist (Einrichtung siehe README), statt auf ein anderes Programm auszuweichen.
|
||||
|
||||
## Freigaben
|
||||
|
||||
Der eigentliche Schutz sind `--automation-read-root` und `--automation-write-root`, nicht die Freigabe-Dialoge. Empfohlene Tool-Berechtigungen im Connector:
|
||||
|
||||
- Immer erlauben: `list_commands`, `get_text`, `inspect_document`, `render_page`, `open_document`, `select_text`, `new_document`, `parity`, `execute`, `batch`, `type_text`
|
||||
- Optional nachfragen: `save_document` (nur bedingt wirksam, da `execute` mit `file.saveAs`/`file.exportPdf` ebenfalls speichern kann)
|
||||
- Nie: `screenshot`, `click`, `key`, `ui_inspect` (nur für `--connect`, dort ohne Ordnergrenzen)
|
||||
|
||||
„Immer erlauben“ ist nur sicher, solange die Config die Root-Argumente enthält und kein `--connect` verwendet. Nach jedem Neueintrag prüfen.
|
||||
|
||||
Aufrufe sparen: genaue Dateipfade vom Nutzer erfragen statt zu raten, zusammenhängende Schritte immer als `batch`.
|
||||
Schutz durch Lese- und Schreib-Root (nicht die Freigabe-Dialoge). Lesen weit, Schreiben eng. Zusammenhängende Schritte immer als `batch`. Genau Dateipfade vom Nutzer erfragen statt zu raten.
|
||||
|
||||
## Tools
|
||||
|
||||
@@ -43,23 +29,24 @@ Aufrufe sparen: genaue Dateipfade vom Nutzer erfragen statt zu raten, zusammenh
|
||||
| `get_text` / `inspect_document` | Dokument zurücklesen (Struktur als JSON, inkl. Kopf-/Fußzeilen unter `parts`) |
|
||||
| `render_page` | Seite als PNG |
|
||||
| `parity` | Funktionsabdeckung gegenüber Word |
|
||||
| `screenshot`, `click`, `key`, `ui_inspect` | nur mit `--connect` |
|
||||
| `screenshot`, `click`, `key`, `ui_inspect` | nur mit verbundener Desktop-App |
|
||||
|
||||
## Arbeitsweise
|
||||
|
||||
1. **Befehls-IDs nie raten.** Vor jedem unbekannten Befehl `list_commands` mit `query` aufrufen (z. B. `table.`, `insert.`, `layout.`, `styles.`, `review`, `caret.`). Präfix mit Punkt filtert gezielter.
|
||||
2. **Formatvorlagen statt Direktformatierung.** `styles.modify` an Normal/Heading1/Heading2/Title; Absätze nur per `para.set {"props":{"style":"Heading1"}}` zuweisen.
|
||||
3. **Gebündelt arbeiten.** Zusammenhängende Schritte als `batch`.
|
||||
4. **Prüfen, bevor gespeichert wird.** `inspect_document` für Inhalt/Struktur/Kopf-Fußzeilen, `render_page` für Layout.
|
||||
1. **Befehls-IDs nie raten.** Vor jedem unbekannten Befehl `list_commands` mit `query` aufrufen (z. B. `table.`, `insert.`, `layout.`, `styles.`, `review`, `caret.`, `select.`).
|
||||
2. **Alles im batch.** Auch Markieren: `select.text {text, occurrence?}`, `select.range {anchor: Pos, focus: Pos}`, `select.collapse`. `text.insert` ersetzt eine bestehende Markierung. Damit lassen sich ganze Dokumente in wenigen Aufrufen umbauen.
|
||||
3. **Formatvorlagen statt Direktformatierung.** `styles.modify` an Normal/Heading1/Heading2/Title; Absätze nur per `para.set {"props":{"style":"Heading1"}}` zuweisen.
|
||||
4. **Prüfen, bevor gespeichert wird.** `inspect_document`, `render_page`.
|
||||
5. **Speichern** mit `save_document` in den Schreibordner; PDF per Endung `.pdf`.
|
||||
6. **Rundreise prüfen:** gespeicherte Datei neu öffnen und `inspect_document`/`render_page` bzw. `review.changes` erneut aufrufen.
|
||||
6. **Rundreise prüfen:** gespeicherte Datei neu öffnen und erneut prüfen.
|
||||
|
||||
## Dateien finden
|
||||
## Dateien finden und Zugriff
|
||||
|
||||
Es gibt **keinen Befehl zum Auflisten von Ordnern**. `open_document` auf einen Pfad:
|
||||
- `os error 5 (Zugriff verweigert)` → Pfad ist ein existierender Ordner
|
||||
- `os error 2 (nicht gefunden)` → existiert nicht
|
||||
Damit lassen sich Ordner bestätigen, aber keine Dateinamen ermitteln. Bei Unklarheit den Nutzer nach dem genauen Dateinamen fragen statt viele Namen zu raten.
|
||||
|
||||
Liegt eine Datei **außerhalb des Lese-Ordners**, wird sie abgelehnt. Dann: (a) Nutzer bitten, den Lese-Ordner in den Einstellungen weiter zu fassen, oder (b) – wenn der Client Dateizugriff mit Nutzerfreigabe hat – die Datei mit Freigabe in den Arbeitsordner **kopieren** und nur mit der Kopie arbeiten. Original nie überschreiben.
|
||||
|
||||
## Neues Dokument – Grundeinrichtung (DE)
|
||||
|
||||
@@ -72,12 +59,24 @@ Damit lassen sich Ordner bestätigen, aber keine Dateinamen ermitteln. Bei Unkla
|
||||
```
|
||||
Ohne de-DE zeigt `render_page` deutsche Wörter mit roten Wellenlinien.
|
||||
|
||||
Text aufbauen: `para.set {style}` → `text.insert` → `text.newParagraph`, Stil für jeden Absatz explizit setzen. Aufzählung: `para.bullets {"kind":"bullet"}` vor dem ersten Punkt, `para.bullets {"off":true}` danach (hinterlässt `numbering num 0` am nächsten Absatz – harmlos).
|
||||
Text aufbauen: `para.set {style}` → `text.insert` → `text.newParagraph`, Stil für jeden Absatz explizit setzen.
|
||||
|
||||
## Fallen (im Test bestätigt)
|
||||
|
||||
- **`format.set` ohne Markierung** wirkt nicht auf den gerade eingefügten Text, sondern auf den folgenden Absatz. Immer erst markieren (`select.text` / `select.range`), dann formatieren.
|
||||
- **Nummerierte Listen:** `para.numbering {"kind":"numbered"}` (auch `numberedParen`, `upperLetter`, `lowerLetter`, `lowerRoman`, `outline`). `para.bullets {"kind":"decimal"}` nimmt „decimal“ still als Aufzählungszeichen. Ende: `para.numbering {"off":true}`. Aufzählung: `para.bullets {"kind":"bullet"}` … `para.bullets {"off":true}`.
|
||||
- **`table.insertRowBelow`** übernimmt Ausrichtung und Fettdruck der Nachbarzeile nicht → danach `para.set {align}` und `format.set` setzen.
|
||||
- **Absätze mit gemischtem Format** (z. B. fettes Label + Tab + Wert): nicht den ganzen Absatz ersetzen (sonst übernimmt alles das Format des ersten Laufs), sondern nur den Wertteil per `select.text`.
|
||||
- **`inspect_document`:** `len` und alle `off` sind **UTF-8-Bytes** (ä/ö/ü/ß = 2). Für Textstellen mit Umlauten lieber `select.text` als selbst berechnete Offsets.
|
||||
- **Absätze löschen:** von **unten nach oben** arbeiten; `select.range` vom Ende (`off = len`) des letzten verbleibenden Absatzes bis zum Ende des letzten zu löschenden Absatzes, dann `text.delete`. Indizes danach neu berechnen.
|
||||
- **Hinweiskasten:** `para.set {"props":{"shading":[r,g,b],"borders":{"top":{…},"bottom":{…},"left":{…},"right":{…}}}}`; im nächsten Absatz zurücksetzen (`shading` weiß, `borders` style none).
|
||||
- **Abstand vor einem Absatz:** `para.set {"props":{"style":"Normal","spaceBefore":24}}`.
|
||||
- **Gelbe Platzhalter-Markierung** (`format.set {"props":{"highlight":"yellow"}}`) bleibt beim Überschreiben erhalten – Nutzer bei Vorlagen darauf hinweisen (Word: Strg+A → Texthervorhebung „Keine Farbe“).
|
||||
|
||||
## Kopf- und Fußzeile, Seitenzahl
|
||||
|
||||
- Nach `insert.header` / `insert.footer` **sofort** `insert.closeHeader`, sonst landet folgender Text in der Kopf-/Fußzeile.
|
||||
- `insert.footer {"text": ...}` setzt die Schreibmarke **an den Anfang** des Textes – nachfolgende Einfügungen landen davor. `preset: "blank"` legt einen Platzhalter „[Type here]“ an. Deshalb **ohne Parameter** öffnen und dann tippen:
|
||||
- `insert.footer {"text": ...}` setzt die Schreibmarke **an den Anfang** des Textes. `preset: "blank"` legt „[Type here]“ an. Deshalb **ohne Parameter** öffnen und dann tippen:
|
||||
```json
|
||||
[{"command":"insert.footer"},
|
||||
{"command":"text.insert","params":{"text":"Seite "}},
|
||||
@@ -87,43 +86,67 @@ Text aufbauen: `para.set {style}` → `text.insert` → `text.newParagraph`, Sti
|
||||
{"command":"para.set","params":{"props":{"align":"center"}}},
|
||||
{"command":"insert.closeHeader"}]
|
||||
```
|
||||
- Für reinen Text in der Kopfzeile ist `insert.header {"text": ...}` + `insert.closeHeader` in Ordnung.
|
||||
- Kontrolle: `inspect_document` → `parts[]` mit `kind: header/footer`. Fehler korrigieren mit `insert.removeFooter` und neu aufbauen.
|
||||
- Kontrolle: `inspect_document` → `parts[]` mit `kind: header/footer`.
|
||||
|
||||
## Tabellen
|
||||
|
||||
- `insert.table {"rows":n,"cols":n,"style":"TableGrid"}` liefert `{"table":[index]}` = Blockindex.
|
||||
- Zellen **nicht per Tab** füllen, sondern anspringen: `caret.set {"pos":{"path":[tabelle, zeile, spalte, 0],"off":0,"story":"body"}}` dann `text.insert`.
|
||||
- Kopfzeile: Caret in Zeile 0 → `table.properties {"headerRow":true}`, `table.selectRow`, `table.shading {"color":"D9E2F3"}`, `format.set {"props":{"bold":true}}`.
|
||||
- `table.columnWidth` ändert **nur die Spalte der Schreibmarke**; die Tabelle wird dadurch schmaler/breiter. Alle Spalten so setzen, dass die Summe = Satzspiegel (pageW − marginLeft − marginRight; A4 mit 2,5/2 cm ≈ 467,7 pt).
|
||||
|
||||
## Positionen
|
||||
|
||||
- `off` in Positionen zählt **UTF-8-Bytes**, nicht Zeichen (ä/ö/ü/ß = 2, ▬ oder – = 3). Für Textstellen mit Umlauten lieber `select_text` als selbst berechnete Offsets.
|
||||
- Kommentaranker und andere Objekte belegen Positionen im Absatz; nach `review.newComment` Offsets neu ermitteln.
|
||||
- `table.columnWidth` ändert **nur die Spalte der Schreibmarke**. Alle Spalten so setzen, dass die Summe = Satzspiegel (A4 mit 2,5/2 cm ≈ 467,7 pt).
|
||||
|
||||
## Überarbeitung fremder Dokumente (Nachverfolgung)
|
||||
|
||||
1. Original nur öffnen, nie darauf speichern; erste Speicherung sofort mit neuem Namen in den Schreibordner.
|
||||
2. `file.setAuthor {"name":"Claude"}` und `review.trackChanges {"value": true}` – **immer mit value**; ohne schaltet der Befehl um und kann die Nachverfolgung ausschalten.
|
||||
3. Ersetzen: `select_text` → `type_text`. Ergebnis ist Einfügung + Löschung (ganzes Wort).
|
||||
4. **`select_text` findet auch bereits nachverfolgt gelöschten Text.** Nach einer Ersetzung nicht erneut nach dem alten Wortlaut suchen; zum Markieren das neue Wort verwenden.
|
||||
2. `file.setAuthor {"name":"…"}` und `review.trackChanges {"value": true}` – **immer mit value**.
|
||||
3. Ersetzen: `select_text` → `type_text`. Ergebnis ist Einfügung + Löschung.
|
||||
4. **`select_text` findet auch bereits nachverfolgt gelöschten Text.** Nach einer Ersetzung nicht erneut nach dem alten Wortlaut suchen.
|
||||
5. Begründungen als Kommentar: Text markieren, `review.newComment {"text": ...}`.
|
||||
6. Prüfen: `review.changes` (Liste mit author, kind, text) und `review.comments` – auch nach dem Neuöffnen der gespeicherten Datei.
|
||||
6. Prüfen: `review.changes` und `review.comments` – auch nach dem Neuöffnen.
|
||||
|
||||
## Rezepte
|
||||
|
||||
Platzhalter-Konvention: `{{Feldname}}` (Jinja2-kompatibel).
|
||||
|
||||
### 1. Neues Dokument
|
||||
|
||||
A4, Ränder, de-DE, Formatvorlagen Title/Heading1/Heading2/Normal anpassen → Inhalt aufbauen → Kopfzeile → Fußzeile „Seite x von y“ → Tabelle mit Kopfzeile → nummerierte Liste (`para.numbering`) → ggf. Hinweiskasten → `render_page` → speichern.
|
||||
|
||||
### 2. Vorlage aus bestehendem Dokument
|
||||
|
||||
Kopie im Lese-Ordner öffnen → `inspect_document` → Löschungen von unten nach oben → Ersetzungen per `select.range` (Absatzindex) bzw. `select.text` (Teilstücke) → Platzhalter `{{Feldname}}` gelb markieren → `get_text` prüfen, dass keine Ursprungsdaten (Namen, Adressen, Preise) übrig sind → unter neuem Namen speichern.
|
||||
|
||||
### 3. Vorlage füllen
|
||||
|
||||
Vorlage öffnen → Felder per `select.text "{{Feld}}"` + `text.insert` im batch ersetzen → wiederholbare Listenpunkte ergänzen/löschen → Markierung entfernen → `get_text` auf `{{` prüfen → rendern → unter neuem Namen speichern (.docx + .pdf).
|
||||
|
||||
## Abschlussprüfung
|
||||
|
||||
- Alle Seiten mit `render_page` ansehen; Seitenzahl plausibel.
|
||||
- Bei Vorlagen/gefüllten Dokumenten: `get_text` auf `{{` bzw. Altdaten prüfen.
|
||||
- Gespeicherte Datei neu öffnen und kurz gegenlesen.
|
||||
- Pfad dem Nutzer nennen.
|
||||
|
||||
## Datenschutz
|
||||
|
||||
- Grün: allgemeine/technische Inhalte ohne Kundenbezug.
|
||||
- Gelb: Projekt-/Geschäftsinfos, Preise (oft vertraulich) nur nach Abwägung oder anonymisiert.
|
||||
- Rot: personenbezogene Daten (Ansprechpartner, E-Mail, Telefon) und NDA-Inhalte nicht in die Cloud-KI.
|
||||
- Vorlagen aus **geschwärzten** Kopien erstellen; im Freitext Platzhalter statt echter Namen verwenden.
|
||||
|
||||
## Eigenschaften (Kurzreferenz)
|
||||
|
||||
Längen in Punkt, Farben als `"#RRGGBB"`, `[r,g,b]` oder `{"Rgb":[r,g,b]}`; bei Tabellenbefehlen `"RRGGBB"` ohne #. Unbekannte Feldnamen werden **still ignoriert**.
|
||||
|
||||
- Zeichen (`format.set {"props": …}`): `font`, `size`, `bold`, `italic`, `underline`, `color`, `highlight`, `vertAlign`, `lang`, `link`
|
||||
- Absatz (`para.set {"props": …}`): `style`, `align`, `indentLeft`, `indentFirst`, `spaceBefore`, `spaceAfter`, `lineSpacing` (`{"rule":"multiple","value":1.15}`), `keepNext`, `keepLines`, `pageBreakBefore`, `outlineLevel`, `numbering`, `tabs`, `borders`
|
||||
- Absatz (`para.set {"props": …}`): `style`, `align`, `indentLeft`, `indentFirst`, `spaceBefore`, `spaceAfter`, `lineSpacing` (`{"rule":"multiple","value":1.15}`), `keepNext`, `keepLines`, `pageBreakBefore`, `outlineLevel`, `numbering`, `tabs`, `borders`, `shading`
|
||||
|
||||
## Renderer-Grenzen (0.8.0)
|
||||
|
||||
Bekannte Darstellungsfehler von `render_page`, die **nicht** von eigenen Änderungen kommen:
|
||||
- mehrzeilige Zellen in dunkel hinterlegten Tabellenköpfen zeigen nur die letzte Zeile
|
||||
- Seitenzahlfelder in Fußzeilen importierter python-docx-Dokumente bleiben leer
|
||||
Bei Auffälligkeiten erst das Original rendern und vergleichen, bevor man die eigene Änderung verdächtigt.
|
||||
|
||||
Bei Auffälligkeiten erst das Original rendern und vergleichen.
|
||||
|
||||
## Word-Kompatibilität
|
||||
|
||||
@@ -133,5 +156,5 @@ Bei Auffälligkeiten erst das Original rendern und vergleichen, bevor man die ei
|
||||
|
||||
## Grenzen
|
||||
|
||||
- Die Ordnerbeschränkung gilt nur headless; mit `--connect` ist die App nicht eingeschränkt.
|
||||
- Die Ordnerbeschränkung gilt nur headless; mit verbundener Desktop-App entfällt sie.
|
||||
- Befehle ohne Pfad wirken immer auf das zuletzt geöffnete Dokument. Vor dem Öffnen eines anderen Dokuments speichern.
|
||||
Reference in new issue
Block a user