Compare commits

...
105 changed files with 5397 additions and 280 deletions

No files matched your search

+40 -69
View File
@@ -1,13 +1,13 @@
# Mitarbeiten # Mitarbeiten
Einen Skill ohne Git installieren: ZIP aus der Tabelle in der [README](README.md) laden und in Claude hochladen. Dieser Text ist für alle, die einen Skill anlegen oder aktualisieren. Einen Skill ohne Git installieren: ZIP aus der Tabelle in der [README](README.md) laden und in Claude hochladen; für Cursor das Cursor-Plugin-ZIP. Dieser Text ist für alle, die einen Skill anlegen oder aktualisieren.
## Aufbau eines Skills ## Aufbau eines Skills
``` ```
skills/<name>/ skills/<name>/
├── SKILL.md Pflicht – Anweisungen für Claude (liegt im ZIP) ├── SKILL.md Pflicht – Anweisungen für den Agenten (liegt im ZIP; clientneutral)
├── README.md Pflicht – Doku für Menschen (nicht im ZIP) ├── README.md Pflicht – Doku für Menschen (nicht im ZIP; Client-Details hier)
├── CHANGELOG.md Pflicht – Versionen (nicht im ZIP) ├── CHANGELOG.md Pflicht – Versionen (nicht im ZIP)
├── extension/ optional – Claude-Desktop-Erweiterung (.mcpb) ├── extension/ optional – Claude-Desktop-Erweiterung (.mcpb)
│ ├── manifest.json │ ├── manifest.json
@@ -15,12 +15,14 @@ skills/<name>/
│ ├── upstream.json von scripts/fetch-cli geschrieben │ ├── upstream.json von scripts/fetch-cli geschrieben
│ ├── LICENSES/ Upstream-Lizenztexte │ ├── LICENSES/ Upstream-Lizenztexte
│ └── server/ CLI-exe nur beim Bauen (nicht committen) │ └── server/ CLI-exe nur beim Bauen (nicht committen)
├── scripts/ optional – Hilfsskripte, die Claude ausführen kann ├── scripts/ optional – Hilfsskripte, die der Agent ausführen kann
├── references/ optional – Nachschlagematerial, das Claude bei Bedarf liest ├── references/ optional – Nachschlagematerial
└── assets/ optional – Vorlagen, Bilder usw. └── assets/ optional – Vorlagen, Bilder usw.
``` ```
`README.md` hat dieselben Abschnitte wie [templates/skill/README.md](templates/skill/README.md): Zweck, Voraussetzungen, Installation, Einrichtung, Stolpersteine, Test, Deinstallation/Update, Link zum Changelog. Skills mit `extension/` beschreiben die Installation über `.mcpb` + ZIP und verweisen auf [docs/INSTALLATION.md](docs/INSTALLATION.md). **Grundsatz:** `SKILL.md` enthält keine clientspezifischen Anweisungen (kein Claude Desktop, Cursor, Store-Pfad, Erweiterungs-UI, ToolSearch-Details). Solche Hinweise gehören in die Skill-README oder `docs/`. So nutzen Claude und Cursor dieselbe `SKILL.md`.
`README.md` hat dieselben Abschnitte wie [templates/skill/README.md](templates/skill/README.md). Skills mit `extension/` beschreiben die Claude-Installation über `.mcpb` + ZIP ([docs/INSTALLATION.md](docs/INSTALLATION.md)) und verweisen für Cursor auf die Wurzel-README / [docs/CURSOR.md](docs/CURSOR.md). Sinnvolle Abschnitte in der SKILL.md: Rezepte, Abschlussprüfung, Datenschutz (Ampel), wenn der Skill MCP-Werkzeuge steuert.
## Regeln ## Regeln
@@ -30,91 +32,60 @@ skills/<name>/
```yaml ```yaml
--- ---
name: <name> name: <name>
description: "Wann dieser Skill verwendet werden soll – ein Satz." description: "Wann dieser Skill verwendet werden soll – Auslöser und Abgrenzung."
--- ---
``` ```
`name` muss dem Ordnernamen entsprechen. `description` ist Pflicht, höchstens 1024 Zeichen, ohne spitze Klammern. Sie entscheidet, wann Claude den Skill benutzt – also beschreiben, *wann* er gebraucht wird, nicht nur *was* er ist. Enthält sie „: “, in Anführungszeichen setzen. Dieselbe `description` erscheint als Kurzbeschreibung in der Tabelle der Wurzel-README. `name` muss dem Ordnernamen entsprechen. `description` ist Pflicht, höchstens 1024 Zeichen, ohne spitze Klammern. Keine clientspezifischen Zusatzfelder. Dieselbe `description` erscheint in der Wurzel-README: der Text vor „Verwenden“ als Kurztext, der Rest kursiv darunter.
- **Kodierung:** UTF-8 ohne BOM, Zeilenenden LF (regelt `.gitattributes`). - **Kodierung:** UTF-8 ohne BOM, Zeilenenden LF (regelt `.gitattributes`).
- **CHANGELOG.md:** Einträge als `## x.y.z (YYYY-MM-DD)`, neuester oben. Der oberste Eintrag ist die aktuelle Version. - **CHANGELOG.md:** Einträge als `## x.y.z (YYYY-MM-DD)`, neuester oben.
## Cursor
Jedes Skill mit `extension/` bekommt beim Build **automatisch ein eigenes Cursor-Plugin** (`dist/<name>-cursor-v<ver>.zip`) und einen Eintrag in der Wurzel-README inkl. 1-Klick-Deeplink. 1:1 zur Claude-Seite: eine `.mcpb` ↔ ein Cursor-Plugin. **Keine Sammel-Plugins.** Build: `scripts/build-cursor` (von `package-all` aufgerufen). Nur `cursor/plugin-template/` liegt im Git; Ausgaben unter `dist/cursor/`.
## Besonderheiten einzelner Server
- **PdfCraft** startet mit `--compact`. Ohne die Option sind es 171 Werkzeuge mit etwa 176 KB Beschreibung. Cursor begrenzt die aktiven Werkzeuge (siehe [docs/CURSOR.md](docs/CURSOR.md)); dieselbe Option steht deshalb auch im Plugin.
- **FigCraft:** `mcp --attach PORT` hängt an der laufenden App (`figcraft --control PORT`) und lehnt die Ordner-Flags ab. Die Erweiterung setzt die Ordner und damit kein `--attach`.
- **VectorCraft:** ohne Ordner-Argumente versucht der Server zuerst `127.0.0.1:7979` und fällt sonst auf kopflos zurück. Mit Lese- und Schreib-Ordner läuft er kopflos. Die Cursor-Übersetzung muss diese Argumente übernehmen.
- **SolidCraft:** eigener Installer, nicht der ArtCraft-Launcher. Zwei `--allow-path`, kein `--allow-any-path`. Die Erweiterung startet ohne `--connect` (kopflos). `--connect 127.0.0.1:PORT` steuert die App (`solidcraft --control PORT`); ohne lauschende App scheitern die Entwurfswerkzeuge. `solvecraft-cli.exe` ist nur ein Alias.
- **CADCraft:** `mcp` kopflos. Optional `mcp --connect HOST:PORT` (`--lazy`, `--launch`). Keine Ordner-Flags.
- **EffectCraft:** `mcp --empty` mit Lese- und Schreib-Ordner. `--autosave` und `--bridge PORT` schließen sich aus.
- **FilmCraft:** `mcp` kopflos, keine Ordner-Flags. An die App: `--bridge 127.0.0.1:PORT` vor dem Unterbefehl `mcp`.
- **Schreib-Ordner im Lese-Ordner** (Standard: Dokumente und Dokumente/Claude). PdfCraft und VectorCraft öffnen eigene Ergebnisse sonst nicht wieder. Bei FigCraft ist die Lage egal; der Standard bleibt derselbe.
## Neuer Skill ## Neuer Skill
1. Ordner aus der Vorlage anlegen: 1. `scripts/new-skill.sh <name>` bzw. `scripts\new-skill.ps1 -Name <name>`
`scripts/new-skill.sh <name>` bzw. `scripts\new-skill.ps1 -Name <name>` 2. `SKILL.md` und `README.md` ausfüllen (SKILL clientneutral).
2. `SKILL.md` und `README.md` ausfüllen. 3. `scripts/validate` und `scripts/update-index`
3. Prüfen: 4. Committen, Taggen, Release (ZIP, ggf. `.mcpb`, Cursor-ZIP).
`scripts/validate.sh <name>` bzw. `scripts\validate.ps1 -Name <name>`
4. Tabelle in der Wurzel-README neu erzeugen:
`scripts/update-index.sh` bzw. `scripts\update-index.ps1`
5. Committen und nach `main` pushen.
6. Tag setzen und pushen. Bestehende Tags nicht verschieben und nicht löschen. Der Push allein legt kein Release an.
```sh
git tag <name>/v<version>
git push origin main <name>/v<version>
```
7. Release anlegen (siehe unten): Pakete bauen und dem Tag als Anhänge hinzufügen.
## Update eines Skills ## Update eines Skills
1. `SKILL.md` und `README.md` ändern. 1. `SKILL.md` / `README.md` / ggf. `extension/` ändern.
2. Im `CHANGELOG.md` einen neuen Eintrag `## x.y.z (YYYY-MM-DD)` oben einfügen. 2. CHANGELOG-Eintrag oben.
3. Prüfen (`validate`), dann `update-index` ausführen. 3. `validate`, `update-index`, committen, neuen Tag, Release.
4. Committen und nach `main` pushen.
5. Neuen Tag `<name>/v<version>` setzen und pushen. Der Tag muss exakt zur obersten CHANGELOG-Version passen. Danach das Release vom eigenen Rechner anlegen.
## Versionen ## Versionen
- **Patch** (0.1.0 → 0.1.1): Korrekturen, Tippfehler, präzisere Formulierungen, Doku - **Patch:** Korrekturen, Doku
- **Minor** (0.1.0 → 0.2.0): neue Abschnitte, neue bekannte Fallen, neue Beispiele - **Minor:** neue Abschnitte, Fallen, Beispiele, Cursor-/Claude-Auslieferung
- **Major** (0.x → 1.0.0): geänderte Voraussetzungen oder Arbeitsweise, die bestehende Einrichtungen betreffen - **Major:** geänderte Voraussetzungen oder Arbeitsweise
## Release ## Release
Ein Paket pro Skill, Dateiname `dist/<name>-v<version>.zip`. Im ZIP liegt der Ordner `<name>/` mit `SKILL.md` auf oberster Ebene. `README.md` und `CHANGELOG.md` werden nicht eingepackt. Pakete: `dist/<name>-v<version>.zip` (nur SKILL.md), ggf. `dist/<name>-v<version>.mcpb`, `dist/<name>-cursor-v<version>.zip`.
Skills mit `extension/` liefern zusätzlich `dist/<name>-v<version>.mcpb`. Die `.mcpb` enthält **keine** CLI-EXE: sie zeigt auf die Installation aus dem ArtCraft-Launcher (`C:\Program Files\…`). `scripts/fetch-cli` prüft nur, dass die EXE lokal vorhanden ist, und aktualisiert `upstream.json` sowie die Lizenztexte. Als `entry_point` dient `server/README.txt`: die MCPB-Prüfung verlangt eine Datei im Paket; gestartet wird der Befehl aus `mcp_config.command`. `mcpb validate` besteht damit, und die Erweiterung startet so. Die `.mcpb` bleibt unsigniert, solange kein Code-Signing-Zertifikat vorliegt (`mcpb sign` braucht `--cert` / `--key`; `--self-signed` hilft nicht gegen Defender). Die `.mcpb` enthält **keine** CLI-EXE: sie zeigt auf den ArtCraft-Launcher (`C:\Program Files\…`). Als `entry_point` dient `server/README.txt` (MCPB-Prüfung verlangt eine Datei im Paket; gestartet wird `mcp_config.command`).
```sh
scripts/package.sh # nur Skill-ZIPs
scripts/package.sh <name>
scripts/package-mcpb.sh <name> # eine .mcpb
scripts/package-all.sh # ZIP + .mcpb wo extension/ existiert
```
```powershell ```powershell
powershell -ExecutionPolicy Bypass -File scripts\package.ps1
powershell -ExecutionPolicy Bypass -File scripts\package.ps1 -Name <name>
powershell -ExecutionPolicy Bypass -File scripts\package-mcpb.ps1 -Name <name>
powershell -ExecutionPolicy Bypass -File scripts\package-all.ps1 powershell -ExecutionPolicy Bypass -File scripts\package-all.ps1
```
### Release veröffentlichen
Der Tag `<name>/v<version>` muss lokal und remote existieren. Danach entweder:
**Skript** (baut ZIP/`.mcpb` und hängt sie ans Release; nutzt dieselbe Anmeldung wie `git push`):
```powershell
powershell -ExecutionPolicy Bypass -File scripts\release.ps1 -Name <name> powershell -ExecutionPolicy Bypass -File scripts\release.ps1 -Name <name>
``` ```
```sh
scripts/release.sh <name>
```
**Oder manuell** in der Release-Oberfläche des Remotes:
1. Paket bauen (Befehle oben). Prüfen, dass `dist/<name>-v<version>.zip` die Einträge `<name>/` und `<name>/SKILL.md` enthält und weder `README.md` noch `CHANGELOG.md`.
2. Neues Release zum Tag `<name>/v<version>` anlegen, Titel `<name> <version>`.
3. Als Text den Abschnitt dieser Version aus `skills/<name>/CHANGELOG.md` einfügen.
4. `dist/<name>-v<version>.zip` und – falls vorhanden – `dist/<name>-v<version>.mcpb` anhängen.
## Hinweise zu den Skripten ## Hinweise zu den Skripten
- Für jedes Skript gibt es eine Bash- (`.sh`) und eine PowerShell-Variante (`.ps1`). Die Bash-Skripte brauchen `zip` und `unzip`, die PowerShell-Skripte laufen ohne Zusatztools unter Windows PowerShell 5.1 und PowerShell 7. `release.sh` braucht zusätzlich `curl` und `python3`; unter Windows genügt `release.ps1`. - Bash- und PowerShell-Varianten; `.ps1` nur ASCII; Dateien über `lib.ps1` als UTF-8 ohne BOM.
- `.ps1`-Dateien enthalten nur ASCII-Zeichen. Windows PowerShell 5.1 liest UTF-8 ohne BOM als ANSI; Umlaute oder Gedankenstriche können ein Skript dort unbrauchbar machen. - Unter Windows: `powershell -ExecutionPolicy Bypass -File scripts\<skript>.ps1`
- `package.ps1` baut ZIPs mit `System.IO.Compression` statt `Compress-Archive`, weil `Compress-Archive` unter 5.1 Pfade mit `\` schreibt.
- Unter Windows bei gesperrter Ausführungsrichtlinie: `powershell -ExecutionPolicy Bypass -File scripts\<skript>.ps1`
+110 -8
View File
@@ -1,22 +1,124 @@
# claude-skills # claude-skills
Sammlung von Skills für Claude. Jeder Skill ist ein abgeschlossener Ordner: `SKILL.md` für Claude, `README.md` für Menschen. Fertige Pakete liegen unter [Releases](https://git.gundel.dev/dg/claude-skills/releases). Sammlung von Skills für Claude und Cursor. Jeder Skill ist ein abgeschlossener Ordner: `SKILL.md` für den Agenten (clientneutral), `README.md` für Menschen.
Schritt-für-Schritt-Installation: [docs/INSTALLATION.md](docs/INSTALLATION.md). <table>
<tr>
<td align="center" width="33%"><a href="docs/INSTALLATION.md"><strong>Claude Desktop</strong></a><br><small>Skill hochladen</small></td>
<td align="center" width="33%"><a href="docs/CURSOR.md"><strong>Cursor</strong></a><br><small>Plugin oder 1-Klick</small></td>
<td align="center" width="33%"><a href="https://git.gundel.dev/dg/claude-skills/releases"><strong>Releases</strong></a><br><small>ZIP, Erweiterung, Plugin</small></td>
</tr>
</table>
## Skills ## Skills
<!-- skills:start --> <!-- skills:start -->
| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) | ### [cadcraft-mcp](skills/cadcraft-mcp/) · `v0.1.0`
|---|---|---|---|---|---|
| [gridcraft-mcp](skills/gridcraft-mcp/) | Excel-Arbeitsmappen (.xlsx, .csv) über den GridCraft-MCP-Server erstellen, öffnen, ändern, berechnen, formatieren und prüfen – Kalkulationen, Stücklisten, Listen, Diagramme, PDF-Export. | 0.2.0 | [README](skills/gridcraft-mcp/README.md) | [gridcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.2.0/gridcraft-mcp-v0.2.0.zip) | [gridcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.2.0/gridcraft-mcp-v0.2.0.mcpb) | > 2D/3D-Zeichnungen (DXF, DWG) mit dem CADCraft-MCP-Server öffnen, zeichnen, abfragen und als DXF, DWG, SVG, PNG oder PDF ausgeben.
| [wordcraft-mcp](skills/wordcraft-mcp/) | 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. | 0.2.0 | [README](skills/wordcraft-mcp/README.md) | [wordcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.2.0/wordcraft-mcp-v0.2.0.zip) | [wordcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.2.0/wordcraft-mcp-v0.2.0.mcpb) |
*Verwenden, wenn CADCraft-Werkzeuge verbunden sind oder der Nutzer CADCraft nennt; typisch für Grundrisse, Laschen in 2D, DXF/DWG von der Konstruktion. Nicht für parametrische Volumenkörper (SolidCraft) und nicht für Laser-DXF aus Illustrationen (VectorCraft).*
[Doku](skills/cadcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-v0.1.0.zip "cadcraft-mcp-v0.1.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-v0.1.0.mcpb "cadcraft-mcp-v0.1.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-cursor-v0.1.0.zip "cadcraft-mcp-cursor-v0.1.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=cadcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9DQURDcmFmdC9jYWRjcmFmdC1jbGkuZXhlIiwiYXJncyI6WyJtY3AiXX0)
---
### [effectcraft-mcp](skills/effectcraft-mcp/) · `v0.1.0`
> Motion-Graphics und Compositings (.ecproj) mit dem EffectCraft-MCP-Server aufbauen, keyframen und rendern.
*Verwenden, wenn EffectCraft-Werkzeuge verbunden sind oder der Nutzer EffectCraft nennt; typisch für Titel, Bauchbinden, einfache Animationen, Standbilder und Filmexporte. Nicht für den Schnitt einer Timeline aus Clips (FilmCraft).*
[Doku](skills/effectcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-v0.1.0.zip "effectcraft-mcp-v0.1.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-v0.1.0.mcpb "effectcraft-mcp-v0.1.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-cursor-v0.1.0.zip "effectcraft-mcp-cursor-v0.1.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=effectcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9FZmZlY3RDcmFmdC9lZmZlY3RjcmFmdC1jbGkuZXhlIiwiYXJncyI6WyJtY3AiLCItLWVtcHR5IiwiLS1hdXRvbWF0aW9uLXJlYWQtcm9vdCIsIiR7dXNlckhvbWV9L0RvY3VtZW50cyIsIi0tYXV0b21hdGlvbi13cml0ZS1yb290IiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzL0NsYXVkZSJdfQ)
---
### [figcraft-mcp](skills/figcraft-mcp/) · `v0.2.0`
> Bedienoberflächen und Screens über den FigCraft-MCP-Server entwerfen, bearbeiten, ansehen und als PNG, PDF, SVG oder .fig exportieren (Figma-Klon, frühe Alpha).
*Verwenden, wenn FigCraft-Werkzeuge verbunden sind oder der Nutzer FigCraft nennt; typisch für HMI-Masken von Maschinensteuerungen, App-/Web-Entwürfe, Klick-Prototypen und Komponenten.*
[Doku](skills/figcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-v0.2.0.zip "figcraft-mcp-v0.2.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-v0.2.0.mcpb "figcraft-mcp-v0.2.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-cursor-v0.2.0.zip "figcraft-mcp-cursor-v0.2.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=figcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9GaWdDcmFmdC9maWdjcmFmdC1jbGkuZXhlIiwiYXJncyI6WyJtY3AiLCItLWF1dG9tYXRpb24tcmVhZC1yb290IiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzIiwiLS1hdXRvbWF0aW9uLXdyaXRlLXJvb3QiLCIke3VzZXJIb21lfS9Eb2N1bWVudHMvQ2xhdWRlIl19)
---
### [filmcraft-mcp](skills/filmcraft-mcp/) · `v0.1.0`
> Schnitte (.fcproj) mit dem FilmCraft-MCP-Server importieren, schneiden und exportieren.
*Verwenden, wenn FilmCraft-Werkzeuge verbunden sind oder der Nutzer FilmCraft nennt; typisch für Rohschnitt, Titel auf der Timeline, Export nach h264, ProRes, DNxHR oder als Bildsequenz. Nicht für Compositing und Keyframes (EffectCraft).*
[Doku](skills/filmcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-v0.1.0.zip "filmcraft-mcp-v0.1.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-v0.1.0.mcpb "filmcraft-mcp-v0.1.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-cursor-v0.1.0.zip "filmcraft-mcp-cursor-v0.1.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=filmcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9GaWxtQ3JhZnQvZmlsbWNyYWZ0LWNsaS5leGUiLCJhcmdzIjpbIm1jcCJdfQ)
---
### [gridcraft-mcp](skills/gridcraft-mcp/) · `v0.4.0`
> Excel-Arbeitsmappen (.xlsx, .xlsm, .xls, .xlsb, .ods, .csv) mit dem GridCraft-MCP-Server erstellen, öffnen, ändern, berechnen und prüfen, einschließlich Pivot-Tabellen.
*Verwenden, wenn GridCraft-Werkzeuge verbunden sind oder der Nutzer GridCraft nennt; typisch für Kalkulationen, Stücklisten (BOM), Listen, Diagramme, Pivot, PDF-Export. Nicht für eingebaute xlsx-Hilfen ohne GridCraft-Server.*
[Doku](skills/gridcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-v0.4.0.zip "gridcraft-mcp-v0.4.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-v0.4.0.mcpb "gridcraft-mcp-v0.4.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-cursor-v0.4.0.zip "gridcraft-mcp-cursor-v0.4.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=gridcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9HcmlkQ3JhZnQvZ3JpZGNyYWZ0LWNsaS5leGUiLCJhcmdzIjpbIm1jcCJdfQ)
---
### [pdfcraft-mcp](skills/pdfcraft-mcp/) · `v0.2.0`
> PDFs über den PdfCraft-MCP-Server öffnen, auslesen, schwärzen, bereinigen, zusammenführen, aufteilen, mit Kopf-/Fußzeile, Seitenzahlen, Wasserzeichen und Lesezeichen versehen und nach Word exportieren.
*Verwenden, wenn PdfCraft-Werkzeuge verbunden sind oder der Nutzer PdfCraft nennt; typisch für Schwärzen vor der Weitergabe, Dokumentationspakete (Betriebsanleitung, Datenblätter, Konformitätserklärung), Angebote und Zeichnungen auslesen.*
[Doku](skills/pdfcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-v0.2.0.zip "pdfcraft-mcp-v0.2.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-v0.2.0.mcpb "pdfcraft-mcp-v0.2.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-cursor-v0.2.0.zip "pdfcraft-mcp-cursor-v0.2.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=pdfcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9QZGZDcmFmdC9wZGZjcmFmdC1jbGkuZXhlIiwiYXJncyI6WyJtY3AiLCItLWNvbXBhY3QiLCItLWF1dG9tYXRpb24tcmVhZC1yb290IiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzIiwiLS1hdXRvbWF0aW9uLXdyaXRlLXJvb3QiLCIke3VzZXJIb21lfS9Eb2N1bWVudHMvQ2xhdWRlIl19)
---
### [solidcraft-mcp](skills/solidcraft-mcp/) · `v0.3.0`
> Parametrische 3D-Teile über den SolidCraft-MCP-Server bauen, ändern, messen und als .solidcraft, STEP, STL, OBJ oder 3MF ausgeben.
*Verwenden, wenn SolidCraft-Werkzeuge verbunden sind oder der Nutzer SolidCraft nennt; typisch für Laschen, Platten, Gehäuse, Bohrbilder, Baugruppen. Nicht für Laser-DXF (VectorCraft), nicht für DXF/DWG-Zeichnungen (CADCraft) und nicht für native SOLIDWORKS-Dateien.*
[Doku](skills/solidcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-v0.3.0.zip "solidcraft-mcp-v0.3.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-v0.3.0.mcpb "solidcraft-mcp-v0.3.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-cursor-v0.3.0.zip "solidcraft-mcp-cursor-v0.3.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=solidcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9Tb2xpZENyYWZ0L3NvbGlkY3JhZnQtY2xpLmV4ZSIsImFyZ3MiOlsibWNwIiwiLS1hbGxvdy1wYXRoIiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzIiwiLS1hbGxvdy1wYXRoIiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzL0NsYXVkZSJdfQ)
---
### [vectorcraft-mcp](skills/vectorcraft-mcp/) · `v0.2.0`
> Vektorgrafiken über den VectorCraft-MCP-Server zeichnen, bearbeiten und als SVG, PDF, DXF, EPS, PNG exportieren (Illustrator-Klon); öffnet auch DXF, SVG, PDF, AI, EPS, PSD, Affinity (.af, .afdesign, .afpub).
*Verwenden, wenn VectorCraft-Werkzeuge verbunden sind oder der Nutzer VectorCraft nennt; typisch für Typenschilder und Laser-/Gravurvorlagen als DXF in mm, Hinweisschilder, Piktogramme, Skizzen und Illustrationen für Betriebsanleitungen.*
[Doku](skills/vectorcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-v0.2.0.zip "vectorcraft-mcp-v0.2.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-v0.2.0.mcpb "vectorcraft-mcp-v0.2.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-cursor-v0.2.0.zip "vectorcraft-mcp-cursor-v0.2.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=vectorcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9WZWN0b3JDcmFmdC92ZWN0b3JjcmFmdC1jbGkuZXhlIiwiYXJncyI6WyJtY3AiLCItLWF1dG9tYXRpb24tcmVhZC1yb290IiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzIiwiLS1hdXRvbWF0aW9uLXdyaXRlLXJvb3QiLCIke3VzZXJIb21lfS9Eb2N1bWVudHMvQ2xhdWRlIl19)
---
### [wordcraft-mcp](skills/wordcraft-mcp/) · `v0.4.0`
> 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.*
[Doku](skills/wordcraft-mcp/README.md) · [Skill-ZIP](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-v0.4.0.zip "wordcraft-mcp-v0.4.0.zip") · [Erweiterung](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-v0.4.0.mcpb "wordcraft-mcp-v0.4.0.mcpb") · [Cursor-Plugin](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-cursor-v0.4.0.zip "wordcraft-mcp-cursor-v0.4.0.zip") · [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=wordcraft&config=eyJjb21tYW5kIjoiQzovUHJvZ3JhbSBGaWxlcy9Xb3JkQ3JhZnQvd29yZGNyYWZ0LWNsaS5leGUiLCJhcmdzIjpbIm1jcCIsIi0tYXV0aG9yIiwiQ2xhdWRlIiwiLS1hdXRvbWF0aW9uLXJlYWQtcm9vdCIsIiR7dXNlckhvbWV9L0RvY3VtZW50cyIsIi0tYXV0b21hdGlvbi13cml0ZS1yb290IiwiJHt1c2VySG9tZX0vRG9jdW1lbnRzL0NsYXVkZSJdfQ)
<!-- skills:end --> <!-- skills:end -->
## Skill installieren ## Skill installieren (Claude)
1. In der Tabelle das ZIP des Skills laden. 1. Beim Skill **Skill-ZIP** laden.
2. In Claude **„+“ → „Skill erstellen“ → „Skill hochladen“** wählen und das ZIP hochladen. 2. In Claude **„+“ → „Skill erstellen“ → „Skill hochladen“** wählen und das ZIP hochladen.
3. Die **Erweiterung** (.mcpb) installieren und einschalten ([INSTALLATION.md](docs/INSTALLATION.md)).
## In Cursor installieren
Voraussetzung: ArtCraft-Launcher mit der jeweiligen App ([Abschnitt 1](docs/INSTALLATION.md#1-artcraft-launcher-und-apps-installieren)). SolidCraft hat einen eigenen Installer ([Abschnitt 1b](docs/INSTALLATION.md#1b-solidcraft-installieren)).
1. **Cursor-Plugin** laden, nach `~/.cursor/plugins/local/<skill>` entpacken (Windows: `%USERPROFILE%\.cursor\plugins\local\<skill>`), dann **Developer: Reload Window**. Jedes Werkzeug einzeln, wie in Claude.
2. Alternativ: **Add to Cursor** für den MCP-Server, und den Skill-Ordner nach `~/.cursor/skills/` kopieren.
3. WordCraft, PdfCraft, FigCraft, VectorCraft, EffectCraft und SolidCraft: Lese- und Schreib-Ordner prüfen. Standard: Lese = Dokumente, Schreib = Dokumente\Claude. Der Schreib-Ordner liegt im Lese-Ordner. PdfCraft startet mit `--compact`. VectorCraft nie ohne die Ordner-Argumente starten. EffectCraft mit `--empty` und beiden Ordnern. SolidCraft in der Erweiterung mit zwei `--allow-path` und ohne `--connect`. CADCraft und FilmCraft starten nur mit `mcp`.
4. Test: im Agent „Sind die WordCraft-Werkzeuge verfügbar?“ – und je App einen kleinen Auftrag aus dem Skill.
5. Auch Cursor sendet Inhalte an Cloud-Modelle. Die Datenschutz-Ampel in den Skills beachten.
Mehr: [docs/CURSOR.md](docs/CURSOR.md).
## Mitarbeiten ## Mitarbeiten
@@ -0,0 +1,9 @@
{
"name": "SKILL_NAME",
"version": "0.0.0",
"description": "SKILL_DESCRIPTION",
"author": {
"name": "Dominic Gundel"
},
"license": "MIT"
}
+4
View File
@@ -0,0 +1,4 @@
# Cursor plugin template
Build output is generated by `scripts/build-cursor` into `dist/cursor/plugins/<skill>/`.
Do not hand-edit packages under `dist/`.
+155
View File
@@ -0,0 +1,155 @@
# Cursor: Craft-Werkzeuge
Kurzfassung in der [Wurzel-README](../README.md). Für Claude Desktop: [INSTALLATION.md](INSTALLATION.md).
Jedes Werkzeug ist ein **eigenes** Cursor-Plugin (1:1 zur Claude-`.mcpb`). Keine Sammel-Plugins.
## Voraussetzung
1. [ArtCraft-Launcher](https://getartcraft.com/apps) und darin die jeweilige App (Standardpfad `C:\Program Files\…\<app>-cli.exe`, nicht auf PATH). FigCraft steht im Katalog seit Launcher 0.4.1. SolidCraft getrennt davon: eigener Installer ([Releases](https://github.com/tangency-labs/solidcraft/releases) oder `winget install bherbruck.SolidCraft`), CLI `C:\Program Files\SolidCraft\solidcraft-cli.exe`.
2. Cursor Desktop.
## Plugin installieren (empfohlen)
1. `<skill>-cursor-vX.Y.Z.zip` aus dem Release laden (Link **Cursor-Plugin** beim Skill in der [README](../README.md)).
2. Nach `~/.cursor/plugins/local/<skill>` entpacken (Windows: `%USERPROFILE%\.cursor\plugins\local\<skill>`). Der Ordner muss `.cursor-plugin/plugin.json`, `skills/` und ggf. `mcp.json` enthalten.
3. **Developer: Reload Window**.
4. Unter Customize prüfen, dass Skill und MCP-Server sichtbar sind.
WordCraft, PdfCraft, FigCraft, VectorCraft und SolidCraft: Lese-/Schreib-Ordner in den Plugin-Variablen (Configure) oder in `mcp.json` prüfen. Standard: Lese = `${userHome}/Documents`, Schreib = `${userHome}/Documents/Claude`. Der Schreib-Ordner muss im Lese-Ordner liegen (PdfCraft und VectorCraft lehnen sonst das erneute Öffnen ab; bei FigCraft ist die Lage egal, der Standard bleibt). SolidCraft übergibt beide Ordner als `--allow-path`; beide müssen gesetzt sein.
PdfCraft startet mit `--compact` (17 Kernwerkzeuge plus `tool_search`/`tool_call`). VectorCraft immer mit beiden Ordner-Argumenten starten, sonst versucht der Server zuerst `127.0.0.1:7979`. FigCraft: `--attach` lehnt die Ordner-Flags ab, das Plugin setzt sie und bleibt kopflos. SolidCraft in der Erweiterung: zwei `--allow-path`, ohne `--connect`. `--connect 127.0.0.1:7878` in einer eigenen `mcp.json` spricht die App an (`solidcraft --control 7878`); lauscht sie nicht, antworten die Entwurfswerkzeuge mit `no SolidCraft app is listening`, `skill_reference` bleibt. CADCraft und FilmCraft: nur `mcp`, keine Ordner-Flags. EffectCraft: `mcp --empty` mit beiden Ordnern.
## Alternativ: nur MCP + Skill
1. Link **Add to Cursor** beim Skill für den MCP-Server.
2. Skill-Ordner aus `dist/cursor/skills/<skill>/` (oder dem Plugin-ZIP unter `skills/<skill>/`) nach `~/.cursor/skills/<skill>/` kopieren.
Manuelle `~/.cursor/mcp.json` (Ausschnitt WordCraft):
```json
{
"mcpServers": {
"wordcraft": {
"command": "C:\\Program Files\\WordCraft\\wordcraft-cli.exe",
"args": [
"mcp",
"--author", "Claude",
"--automation-read-root", "${userHome}/Documents",
"--automation-write-root", "${userHome}/Documents/Claude"
]
}
}
}
```
GridCraft:
```json
{
"mcpServers": {
"gridcraft": {
"command": "C:\\Program Files\\GridCraft\\gridcraft-cli.exe",
"args": ["mcp"]
}
}
}
```
PdfCraft (`--compact` nicht weglassen):
```json
{
"mcpServers": {
"pdfcraft": {
"command": "C:\\Program Files\\PdfCraft\\pdfcraft-cli.exe",
"args": [
"mcp",
"--compact",
"--automation-read-root", "${userHome}/Documents",
"--automation-write-root", "${userHome}/Documents/Claude"
]
}
}
}
```
FigCraft (kein `--attach`):
```json
{
"mcpServers": {
"figcraft": {
"command": "C:\\Program Files\\FigCraft\\figcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root", "${userHome}/Documents",
"--automation-write-root", "${userHome}/Documents/Claude"
]
}
}
}
```
VectorCraft (Ordner-Argumente nicht weglassen):
```json
{
"mcpServers": {
"vectorcraft": {
"command": "C:\\Program Files\\VectorCraft\\vectorcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root", "${userHome}/Documents",
"--automation-write-root", "${userHome}/Documents/Claude"
]
}
}
}
```
SolidCraft (Erweiterung: zwei `--allow-path`, kein `--connect`. Eine eigene `mcp.json` darf `--connect 127.0.0.1:7878` zusätzlich setzen, wenn die App mit `solidcraft --control 7878` läuft):
```json
{
"mcpServers": {
"solidcraft": {
"command": "C:\\Program Files\\SolidCraft\\solidcraft-cli.exe",
"args": [
"mcp",
"--allow-path", "${userHome}/Documents",
"--allow-path", "${userHome}/Documents/Claude"
]
}
}
}
```
Unterstützte Variablen in `mcp.json`: `${userHome}`, `${env:NAME}`, `${workspaceFolder}`, `${pathSeparator}` (siehe Cursor-MCP-Doku). In Plugin-`mcp.json` zusätzlich Plugin-Variablen (`${READ_ROOT}`, …) und `${CURSOR_PLUGIN_ROOT}` (hier unnötig, keine gebündelte EXE).
**1-Klick-Deeplink:** `config` ist nur das Transport-Objekt (`{command, args}`), der Servername steht in `name=`. Pfade mit Schrägstrich (`C:/Program Files/...`). Ein Wrapper `{ servername: {command…} }` im `config` führt in Cursor zu leerem `command`.
## Werkzeug-Grenze
Die [MCP-Doku](https://cursor.com/docs/mcp) nennt keine feste Höchstzahl. Die [IDE-Release-Notes](https://cursor.com/docs/release-notes/ide) sagen, dass Agenten bei vielen MCP-Werkzeugen nicht mehr abbrechen, sondern die an das Modell gesendete Menge kappen. Die zuletzt von Cursor benannte Grenze lag bei **80** Werkzeugen, angehoben von 40 in Cursor 1.5 (Team-Antwort im [Forum](https://forum.cursor.com/t/cursor-v1-5-release-discussions/131103), August 2025).
PdfCraft ohne `--compact` liefert 171 Werkzeuge mit etwa 176 KB Beschreibung und liegt über dieser Grenze. Das Plugin übergibt deshalb `--compact`.
## Test
Im Agent: „Sind die WordCraft-Werkzeuge verfügbar?“ bzw. die andere App. PdfCraft: Test-PDF schwärzen und `doc_audit_redactions`. FigCraft: kleine HMI-Maske als PNG. VectorCraft: Typenschild 100×50 mm als DXF, Maße im CAD prüfen. SolidCraft: Quader 40×30×20 mm, Volumen 24000 mm³.
## Probleme
| Problem | Lösung |
|---|---|
| Keine Werkzeuge | Plugin unter `plugins/local/<skill>`? Reload? CLI unter `C:\Program Files\…`? |
| path rejected | Schreib-Ordner prüfen (`WRITE_ROOT` / mcp.json). Er muss im Lese-Ordner liegen. |
| VectorCraft spricht Port 7979 an | Ordner-Argumente fehlen. Plugin-`mcp.json` prüfen. |
| SolidCraft: `no SolidCraft app is listening` | Die `mcp.json` hat `--connect`, die App lauscht nicht. `solidcraft --control 7878` starten, oder `--connect` weglassen (kopflos, wie die Erweiterung). |
| Zu viele Werkzeuge / PdfCraft wirkt abgeschnitten | `--compact` muss in den Args stehen. |
| Doppelte Server | Alten Eintrag in `~/.cursor/mcp.json` entfernen, wenn das Plugin denselben Namen (`wordcraft`, `gridcraft`, `pdfcraft`, `figcraft`, `vectorcraft`, `solidcraft`) registriert. |
## Datenschutz
Auch Cursor sendet Inhalte an Cloud-Modelle. Ampel wie in den Skills: personenbezogene und NDA-Daten nicht in die Cloud-KI.
+61 -18
View File
@@ -1,6 +1,6 @@
# Claude-Werkzeuge für Word und Excel einrichten # Claude-Werkzeuge einrichten
Mit dieser Anleitung kann Claude Word-Dokumente (über **WordCraft for Claude**) und Excel-Tabellen (über **GridCraft for Claude**) direkt auf deinem Rechner erstellen und bearbeiten. Dauer: etwa 10 Minuten. Du brauchst keine Programmierkenntnisse. Mit dieser Anleitung kann Claude auf deinem Rechner Word-Dokumente, Excel-Tabellen, PDFs, Oberflächen-Entwürfe, Vektorgrafiken, DXF/DWG, Compositings, Schnitte und parametrische 3D-Teile bearbeiten. Dauer: etwa 10 Minuten je Werkzeug. Du brauchst keine Programmierkenntnisse.
Für jedes Werkzeug installierst du zwei Dinge: Für jedes Werkzeug installierst du zwei Dinge:
@@ -17,24 +17,52 @@ Ohne Erweiterung kann Claude nichts tun, ohne Skill macht es mehr Fehler. Instal
- Windows 10 oder 11 - Windows 10 oder 11
- **Claude Desktop** installiert und angemeldet (die App, nicht nur der Browser) - **Claude Desktop** installiert und angemeldet (die App, nicht nur der Browser)
- Ein eigener Ordner, in den Claude speichern darf, z. B. `Dokumente\Claude-Ausgabe`. Leg ihn jetzt an. - Ein eigener **Schreib-Ordner**, z. B. `Dokumente\Claude`. Leg ihn jetzt an (eng halten). Der **Lese-Ordner** darf weit sein (z. B. ganzer Ordner Dokumente).
--- ---
## 1. ArtCraft-Launcher und Apps installieren ## 1. ArtCraft-Launcher und Apps installieren
Installiere den [ArtCraft-Launcher](https://getartcraft.com/apps) und darin **WordCraft** und **GridCraft**. Den Standardpfad nicht ändern: `C:\Program Files\WordCraft` bzw. `C:\Program Files\GridCraft`. Die Claude-Erweiterung enthält die Programme **nicht**. Installiere den [ArtCraft-Launcher](https://getartcraft.com/apps) und darin die Apps, die du brauchst. Den Standardpfad nicht ändern. Die CLI liegt im Programmordner und ist **nicht** auf PATH. Die Claude-Erweiterung enthält die Programme **nicht**.
(Installer auch unter [GitHub Releases](https://github.com/storytold/craft-launcher/releases).) | App | Wofür | CLI |
|---|---|---|
| WordCraft | Word-Dokumente | `C:\Program Files\WordCraft\wordcraft-cli.exe` |
| GridCraft | Excel-Tabellen | `C:\Program Files\GridCraft\gridcraft-cli.exe` |
| PdfCraft | Schwärzen, Doku-Pakete | `C:\Program Files\PdfCraft\pdfcraft-cli.exe` |
| FigCraft | HMI-/Oberflächen-Entwürfe | `C:\Program Files\FigCraft\figcraft-cli.exe` |
| VectorCraft | Typenschilder, Schilder, DXF für Laser | `C:\Program Files\VectorCraft\vectorcraft-cli.exe` |
| CADCraft | DXF/DWG-Zeichnungen | `C:\Program Files\CADCraft\cadcraft-cli.exe` |
| EffectCraft | Compositing, .ecproj | `C:\Program Files\EffectCraft\effectcraft-cli.exe` |
| FilmCraft | Schnitt, .fcproj | `C:\Program Files\FilmCraft\filmcraft-cli.exe` |
FigCraft steht im Launcher seit Version **0.4.1**. Ältere Kataloge mit zwölf Apps führen es nicht. Fehlt die Kachel, den Launcher aktualisieren. Installer: [GitHub Releases](https://github.com/storytold/craft-launcher/releases). CADCraft, EffectCraft und FilmCraft sind am 26.10.2026 unter `C:\Program Files` installiert (Publisher Learning Machines LLC). Ob der Launcher dafür eine Kachel hat, ist nicht geprüft.
## 1b. SolidCraft installieren
SolidCraft wird getrennt vom ArtCraft-Launcher installiert. Installer: [GitHub Releases](https://github.com/tangency-labs/solidcraft/releases) (MSI) oder in der Konsole `winget install bherbruck.SolidCraft`. Den Standardpfad nicht ändern.
| App | Wofür | CLI |
|---|---|---|
| SolidCraft | parametrische 3D-Teile, STEP, STL, 3MF | `C:\Program Files\SolidCraft\solidcraft-cli.exe` |
Die CLI ist **nicht** auf PATH. Die Erweiterung enthält sie nicht. Die Erweiterung startet kopflos mit zwei `--allow-path` (Lese-Ordner und Schreib-Ordner), ohne `--connect` und ohne `--allow-any-path`. `--connect 127.0.0.1:PORT` ist ein anderer Start und braucht `solidcraft --control PORT`. `solvecraft-cli.exe` ist nur ein Alias. Skill-Version: **0.3.0**.
--- ---
## 2. Dateien herunterladen ## 2. Dateien herunterladen
Lade jeweils die Version **0.2.0** herunter: Lade die passende Version herunter (WordCraft und GridCraft **0.4.0**, PdfCraft, FigCraft und VectorCraft **0.2.0**, SolidCraft **0.3.0**, CADCraft, EffectCraft und FilmCraft **0.1.0**):
- [wordcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.2.0/wordcraft-mcp-v0.2.0.mcpb) und [wordcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.2.0/wordcraft-mcp-v0.2.0.zip) - [wordcraft-mcp-v0.4.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-v0.4.0.mcpb) und [wordcraft-mcp-v0.4.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-v0.4.0.zip)
- [gridcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.2.0/gridcraft-mcp-v0.2.0.mcpb) und [gridcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.2.0/gridcraft-mcp-v0.2.0.zip) - [gridcraft-mcp-v0.4.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-v0.4.0.mcpb) und [gridcraft-mcp-v0.4.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-v0.4.0.zip)
- [pdfcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-v0.2.0.mcpb) und [pdfcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-v0.2.0.zip)
- [figcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-v0.2.0.mcpb) und [figcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-v0.2.0.zip)
- [vectorcraft-mcp-v0.2.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-v0.2.0.mcpb) und [vectorcraft-mcp-v0.2.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-v0.2.0.zip)
- [solidcraft-mcp-v0.3.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-v0.3.0.mcpb) und [solidcraft-mcp-v0.3.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-v0.3.0.zip)
- [cadcraft-mcp-v0.1.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-v0.1.0.mcpb) und [cadcraft-mcp-v0.1.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-v0.1.0.zip)
- [effectcraft-mcp-v0.1.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-v0.1.0.mcpb) und [effectcraft-mcp-v0.1.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-v0.1.0.zip)
- [filmcraft-mcp-v0.1.0.mcpb](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-v0.1.0.mcpb) und [filmcraft-mcp-v0.1.0.zip](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-v0.1.0.zip)
Die ZIP-Dateien **nicht entpacken**. Die ZIP-Dateien **nicht entpacken**.
@@ -48,12 +76,13 @@ Für jede `.mcpb`-Datei:
2. Die `.mcpb`-Datei **doppelklicken** – oder sie ins Claude-Fenster ziehen. 2. Die `.mcpb`-Datei **doppelklicken** – oder sie ins Claude-Fenster ziehen.
*Klappt beides nicht:* Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ → Datei auswählen. *Klappt beides nicht:* Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ → Datei auswählen.
3. Es öffnet sich ein Installationsfenster. Angaben prüfen und bestätigen. 3. Es öffnet sich ein Installationsfenster. Angaben prüfen und bestätigen.
4. **Nur bei WordCraft for Claude** fragt Claude nach zwei Ordnern: 4. **WordCraft, PdfCraft, FigCraft, VectorCraft, EffectCraft und SolidCraft** fragen nach zwei Ordnern. GridCraft, CADCraft und FilmCraft nicht.
- **Lese-Ordner:** Hier darf Claude Dokumente lesen, z. B. `Dokumente`. - **Lese-Ordner (weit):** `Dokumente`.
- **Schreib-Ordner:** Nur hier darf Claude speichern – deinen Ordner `Dokumente\Claude-Ausgabe` wählen. Nicht denselben wie den Lese-Ordner, dann bleiben deine Originale sicher. - **Schreib-Ordner (eng, und bei PdfCraft und VectorCraft darin):** `Dokumente\Claude`. PdfCraft und VectorCraft öffnen eigene Ergebnisse sonst nicht wieder. Bei FigCraft ist die Lage egal; denselben Standard verwenden.
- **SolidCraft:** beide Ordner ausfüllen. Jeder wird als `--allow-path` übergeben. Die Erweiterung startet ohne `--connect`.
5. Installieren. Die Erweiterung erscheint unter Einstellungen → Erweiterungen. 5. Installieren. Die Erweiterung erscheint unter Einstellungen → Erweiterungen.
**Danach unter Einstellungen → Erweiterungen prüfen, dass beide Erweiterungen eingeschaltet sind.** Frisch installierte Erweiterungen können ausgeschaltet sein. **Danach unter Einstellungen → Erweiterungen prüfen, dass die Erweiterungen eingeschaltet sind.** Frisch installierte Erweiterungen können ausgeschaltet sein.
> **Windows meldet „Der Computer wurde durch Windows geschützt“ oder Defender schlägt an?** > **Windows meldet „Der Computer wurde durch Windows geschützt“ oder Defender schlägt an?**
> Die Erweiterungen sind nicht signiert. Nur installieren, wenn du der Quelle vertraust. > Die Erweiterungen sind nicht signiert. Nur installieren, wenn du der Quelle vertraust.
@@ -67,7 +96,7 @@ Für jede `.zip`-Datei:
1. In Claude auf **„+“** → **„Skill erstellen“** → **„Skill hochladen“**. 1. In Claude auf **„+“** → **„Skill erstellen“** → **„Skill hochladen“**.
2. Die ZIP-Datei auswählen und bestätigen. 2. Die ZIP-Datei auswählen und bestätigen.
Die Skills heißen danach `wordcraft-mcp` und `gridcraft-mcp`. Die Skills heißen danach `wordcraft-mcp`, `gridcraft-mcp`, `pdfcraft-mcp`, `figcraft-mcp`, `vectorcraft-mcp`, `solidcraft-mcp`, `cadcraft-mcp`, `effectcraft-mcp` und `filmcraft-mcp`.
--- ---
@@ -81,9 +110,20 @@ Claude **komplett beenden** – auch das Symbol unten rechts in der Taskleiste (
Einen **neuen** Chat öffnen (offene Chats sehen neue Werkzeuge evtl. erst später) und eintippen: Einen **neuen** Chat öffnen (offene Chats sehen neue Werkzeuge evtl. erst später) und eintippen:
> Sind die WordCraft- und GridCraft-Werkzeuge verfügbar? Leg zum Test eine kleine Excel-Tabelle mit drei Zeilen in meinem Claude-Ausgabeordner an. > Sind die Werkzeuge verfügbar?
Claude sollte beide Werkzeuge finden und eine `.xlsx`-Datei im Ausgabeordner speichern. Beim ersten Mal fragt Claude, ob es die Werkzeuge benutzen darf – erlauben. Die Werkzeuge heißen mit Präfix `…WordCraft_for_Claude…` bzw. `…GridCraft_for_Claude…`. Je App ein kurzer Test:
- **PdfCraft:** ein Test-PDF schwärzen und `doc_audit_redactions` ausführen.
- **FigCraft:** eine kleine HMI-Maske als PNG exportieren.
- **VectorCraft:** ein Typenschild 100×50 mm als DXF exportieren und die Maße im CAD prüfen.
- **SolidCraft:** einen Quader 40×30×20 mm bauen und das Volumen prüfen lassen (24000 mm³).
- **GridCraft:** eine kleine Excel-Tabelle mit drei Zeilen im Ausgabeordner anlegen.
- **WordCraft:** ein kurzes Dokument im Schreib-Ordner speichern.
Beim ersten Mal fragt Claude, ob es die Werkzeuge benutzen darf – erlauben. Die Werkzeuge heißen mit Präfix `…PdfCraft_for_Claude…` (und entsprechend für die anderen Apps).
Lass bei WordCraft `open_document` / `save_document`, bei GridCraft `open_workbook` / `save_workbook` / `execute_command`, bei PdfCraft `doc_open` / `doc_save` / `tool_call`, bei FigCraft und VectorCraft `open_file` / `save_file` / `export` und bei SolidCraft `open` / `save` / `export` auf **„Immer fragen“**, wenn du Pfade mitkontrollieren willst.
--- ---
@@ -101,15 +141,18 @@ Claude sollte beide Werkzeuge finden und eine `.xlsx`-Datei im Ausgabeordner spe
| Problem | Lösung | | Problem | Lösung |
|---|---| |---|---|
| Claude sagt, die Werkzeuge fehlen | Einstellungen → Erweiterungen: ist die Erweiterung eingeschaltet? Einschalten, dann neuen Chat öffnen. | | Claude sagt, die Werkzeuge fehlen | Einstellungen → Erweiterungen: ist die Erweiterung eingeschaltet? Einschalten, dann neuen Chat öffnen. |
| Werkzeuge fehlen, Erweiterung ist eingeschaltet | Prüfen, ob `C:\Program Files\WordCraft\wordcraft-cli.exe` (bzw. `C:\Program Files\GridCraft\gridcraft-cli.exe`) existiert; sonst über den ArtCraft-Launcher installieren. | | Werkzeuge fehlen, Erweiterung ist eingeschaltet | Prüfen, ob `C:\Program Files\<App>\<app>-cli.exe` existiert; sonst über den ArtCraft-Launcher installieren. |
| WordCraft speichert nicht („path rejected“) | Claude wollte außerhalb des Schreib-Ordners speichern. Ordner prüfen: Einstellungen → Erweiterungen → WordCraft for Claude → Einstellungen. | | SolidCraft: Werkzeuge fehlen, Erweiterung ist eingeschaltet | `C:\Program Files\SolidCraft\solidcraft-cli.exe` prüfen. Sonst den eigenen Installer (MSI oder `winget install bherbruck.SolidCraft`). |
| SolidCraft speichert die Datei nicht | Beide Ordner im Dialog gesetzt? Die Erweiterung übergibt zwei `--allow-path`. Steht in der Config `--connect`, muss die App mit `solidcraft --control` auf demselben Port lauschen. |
| Speichern scheitert („path rejected“) | Ziel lag außerhalb des Schreib-Ordners, oder (PdfCraft, VectorCraft) der Schreib-Ordner liegt nicht im Lese-Ordner. Einstellungen → Erweiterungen → die App → Einstellungen. |
| FigCraft fehlt im Launcher | Launcher auf 0.4.1 oder neuer aktualisieren. |
| Excel-Formeln zeigen `#NAME?` | Claude hat deutsche Funktionsnamen benutzt. Sagen: „Nutze englische Formeln, wie im Skill beschrieben.“ | | Excel-Formeln zeigen `#NAME?` | Claude hat deutsche Funktionsnamen benutzt. Sagen: „Nutze englische Formeln, wie im Skill beschrieben.“ |
| Zahlen sehen im Chat wie `1,450.00 €` aus | Normal. In Excel erscheinen sie richtig als `1.450,00 €`. | | Zahlen sehen im Chat wie `1,450.00 €` aus | Normal. In Excel erscheinen sie richtig als `1.450,00 €`. |
| Doppelklick auf `.mcpb` tut nichts | Über Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ gehen. | | Doppelklick auf `.mcpb` tut nichts | Über Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ gehen. |
## Aktualisieren ## Aktualisieren
Neue Version von der Releases-Seite laden, `.mcpb` erneut installieren und die neue Skill-ZIP hochladen. Fragt Claude, ob die bestehende Version ersetzt werden soll: ja. Danach Claude neu starten. Neue Version laden, `.mcpb` erneut installieren und die neue Skill-ZIP hochladen. Fragt Claude, ob die bestehende Version ersetzt werden soll: ja. Danach Claude neu starten. Claude holt diese Skills nicht von selbst aus dem Repo; es gibt keinen Sync.
## Entfernen ## Entfernen
+201
View File
@@ -0,0 +1,201 @@
# Builds dist\cursor\ from skills\: flat skill copies, mcp snippets, one plugin per skill.
# Usage: scripts\build-cursor.ps1 [-Name <skill-name>]
param([string]$Name)
. (Join-Path $PSScriptRoot 'lib.ps1')
. (Join-Path $PSScriptRoot 'cursor-deeplink.ps1')
$CursorDist = Join-Path $DistDir 'cursor'
$ServerKeys = @{
'wordcraft-mcp' = 'wordcraft'
'gridcraft-mcp' = 'gridcraft'
'pdfcraft-mcp' = 'pdfcraft'
'figcraft-mcp' = 'figcraft'
'vectorcraft-mcp' = 'vectorcraft'
'solidcraft-mcp' = 'solidcraft'
}
function Get-McpServerKey([string]$SkillName) {
if ($ServerKeys.ContainsKey($SkillName)) { return $ServerKeys[$SkillName] }
# fallback: strip trailing -mcp
if ($SkillName -match '^(.+)-mcp$') { return $Matches[1] }
return $SkillName
}
function Convert-ClaudeArgsToCursor([object[]]$CliArgs) {
$out = New-Object System.Collections.Generic.List[string]
foreach ($a in $CliArgs) {
$s = [string]$a
if ($s -eq '${user_config.author}') { $out.Add('${AUTHOR}'); continue }
if ($s -eq '${user_config.read_root}') { $out.Add('${READ_ROOT}'); continue }
if ($s -eq '${user_config.write_root}') { $out.Add('${WRITE_ROOT}'); continue }
$out.Add($s)
}
return , $out.ToArray()
}
function Convert-ArgsToUserHomeDefaults([object[]]$CliArgs) {
$out = New-Object System.Collections.Generic.List[string]
foreach ($a in $CliArgs) {
$s = [string]$a
if ($s -eq '${user_config.author}' -or $s -eq '${AUTHOR}') { $out.Add('Claude'); continue }
if ($s -eq '${user_config.read_root}' -or $s -eq '${READ_ROOT}') { $out.Add('${userHome}/Documents'); continue }
if ($s -eq '${user_config.write_root}' -or $s -eq '${WRITE_ROOT}') { $out.Add('${userHome}/Documents/Claude'); continue }
$out.Add($s)
}
return , $out.ToArray()
}
function Build-OneSkill([string]$N) {
$dir = Join-Path $SkillsDir $N
if (-not (Test-Path $dir -PathType Container)) {
Write-Host "skills/$N fehlt."
return $false
}
$ver = Get-SkillVersion $dir
if (-not $ver) {
Write-Host "CHANGELOG von $N hat keine Version."
return $false
}
$skillPath = Join-Path $dir 'SKILL.md'
$fm = Get-Frontmatter $skillPath
if ($null -eq $fm) {
Write-Host "${N}: kein Frontmatter."
return $false
}
$fmName = Get-FmValue $fm 'name'
$desc = Get-FmValue $fm 'description'
if ($fmName -cne $N) {
Write-Host "${N}: Frontmatter name '$fmName' != Ordner."
return $false
}
if (-not $desc -or $desc.Length -gt 1024) {
Write-Host "${N}: description fehlt oder > 1024."
return $false
}
# Flat skill copy
$flatDir = Join-Path (Join-Path $CursorDist 'skills') $N
New-Item -ItemType Directory -Force -Path $flatDir | Out-Null
Copy-Item -LiteralPath $skillPath -Destination (Join-Path $flatDir 'SKILL.md') -Force
$extManPath = Join-Path $dir 'extension\manifest.json'
$hasExt = Test-Path $extManPath
$pluginRoot = Join-Path (Join-Path $CursorDist 'plugins') $N
if (Test-Path $pluginRoot) { Remove-Item $pluginRoot -Recurse -Force }
New-Item -ItemType Directory -Force -Path (Join-Path $pluginRoot '.cursor-plugin') | Out-Null
$pluginSkillDir = Join-Path (Join-Path $pluginRoot 'skills') $N
New-Item -ItemType Directory -Force -Path $pluginSkillDir | Out-Null
Copy-Item -LiteralPath $skillPath -Destination (Join-Path $pluginSkillDir 'SKILL.md') -Force
$displayDesc = $desc
$authorName = 'Dominic Gundel'
$pluginVars = $null
$mcpForPlugin = $null
$mcpStandalone = $null
$serverKey = Get-McpServerKey $N
if ($hasExt) {
$man = (Read-Text $extManPath) | ConvertFrom-Json
if ($man.version -cne $ver) {
Write-Host "${N}: manifest version '$($man.version)' != CHANGELOG '$ver'."
return $false
}
$dn = [string]$man.display_name
if ($dn -match ' for Claude$') {
$displayDesc = ($dn -replace ' for Claude$', ' for Cursor') + '. ' + $desc
}
elseif ($man.description) {
$displayDesc = [string]$man.description
}
if ($man.author -and $man.author.name) { $authorName = [string]$man.author.name }
$cmd = [string]$man.server.mcp_config.command
$argsRaw = @($man.server.mcp_config.args)
$argsPlugin = Convert-ClaudeArgsToCursor $argsRaw
$argsHome = Convert-ArgsToUserHomeDefaults $argsRaw
$transportPlugin = @{ command = $cmd; args = @($argsPlugin) }
$transportHome = @{ command = $cmd; args = @($argsHome) }
$mcpForPlugin = @{ mcpServers = @{ $serverKey = $transportPlugin } }
$mcpStandalone = @{ mcpServers = @{ $serverKey = $transportHome } }
if ($man.user_config) {
$props = @{}
$required = @()
if ($man.user_config.read_root) {
$props['READ_ROOT'] = @{
type = 'string'
title = 'Lese-Ordner'
description = 'Weit fassen (Standard: Dokumente).'
default = '${userHome}/Documents'
}
$required += 'READ_ROOT'
}
if ($man.user_config.write_root) {
$props['WRITE_ROOT'] = @{
type = 'string'
title = 'Schreib-Ordner'
description = 'Eng halten (Standard: Dokumente/Claude).'
default = '${userHome}/Documents/Claude'
}
$required += 'WRITE_ROOT'
}
if ($man.user_config.author) {
$props['AUTHOR'] = @{
type = 'string'
title = 'Autorname'
description = 'Name fuer nachverfolgte Aenderungen.'
default = 'Claude'
}
}
if ($props.Count -gt 0) {
$pluginVars = @{
type = 'object'
properties = $props
}
if ($required.Count -gt 0) { $pluginVars['required'] = $required }
}
}
$mcpDir = Join-Path $CursorDist 'mcp'
New-Item -ItemType Directory -Force -Path $mcpDir | Out-Null
$snippetPath = Join-Path $mcpDir "$N.json"
Write-Text $snippetPath (($mcpStandalone | ConvertTo-Json -Depth 20) + "`n")
}
$pluginJson = @{
name = $N
version = $ver
description = $displayDesc
author = @{ name = $authorName }
license = 'MIT'
homepage = 'https://git.gundel.dev/dg/claude-skills'
repository = 'https://git.gundel.dev/dg/claude-skills.git'
}
if ($pluginVars) { $pluginJson['variables'] = $pluginVars }
Write-Text (Join-Path $pluginRoot '.cursor-plugin\plugin.json') (($pluginJson | ConvertTo-Json -Depth 20) + "`n")
if ($mcpForPlugin) {
Write-Text (Join-Path $pluginRoot 'mcp.json') (($mcpForPlugin | ConvertTo-Json -Depth 20) + "`n")
}
# Validate JSON round-trip
$null = (Read-Text (Join-Path $pluginRoot '.cursor-plugin\plugin.json')) | ConvertFrom-Json
if ($mcpForPlugin) {
$null = (Read-Text (Join-Path $pluginRoot 'mcp.json')) | ConvertFrom-Json
}
Write-Host "OK cursor plugin $N $ver"
return $true
}
if ($Name) { $names = @($Name) } else { $names = @(Get-SkillNames) }
New-Item -ItemType Directory -Force -Path $CursorDist | Out-Null
$ok = $true
foreach ($n in $names) {
if (-not (Build-OneSkill $n)) { $ok = $false }
}
if (-not $ok) { exit 1 }
exit 0
+206
View File
@@ -0,0 +1,206 @@
#!/usr/bin/env bash
# Builds dist/cursor/ from skills/: flat skill copies, mcp snippets, one plugin per skill.
# Usage: scripts/build-cursor.sh [skill-name]
set -euo pipefail
source "$(dirname "$0")/lib.sh"
name_filter="${1:-}"
CURSOR_DIST="$DIST_DIR/cursor"
python3 - "$ROOT" "$SKILLS_DIR" "$CURSOR_DIST" "$name_filter" <<'PY'
import json, os, re, shutil, sys
from pathlib import Path
root, skills_dir, cursor_dist, name_filter = Path(sys.argv[1]), Path(sys.argv[2]), Path(sys.argv[3]), sys.argv[4]
SERVER_KEYS = {
"wordcraft-mcp": "wordcraft",
"gridcraft-mcp": "gridcraft",
"pdfcraft-mcp": "pdfcraft",
"figcraft-mcp": "figcraft",
"vectorcraft-mcp": "vectorcraft",
"solidcraft-mcp": "solidcraft",
}
def skill_names():
names = sorted([p.name for p in skills_dir.iterdir() if p.is_dir()], key=lambda s: s)
if name_filter:
names = [n for n in names if n == name_filter]
return names
def skill_version(d: Path) -> str:
p = d / "CHANGELOG.md"
if not p.exists():
return ""
for line in p.read_text(encoding="utf-8").splitlines():
m = re.match(r"^## (\d+\.\d+\.\d+) \(\d{4}-\d{2}-\d{2}\)\s*$", line)
if m:
return m.group(1)
return ""
def frontmatter(path: Path):
text = path.read_text(encoding="utf-8").replace("\r", "")
lines = text.split("\n")
if not lines or lines[0] != "---":
return None
out = []
for line in lines[1:]:
if line == "---":
return out
out.append(line)
return None
def fm_value(lines, key):
for line in lines:
m = re.match(rf"^{re.escape(key)}\s*:(.*)$", line)
if m:
v = m.group(1).strip()
if (v.startswith('"') and v.endswith('"')) or (v.startswith("'") and v.endswith("'")):
v = v[1:-1]
return v
return None
def server_key(name):
if name in SERVER_KEYS:
return SERVER_KEYS[name]
m = re.match(r"^(.+)-mcp$", name)
return m.group(1) if m else name
def map_args_plugin(args):
out = []
for a in args:
s = str(a)
if s == "${user_config.author}":
out.append("${AUTHOR}")
elif s == "${user_config.read_root}":
out.append("${READ_ROOT}")
elif s == "${user_config.write_root}":
out.append("${WRITE_ROOT}")
else:
out.append(s)
return out
def map_args_home(args):
out = []
for a in args:
s = str(a)
if s in ("${user_config.author}", "${AUTHOR}"):
out.append("Claude")
elif s in ("${user_config.read_root}", "${READ_ROOT}"):
out.append("${userHome}/Documents")
elif s in ("${user_config.write_root}", "${WRITE_ROOT}"):
out.append("${userHome}/Documents/Claude")
else:
out.append(s)
return out
ok = True
cursor_dist.mkdir(parents=True, exist_ok=True)
for name in skill_names():
d = skills_dir / name
ver = skill_version(d)
skill = d / "SKILL.md"
fm = frontmatter(skill)
if not ver or fm is None:
print(f"FEHLER {name}: Version/Frontmatter", file=sys.stderr)
ok = False
continue
if fm_value(fm, "name") != name:
print(f"FEHLER {name}: name mismatch", file=sys.stderr)
ok = False
continue
desc = fm_value(fm, "description") or ""
if not desc or len(desc) > 1024:
print(f"FEHLER {name}: description", file=sys.stderr)
ok = False
continue
flat = cursor_dist / "skills" / name
flat.mkdir(parents=True, exist_ok=True)
shutil.copy2(skill, flat / "SKILL.md")
plugin = cursor_dist / "plugins" / name
if plugin.exists():
shutil.rmtree(plugin)
(plugin / ".cursor-plugin").mkdir(parents=True)
(plugin / "skills" / name).mkdir(parents=True)
shutil.copy2(skill, plugin / "skills" / name / "SKILL.md")
display_desc = desc
author = "Dominic Gundel"
variables = None
man_path = d / "extension" / "manifest.json"
sk = server_key(name)
if man_path.exists():
man = json.loads(man_path.read_text(encoding="utf-8"))
if man.get("version") != ver:
print(f"FEHLER {name}: manifest version != CHANGELOG", file=sys.stderr)
ok = False
continue
dn = man.get("display_name") or ""
if dn.endswith(" for Claude"):
display_desc = dn.replace(" for Claude", " for Cursor") + ". " + desc
elif man.get("description"):
display_desc = man["description"]
if man.get("author", {}).get("name"):
author = man["author"]["name"]
cmd = man["server"]["mcp_config"]["command"]
args = list(man["server"]["mcp_config"].get("args") or [])
mcp_plugin = {"mcpServers": {sk: {"command": cmd, "args": map_args_plugin(args)}}}
mcp_home = {"mcpServers": {sk: {"command": cmd, "args": map_args_home(args)}}}
(cursor_dist / "mcp").mkdir(parents=True, exist_ok=True)
(cursor_dist / "mcp" / f"{name}.json").write_text(
json.dumps(mcp_home, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
)
(plugin / "mcp.json").write_text(
json.dumps(mcp_plugin, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
)
uc = man.get("user_config") or {}
props = {}
required = []
if "read_root" in uc:
props["READ_ROOT"] = {
"type": "string",
"title": "Lese-Ordner",
"description": "Weit fassen (Standard: Dokumente).",
"default": "${userHome}/Documents",
}
required.append("READ_ROOT")
if "write_root" in uc:
props["WRITE_ROOT"] = {
"type": "string",
"title": "Schreib-Ordner",
"description": "Eng halten (Standard: Dokumente/Claude).",
"default": "${userHome}/Documents/Claude",
}
required.append("WRITE_ROOT")
if "author" in uc:
props["AUTHOR"] = {
"type": "string",
"title": "Autorname",
"description": "Name fuer nachverfolgte Aenderungen.",
"default": "Claude",
}
if props:
variables = {"type": "object", "properties": props}
if required:
variables["required"] = required
plugin_json = {
"name": name,
"version": ver,
"description": display_desc,
"author": {"name": author},
"license": "MIT",
"homepage": "https://git.gundel.dev/dg/claude-skills",
"repository": "https://git.gundel.dev/dg/claude-skills.git",
}
if variables:
plugin_json["variables"] = variables
(plugin / ".cursor-plugin" / "plugin.json").write_text(
json.dumps(plugin_json, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
)
print(f"OK cursor plugin {name} {ver}")
sys.exit(0 if ok else 1)
PY
+72
View File
@@ -0,0 +1,72 @@
# Builds a Cursor MCP install deeplink.
# config = base64(JSON.stringify({command, args, ...})) -- transport only
# name = server key (separate query param)
# Wrapping as { serverName: transport } makes Cursor show command: "".
# Usage: . scripts\cursor-deeplink.ps1; New-CursorDeeplink -ServerName wordcraft -Config @{ command='...'; args=@('mcp') }
param(
[string]$Name,
[string]$ConfigJson
)
. (Join-Path $PSScriptRoot 'lib.ps1')
function New-CursorDeeplink([string]$ServerName, $Config) {
$command = $null
$argList = @()
$extra = @{}
if ($Config -is [string]) {
$Config = $Config | ConvertFrom-Json
}
if ($Config -is [hashtable]) {
if ($Config.ContainsKey($ServerName) -and $Config[$ServerName] -is [hashtable]) {
$Config = $Config[$ServerName]
}
$command = [string]$Config['command']
if ($Config.ContainsKey('args')) { $argList = @($Config['args']) }
foreach ($k in $Config.Keys) {
if ($k -ne 'command' -and $k -ne 'args') { $extra[$k] = $Config[$k] }
}
}
else {
# PSCustomObject
$props = @($Config.PSObject.Properties.Name)
if ($props.Count -eq 1 -and $props[0] -eq $ServerName) {
$Config = $Config.$ServerName
$props = @($Config.PSObject.Properties.Name)
}
$command = [string]$Config.command
if ($null -ne $Config.args) { $argList = @($Config.args) }
foreach ($p in $Config.PSObject.Properties) {
if ($p.Name -ne 'command' -and $p.Name -ne 'args') { $extra[$p.Name] = $p.Value }
}
}
# Forward slashes: valid on Windows, safer through JSON/URL pipelines.
if ($command -match '^[A-Za-z]:\\') {
$command = $command -replace '\\', '/'
}
$transport = [ordered]@{ command = $command; args = @($argList) }
foreach ($k in $extra.Keys) { $transport[$k] = $extra[$k] }
$jsonPath = [IO.Path]::GetTempFileName()
try {
# Write via .NET so Python can re-dump with JSON.stringify-compatible compact form.
$psJson = ($transport | ConvertTo-Json -Compress -Depth 20)
[IO.File]::WriteAllText($jsonPath, $psJson, $Utf8NoBom)
$json = & python -c "import json,sys; print(json.dumps(json.load(open(sys.argv[1],encoding='utf-8')),separators=(',',':'),ensure_ascii=False))" $jsonPath
if (-not $json) { $json = $psJson }
}
finally {
Remove-Item -LiteralPath $jsonPath -Force -ErrorAction SilentlyContinue
}
$bytes = $Utf8NoBom.GetBytes($json)
$b64 = [Convert]::ToBase64String($bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_')
return "cursor://anysphere.cursor-deeplink/mcp/install?name=$([Uri]::EscapeDataString($ServerName))&config=$b64"
}
if ($Name -and $ConfigJson) {
Write-Output (New-CursorDeeplink -ServerName $Name -Config $ConfigJson)
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Prints a Cursor MCP install deeplink.
# Usage: scripts/cursor-deeplink.sh <server-name> '<transport-json>'
# transport-json = {"command":"...","args":[...]}
set -euo pipefail
name="${1:-}"
config="${2:-}"
if [[ -z "$name" || -z "$config" ]]; then
echo "Aufruf: scripts/cursor-deeplink.sh <server-name> '<transport-json>'" >&2
exit 1
fi
python3 -c '
import base64, json, sys, urllib.parse
name, raw = sys.argv[1], sys.argv[2]
transport = json.loads(raw)
# Unwrap { name: transport } if the caller passed it that way.
if set(transport.keys()) == {name} and isinstance(transport[name], dict):
transport = transport[name]
cmd = transport.get("command") or ""
if len(cmd) >= 3 and cmd[1] == ":" and "\\" in cmd:
transport = dict(transport)
transport["command"] = cmd.replace("\\\\", "/").replace("\\", "/")
# config = transport only; name= is a separate query param.
b64 = base64.urlsafe_b64encode(json.dumps(transport, separators=(",", ":")).encode("utf-8")).decode("ascii").rstrip("=")
print(f"cursor://anysphere.cursor-deeplink/mcp/install?name={urllib.parse.quote(name)}&config={b64}")
' "$name" "$config"
+61 -4
View File
@@ -1,4 +1,4 @@
# Checks that the ArtCraft-Launcher CLI is installed and refreshes upstream.json + LICENSES. # Checks that the skill CLI is installed and refreshes upstream.json + LICENSES.
# Does NOT copy or ship the EXE into the extension package. # Does NOT copy or ship the EXE into the extension package.
# Usage: scripts\fetch-cli.ps1 -Name <skill-name> [-CliPath <path>] # Usage: scripts\fetch-cli.ps1 -Name <skill-name> [-CliPath <path>]
param( param(
@@ -27,6 +27,49 @@ $defaults = @{
Repo = 'https://github.com/storytold/gridcraft' Repo = 'https://github.com/storytold/gridcraft'
RepoSlug = 'storytold/gridcraft' RepoSlug = 'storytold/gridcraft'
} }
'pdfcraft-mcp' = @{
ExeName = 'pdfcraft-cli.exe'
Default = 'C:\Program Files\PdfCraft\pdfcraft-cli.exe'
Repo = 'https://github.com/storytold/pdfcraft'
RepoSlug = 'storytold/pdfcraft'
}
'figcraft-mcp' = @{
ExeName = 'figcraft-cli.exe'
Default = 'C:\Program Files\FigCraft\figcraft-cli.exe'
Repo = 'https://github.com/storytold/figcraft'
RepoSlug = 'storytold/figcraft'
}
'vectorcraft-mcp' = @{
ExeName = 'vectorcraft-cli.exe'
Default = 'C:\Program Files\VectorCraft\vectorcraft-cli.exe'
Repo = 'https://github.com/storytold/vectorcraft'
RepoSlug = 'storytold/vectorcraft'
}
'solidcraft-mcp' = @{
ExeName = 'solidcraft-cli.exe'
Default = 'C:\Program Files\SolidCraft\solidcraft-cli.exe'
Repo = 'https://github.com/tangency-labs/solidcraft'
RepoSlug = 'tangency-labs/solidcraft'
Source = 'SolidCraft-Installer'
}
'cadcraft-mcp' = @{
ExeName = 'cadcraft-cli.exe'
Default = 'C:\Program Files\CADCraft\cadcraft-cli.exe'
Repo = 'https://github.com/storytold/cadcraft'
RepoSlug = 'storytold/cadcraft'
}
'effectcraft-mcp' = @{
ExeName = 'effectcraft-cli.exe'
Default = 'C:\Program Files\EffectCraft\effectcraft-cli.exe'
Repo = 'https://github.com/storytold/effectcraft'
RepoSlug = 'storytold/effectcraft'
}
'filmcraft-mcp' = @{
ExeName = 'filmcraft-cli.exe'
Default = 'C:\Program Files\FilmCraft\filmcraft-cli.exe'
Repo = 'https://github.com/storytold/filmcraft'
RepoSlug = 'storytold/filmcraft'
}
} }
if (-not $defaults.ContainsKey($Name)) { if (-not $defaults.ContainsKey($Name)) {
@@ -34,10 +77,17 @@ if (-not $defaults.ContainsKey($Name)) {
exit 1 exit 1
} }
$meta = $defaults[$Name] $meta = $defaults[$Name]
$sourceName = 'ArtCraft-Launcher'
if ($meta.ContainsKey('Source') -and $meta.Source) { $sourceName = [string]$meta.Source }
$src = if ($CliPath) { $CliPath } else { $meta.Default } $src = if ($CliPath) { $CliPath } else { $meta.Default }
if (-not (Test-Path -LiteralPath $src)) { if (-not (Test-Path -LiteralPath $src)) {
Write-Host "CLI fehlt: $src" Write-Host "CLI fehlt: $src"
Write-Host "Bitte WordCraft/GridCraft ueber den ArtCraft-Launcher installieren, oder -CliPath angeben." if ($sourceName -eq 'ArtCraft-Launcher') {
Write-Host "Bitte die App ueber den ArtCraft-Launcher installieren, oder -CliPath angeben."
}
else {
Write-Host "Bitte die App ueber den eigenen Installer installieren, oder -CliPath angeben."
}
exit 1 exit 1
} }
@@ -47,9 +97,15 @@ New-Item -ItemType Directory -Force -Path $serverDir | Out-Null
Get-ChildItem -LiteralPath $serverDir -Filter '*.exe' -ErrorAction SilentlyContinue | Remove-Item -Force Get-ChildItem -LiteralPath $serverDir -Filter '*.exe' -ErrorAction SilentlyContinue | Remove-Item -Force
$readme = Join-Path $serverDir 'README.txt' $readme = Join-Path $serverDir 'README.txt'
if (-not (Test-Path $readme)) { if (-not (Test-Path $readme)) {
if ($sourceName -eq 'ArtCraft-Launcher') {
$installLine = 'Installiere die App ueber den ArtCraft-Launcher.'
}
else {
$installLine = 'Installiere die App ueber den eigenen Installer.'
}
Write-Text $readme @" Write-Text $readme @"
Diese Erweiterung enthaelt keine CLI. Diese Erweiterung enthaelt keine CLI.
Installiere die App ueber den ArtCraft-Launcher. $installLine
Erwarteter Pfad: $src Erwarteter Pfad: $src
"@ "@
} }
@@ -69,7 +125,7 @@ if (-not $ver) {
$hash = (Get-FileHash -LiteralPath $src -Algorithm SHA256).Hash.ToLowerInvariant() $hash = (Get-FileHash -LiteralPath $src -Algorithm SHA256).Hash.ToLowerInvariant()
$upstream = @{ $upstream = @{
source = 'ArtCraft-Launcher' source = $sourceName
path = $src path = $src
exe = $meta.ExeName exe = $meta.ExeName
version = $ver version = $ver
@@ -97,3 +153,4 @@ foreach ($f in @('LICENSE-MIT', 'LICENSE-APACHE', 'NOTICE')) {
} }
Write-Host "OK $Name $ver (nicht gebundelt) $src" Write-Host "OK $Name $ver (nicht gebundelt) $src"
exit 0
+58 -5
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Checks that the ArtCraft-Launcher CLI is installed and refreshes upstream.json + LICENSES. # Checks that the skill CLI is installed and refreshes upstream.json + LICENSES.
# Does NOT copy or ship the EXE into the extension package. # Does NOT copy or ship the EXE into the extension package.
# Usage: scripts/fetch-cli.sh <skill-name> [cli-path] # Usage: scripts/fetch-cli.sh <skill-name> [cli-path]
set -euo pipefail set -euo pipefail
@@ -18,6 +18,7 @@ if [[ ! -f "$ext/manifest.json" ]]; then
exit 1 exit 1
fi fi
source_name='ArtCraft-Launcher'
case "$name" in case "$name" in
wordcraft-mcp) wordcraft-mcp)
exe_name=wordcraft-cli.exe exe_name=wordcraft-cli.exe
@@ -31,6 +32,49 @@ case "$name" in
repo='https://github.com/storytold/gridcraft' repo='https://github.com/storytold/gridcraft'
repo_slug='storytold/gridcraft' repo_slug='storytold/gridcraft'
;; ;;
pdfcraft-mcp)
exe_name=pdfcraft-cli.exe
default='C:/Program Files/PdfCraft/pdfcraft-cli.exe'
repo='https://github.com/storytold/pdfcraft'
repo_slug='storytold/pdfcraft'
;;
figcraft-mcp)
exe_name=figcraft-cli.exe
default='C:/Program Files/FigCraft/figcraft-cli.exe'
repo='https://github.com/storytold/figcraft'
repo_slug='storytold/figcraft'
;;
vectorcraft-mcp)
exe_name=vectorcraft-cli.exe
default='C:/Program Files/VectorCraft/vectorcraft-cli.exe'
repo='https://github.com/storytold/vectorcraft'
repo_slug='storytold/vectorcraft'
;;
solidcraft-mcp)
exe_name=solidcraft-cli.exe
default='C:/Program Files/SolidCraft/solidcraft-cli.exe'
repo='https://github.com/tangency-labs/solidcraft'
repo_slug='tangency-labs/solidcraft'
source_name='SolidCraft-Installer'
;;
cadcraft-mcp)
exe_name=cadcraft-cli.exe
default='C:/Program Files/CADCraft/cadcraft-cli.exe'
repo='https://github.com/storytold/cadcraft'
repo_slug='storytold/cadcraft'
;;
effectcraft-mcp)
exe_name=effectcraft-cli.exe
default='C:/Program Files/EffectCraft/effectcraft-cli.exe'
repo='https://github.com/storytold/effectcraft'
repo_slug='storytold/effectcraft'
;;
filmcraft-mcp)
exe_name=filmcraft-cli.exe
default='C:/Program Files/FilmCraft/filmcraft-cli.exe'
repo='https://github.com/storytold/filmcraft'
repo_slug='storytold/filmcraft'
;;
*) *)
echo "Kein CLI-Mapping fuer Skill '$name'." >&2 echo "Kein CLI-Mapping fuer Skill '$name'." >&2
exit 1 exit 1
@@ -40,16 +84,25 @@ esac
src="${cli_path:-$default}" src="${cli_path:-$default}"
if [[ ! -f "$src" ]]; then if [[ ! -f "$src" ]]; then
echo "CLI fehlt: $src" >&2 echo "CLI fehlt: $src" >&2
echo "Bitte WordCraft/GridCraft ueber den ArtCraft-Launcher installieren, oder Pfad als Argument angeben." >&2 if [[ "$source_name" == ArtCraft-Launcher ]]; then
echo "Bitte die App ueber den ArtCraft-Launcher installieren, oder Pfad als Argument angeben." >&2
else
echo "Bitte die App ueber den eigenen Installer installieren, oder Pfad als Argument angeben." >&2
fi
exit 1 exit 1
fi fi
mkdir -p "$ext/server" mkdir -p "$ext/server"
rm -f "$ext/server"/*.exe rm -f "$ext/server"/*.exe
if [[ ! -f "$ext/server/README.txt" ]]; then if [[ ! -f "$ext/server/README.txt" ]]; then
if [[ "$source_name" == ArtCraft-Launcher ]]; then
install_line='Installiere die App ueber den ArtCraft-Launcher.'
else
install_line='Installiere die App ueber den eigenen Installer.'
fi
printf '%s\n' \ printf '%s\n' \
'Diese Erweiterung enthaelt keine CLI.' \ 'Diese Erweiterung enthaelt keine CLI.' \
'Installiere die App ueber den ArtCraft-Launcher.' \ "$install_line" \
"Erwarteter Pfad: $src" > "$ext/server/README.txt" "Erwarteter Pfad: $src" > "$ext/server/README.txt"
fi fi
@@ -85,7 +138,7 @@ fi
python3 -c " python3 -c "
import json, sys import json, sys
print(json.dumps({ print(json.dumps({
'source': 'ArtCraft-Launcher', 'source': sys.argv[6],
'path': sys.argv[1], 'path': sys.argv[1],
'exe': sys.argv[2], 'exe': sys.argv[2],
'version': sys.argv[3], 'version': sys.argv[3],
@@ -94,7 +147,7 @@ print(json.dumps({
'tag': 'v' + sys.argv[3], 'tag': 'v' + sys.argv[3],
'bundled': False, 'bundled': False,
}, separators=(',', ':'))) }, separators=(',', ':')))
" "$src" "$exe_name" "$ver" "$hash" "$repo" > "$ext/upstream.json" " "$src" "$exe_name" "$ver" "$hash" "$repo" "$source_name" > "$ext/upstream.json"
printf '\n' >> "$ext/upstream.json" || true printf '\n' >> "$ext/upstream.json" || true
mkdir -p "$ext/LICENSES" mkdir -p "$ext/LICENSES"
+37 -1
View File
@@ -1,7 +1,10 @@
# Builds ZIP for every skill and .mcpb when skills\<name>\extension\ exists. # Builds ZIP for every skill, .mcpb when extension/ exists, and Cursor plugin ZIPs.
# Usage: scripts\package-all.ps1 # Usage: scripts\package-all.ps1
. (Join-Path $PSScriptRoot 'lib.ps1') . (Join-Path $PSScriptRoot 'lib.ps1')
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
& (Join-Path $PSScriptRoot 'package.ps1') & (Join-Path $PSScriptRoot 'package.ps1')
if ($LASTEXITCODE -ne 0) { exit 1 } if ($LASTEXITCODE -ne 0) { exit 1 }
@@ -12,3 +15,36 @@ foreach ($n in (Get-SkillNames)) {
if ($LASTEXITCODE -ne 0) { exit 1 } if ($LASTEXITCODE -ne 0) { exit 1 }
} }
} }
& (Join-Path $PSScriptRoot 'build-cursor.ps1')
if ($LASTEXITCODE -ne 0) { exit 1 }
foreach ($n in (Get-SkillNames)) {
$pluginDir = Join-Path $DistDir "cursor\plugins\$n"
if (-not (Test-Path $pluginDir)) { continue }
$ver = Get-SkillVersion (Join-Path $SkillsDir $n)
$out = Join-Path $DistDir "$n-cursor-v$ver.zip"
if (Test-Path $out) { Remove-Item $out -Force }
$src = (Get-Item $pluginDir).FullName
$files = @(Get-ChildItem -Path $src -Recurse -File -Force | ForEach-Object { $_.FullName })
[Array]::Sort($files, [StringComparer]::Ordinal)
$zip = [IO.Compression.ZipFile]::Open($out, [IO.Compression.ZipArchiveMode]::Create)
try {
[void]$zip.CreateEntry("$n/")
foreach ($f in $files) {
$rel = $f.Substring($src.Length).TrimStart('\', '/') -replace '\\', '/'
[void][IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $f, "$n/$rel")
}
}
finally { $zip.Dispose() }
Write-Host ''
Write-Host "dist/$n-cursor-v$ver.zip"
$read = [IO.Compression.ZipFile]::OpenRead($out)
try {
foreach ($e in $read.Entries) { Write-Host ('{0,9} {1}' -f $e.Length, $e.FullName) }
}
finally { $read.Dispose() }
}
+16 -1
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Builds ZIP for every skill and .mcpb when skills/<name>/extension/ exists. # Builds ZIP for every skill, .mcpb when extension/ exists, and Cursor plugin ZIPs.
# Usage: scripts/package-all.sh # Usage: scripts/package-all.sh
set -euo pipefail set -euo pipefail
source "$(dirname "$0")/lib.sh" source "$(dirname "$0")/lib.sh"
@@ -12,3 +12,18 @@ while IFS= read -r name; do
bash "$(dirname "$0")/package-mcpb.sh" "$name" bash "$(dirname "$0")/package-mcpb.sh" "$name"
fi fi
done < <(skill_names) done < <(skill_names)
bash "$(dirname "$0")/build-cursor.sh"
while IFS= read -r name; do
[[ -z "$name" ]] && continue
plugin="$DIST_DIR/cursor/plugins/$name"
[[ -d "$plugin" ]] || continue
ver="$(skill_version "$SKILLS_DIR/$name")"
out="$DIST_DIR/$name-cursor-v$ver.zip"
rm -f "$out"
(cd "$DIST_DIR/cursor/plugins" && zip -r "$out" "$name")
echo
echo "dist/$name-cursor-v$ver.zip"
unzip -l "$out"
done < <(skill_names)
+31
View File
@@ -135,7 +135,38 @@ if (Test-Path (Join-Path (Join-Path $dir 'extension') 'manifest.json')) {
} }
} }
$cursorName = "$Name-cursor-v$ver.zip"
$cursorPath = Join-Path $DistDir $cursorName
$cursorAsset = $null
if (-not (Test-Path $cursorPath)) {
& (Join-Path $PSScriptRoot 'build-cursor.ps1') -Name $Name
if ($LASTEXITCODE -eq 0) {
$pluginDir = Join-Path $DistDir "cursor\plugins\$Name"
if (Test-Path $pluginDir) {
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.FileSystem
$src = (Get-Item $pluginDir).FullName
$files = @(Get-ChildItem -Path $src -Recurse -File -Force | ForEach-Object { $_.FullName })
[Array]::Sort($files, [StringComparer]::Ordinal)
$zip = [IO.Compression.ZipFile]::Open($cursorPath, [IO.Compression.ZipArchiveMode]::Create)
try {
[void]$zip.CreateEntry("$Name/")
foreach ($f in $files) {
$rel = $f.Substring($src.Length).TrimStart('\', '/') -replace '\\', '/'
[void][IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $f, "$Name/$rel")
}
}
finally { $zip.Dispose() }
}
}
}
if (Test-Path $cursorPath) {
$cursorUrl = "$RepoApi/releases/$($created.id)/assets?name=$([Uri]::EscapeDataString($cursorName))"
$cursorAsset = Invoke-ReleaseApi 'POST' $cursorUrl ([IO.File]::ReadAllBytes($cursorPath)) 'application/octet-stream' | ConvertFrom-Json
}
if ($created.html_url) { Write-Host $created.html_url } if ($created.html_url) { Write-Host $created.html_url }
if ($asset.browser_download_url) { Write-Host $asset.browser_download_url } if ($asset.browser_download_url) { Write-Host $asset.browser_download_url }
if ($mcpbAsset -and $mcpbAsset.browser_download_url) { Write-Host $mcpbAsset.browser_download_url } if ($mcpbAsset -and $mcpbAsset.browser_download_url) { Write-Host $mcpbAsset.browser_download_url }
if ($cursorAsset -and $cursorAsset.browser_download_url) { Write-Host $cursorAsset.browser_download_url }
Write-Host "Release $tag angelegt." Write-Host "Release $tag angelegt."
+12
View File
@@ -121,5 +121,17 @@ if [[ -f "$dir/extension/manifest.json" ]]; then
fi fi
fi fi
cursor_name="$name-cursor-v$version.zip"
cursor_path="$DIST_DIR/$cursor_name"
if [[ ! -f "$cursor_path" ]]; then
bash "$(dirname "$0")/package-all.sh" >/dev/null 2>&1 || bash "$(dirname "$0")/build-cursor.sh" "$name" || true
if [[ -d "$DIST_DIR/cursor/plugins/$name" ]]; then
(cd "$DIST_DIR/cursor/plugins" && zip -r "$cursor_path" "$name")
fi
fi
if [[ -f "$cursor_path" ]]; then
upload_asset "$cursor_path" "$cursor_name"
fi
[[ -n "$html" ]] && echo "$html" [[ -n "$html" ]] && echo "$html"
echo "Release $tag angelegt." echo "Release $tag angelegt."
+80 -9
View File
@@ -1,8 +1,9 @@
# Erzeugt die Skill-Tabelle in README.md zwischen <!-- skills:start --> und <!-- skills:end --> # Erzeugt die Skill-Uebersicht in README.md zwischen <!-- skills:start --> und <!-- skills:end -->
# neu. Mit -Check wird nur geprueft, ob die Tabelle aktuell ist (Exit-Code 1, wenn nicht). # neu. Mit -Check wird nur geprueft, ob sie aktuell ist (Exit-Code 1, wenn nicht).
# Aufruf: scripts\update-index.ps1 [-Check] # Aufruf: scripts\update-index.ps1 [-Check]
param([switch]$Check) param([switch]$Check)
. (Join-Path $PSScriptRoot 'lib.ps1') . (Join-Path $PSScriptRoot 'lib.ps1')
. (Join-Path $PSScriptRoot 'cursor-deeplink.ps1')
$RepoWeb = 'https://git.gundel.dev/dg/claude-skills' $RepoWeb = 'https://git.gundel.dev/dg/claude-skills'
$readme = Join-Path $Root 'README.md' $readme = Join-Path $Root 'README.md'
@@ -15,7 +16,37 @@ if ($start -lt 0 -or $end -lt $start) {
exit 1 exit 1
} }
$table = @('| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) |', '|---|---|---|---|---|---|') function ConvertTo-MdText([string]$s) {
if ([string]::IsNullOrEmpty($s)) { return '' }
$map = [ordered]@{
'\' = '\\'
'*' = '\*'
'_' = '\_'
'`' = '\`'
'[' = '\['
}
foreach ($k in @($map.Keys)) { $s = $s.Replace($k, $map[$k]) }
return $s
}
$ServerKeys = @{
'wordcraft-mcp' = 'wordcraft'
'gridcraft-mcp' = 'gridcraft'
'pdfcraft-mcp' = 'pdfcraft'
'figcraft-mcp' = 'figcraft'
'vectorcraft-mcp' = 'vectorcraft'
'solidcraft-mcp' = 'solidcraft'
}
function Get-McpServerKey([string]$SkillName) {
if ($ServerKeys.ContainsKey($SkillName)) { return $ServerKeys[$SkillName] }
if ($SkillName -match '^(.+)-mcp$') { return $Matches[1] }
return $SkillName
}
# Mittelpunkt als Zeichencode: Windows PowerShell 5.1 liest .ps1 ohne BOM als ANSI.
$dot = [char]0x00B7
$table = @()
foreach ($n in (Get-SkillNames)) { foreach ($n in (Get-SkillNames)) {
$dir = Join-Path $SkillsDir $n $dir = Join-Path $SkillsDir $n
$desc = '' $desc = ''
@@ -27,15 +58,55 @@ foreach ($n in (Get-SkillNames)) {
if ($d) { $desc = $d } if ($d) { $desc = $d }
} }
} }
$desc = $desc.Replace('|', '\|') $lead = $desc.Trim()
$note = ''
$cut = $lead.IndexOf(' Verwenden')
if ($cut -gt 0) {
$note = $lead.Substring($cut + 1).Trim()
$lead = $lead.Substring(0, $cut).Trim()
}
if ($lead.Length -gt 0 -and [char]::IsLower($lead[0])) {
$lead = $lead.Substring(0, 1).ToUpperInvariant() + $lead.Substring(1)
}
$ver = Get-SkillVersion $dir $ver = Get-SkillVersion $dir
$tagEnc = [Uri]::EscapeDataString("$n/v$ver") $tagEnc = [Uri]::EscapeDataString("$n/v$ver")
$zipLink = "[{0}-v{1}.zip]({2}/releases/download/{3}/{0}-v{1}.zip)" -f $n, $ver, $RepoWeb, $tagEnc $base = "$RepoWeb/releases/download/$tagEnc"
$mcpb = '' $zipName = "$n-v$ver.zip"
if (Test-Path (Join-Path $dir 'extension\manifest.json')) { $links = @(
$mcpb = "[{0}-v{1}.mcpb]({2}/releases/download/{3}/{0}-v{1}.mcpb)" -f $n, $ver, $RepoWeb, $tagEnc "[Doku](skills/$n/README.md)",
"[Skill-ZIP]($base/$zipName `"$zipName`")"
)
$extPath = Join-Path $dir 'extension\manifest.json'
if (Test-Path $extPath) {
$mcpbName = "$n-v$ver.mcpb"
$cursorName = "$n-cursor-v$ver.zip"
$links += "[Erweiterung]($base/$mcpbName `"$mcpbName`")"
$links += "[Cursor-Plugin]($base/$cursorName `"$cursorName`")"
$man = (Read-Text $extPath) | ConvertFrom-Json
$serverKey = Get-McpServerKey $n
$cmd = [string]$man.server.mcp_config.command
$argsList = New-Object System.Collections.Generic.List[string]
foreach ($a in @($man.server.mcp_config.args)) {
$s = [string]$a
if ($s -eq '${user_config.author}') { $argsList.Add('Claude'); continue }
if ($s -eq '${user_config.read_root}') { $argsList.Add('${userHome}/Documents'); continue }
if ($s -eq '${user_config.write_root}') { $argsList.Add('${userHome}/Documents/Claude'); continue }
$argsList.Add($s)
} }
$table += ('| [{0}](skills/{0}/) | {1} | {2} | [README](skills/{0}/README.md) | {3} | {4} |' -f $n, $desc, $ver, $zipLink, $mcpb) $transport = @{ command = $cmd; args = @($argsList) }
$link = New-CursorDeeplink -ServerName $serverKey -Config $transport
$links += "[Add to Cursor]($link)"
}
if ($table.Count -gt 0) { $table += ''; $table += '---'; $table += '' }
$table += "### [$n](skills/$n/) $dot ``v$ver``"
$table += ''
$table += '> ' + (ConvertTo-MdText $lead)
$table += ''
if ($note) {
$table += '*' + (ConvertTo-MdText $note) + '*'
$table += ''
}
$table += ($links -join " $dot ")
} }
$newLines = @() $newLines = @()
+69 -13
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Erzeugt die Skill-Tabelle in README.md zwischen <!-- skills:start --> und <!-- skills:end --> # Erzeugt die Skill-Übersicht in README.md zwischen <!-- skills:start --> und <!-- skills:end -->
# neu. Mit --check wird nur geprüft, ob die Tabelle aktuell ist (Exit-Code 1, wenn nicht). # neu. Mit --check wird nur geprüft, ob sie aktuell ist (Exit-Code 1, wenn nicht).
# Aufruf: scripts/update-index.sh [--check] # Aufruf: scripts/update-index.sh [--check]
set -euo pipefail set -euo pipefail
source "$(dirname "$0")/lib.sh" source "$(dirname "$0")/lib.sh"
@@ -18,24 +18,81 @@ fi
table="$(mktemp)" table="$(mktemp)"
trap 'rm -f "$table"' EXIT trap 'rm -f "$table"' EXIT
{ {
echo "| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) |" first=1
echo "|---|---|---|---|---|---|"
while IFS= read -r name; do while IFS= read -r name; do
[[ -z "$name" ]] && continue [[ -z "$name" ]] && continue
desc=""
ver="$(skill_version "$SKILLS_DIR/$name")" ver="$(skill_version "$SKILLS_DIR/$name")"
desc=""
if fm="$(frontmatter "$SKILLS_DIR/$name/SKILL.md" 2>/dev/null)"; then if fm="$(frontmatter "$SKILLS_DIR/$name/SKILL.md" 2>/dev/null)"; then
desc="$(fm_value "$fm" description || true)" desc="$(fm_value "$fm" description || true)"
fi fi
desc="${desc//|/\\|}" deeplink=""
tag_enc="$(python3 -c 'import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1], safe=""))' "$name/v$ver")"
zip_link="[${name}-v${ver}.zip](${REPO_WEB}/releases/download/${tag_enc}/${name}-v${ver}.zip)"
mcpb=""
if [[ -f "$SKILLS_DIR/$name/extension/manifest.json" ]]; then if [[ -f "$SKILLS_DIR/$name/extension/manifest.json" ]]; then
mcpb="[${name}-v${ver}.mcpb](${REPO_WEB}/releases/download/${tag_enc}/${name}-v${ver}.mcpb)" deeplink="$(python3 - "$SKILLS_DIR/$name/extension/manifest.json" "$name" <<'PY'
import json, base64, sys, urllib.parse, re
man = json.load(open(sys.argv[1], encoding="utf-8"))
name = sys.argv[2]
sk = {"wordcraft-mcp":"wordcraft","gridcraft-mcp":"gridcraft","pdfcraft-mcp":"pdfcraft","figcraft-mcp":"figcraft","vectorcraft-mcp":"vectorcraft","solidcraft-mcp":"solidcraft"}.get(name)
if not sk:
m = re.match(r"^(.+)-mcp$", name)
sk = m.group(1) if m else name
cmd = man["server"]["mcp_config"]["command"]
args = []
for a in man["server"]["mcp_config"].get("args") or []:
s = str(a)
if s == "${user_config.author}":
args.append("Claude")
elif s == "${user_config.read_root}":
args.append("${userHome}/Documents")
elif s == "${user_config.write_root}":
args.append("${userHome}/Documents/Claude")
else:
args.append(s)
# Forward slashes; config = transport only (name= is separate).
if len(cmd) >= 3 and cmd[1] == ":" and "\\" in cmd:
cmd = cmd.replace("\\", "/")
transport = {"command": cmd, "args": args}
b64 = base64.urlsafe_b64encode(json.dumps(transport, separators=(",", ":")).encode()).decode().rstrip("=")
print(f"cursor://anysphere.cursor-deeplink/mcp/install?name={urllib.parse.quote(sk)}&config={b64}")
PY
)"
fi fi
printf '| [%s](skills/%s/) | %s | %s | [README](skills/%s/README.md) | %s | %s |\n' \ if [[ $first -eq 0 ]]; then
"$name" "$name" "$desc" "$ver" "$name" "$zip_link" "$mcpb" printf '\n---\n\n'
fi
first=0
python3 -c 'import sys, urllib.parse
name, ver, desc, repo, link = sys.argv[1:]
def md(s):
out = []
trans = {"\\": "\\\\", "*": "\\*", "_": "\\_", "`": "\\`", "[": "\\["}
for ch in s:
out.append(trans.get(ch, ch))
return "".join(out)
lead, note = desc.strip(), ""
cut = lead.find(" Verwenden")
if cut > 0:
note = lead[cut + 1:].strip()
lead = lead[:cut].strip()
if lead[:1].islower():
lead = lead[0].upper() + lead[1:]
tag = urllib.parse.quote(f"{name}/v{ver}", safe="")
base = f"{repo}/releases/download/{tag}"
parts = [
f"[Doku](skills/{name}/README.md)",
f"[Skill-ZIP]({base}/{name}-v{ver}.zip \"{name}-v{ver}.zip\")",
]
if link:
parts.append(f"[Erweiterung]({base}/{name}-v{ver}.mcpb \"{name}-v{ver}.mcpb\")")
parts.append(f"[Cursor-Plugin]({base}/{name}-cursor-v{ver}.zip \"{name}-cursor-v{ver}.zip\")")
parts.append(f"[Add to Cursor]({link})")
lines = [f"### [{name}](skills/{name}/) · `v{ver}`", "", "> " + md(lead), ""]
if note:
lines += ["*" + md(note) + "*", ""]
lines.append(" · ".join(parts))
sys.stdout.write("\n".join(lines))
' "$name" "$ver" "$desc" "$REPO_WEB" "$deeplink"
printf '\n'
done < <(skill_names) done < <(skill_names)
} > "$table" } > "$table"
@@ -51,7 +108,6 @@ if [[ $check -eq 1 ]]; then
fi fi
echo "README.md ist aktuell." echo "README.md ist aktuell."
else else
# Explizit UTF-8 schreiben (Locale kann sonst die README verfaelschen).
python3 -c 'import sys; open(sys.argv[1],"w",encoding="utf-8",newline="\n").write(sys.stdin.read())' "$readme" <<< "$new" python3 -c 'import sys; open(sys.argv[1],"w",encoding="utf-8",newline="\n").write(sys.stdin.read())' "$readme" <<< "$new"
echo "README.md aktualisiert." echo "README.md aktualisiert."
fi fi
+7
View File
@@ -0,0 +1,7 @@
# Changelog – cadcraft-mcp
## 0.1.0 (2026-10-26)
- Erste Version: Skill und Claude-Desktop-Erweiterung für CADCraft 0.13.0 (`C:\Program Files\CADCraft\cadcraft-cli.exe`, nicht auf PATH).
- MCP kopflos mit `mcp`. `--connect HOST:PORT` optional, mit `--lazy` und `--launch`. Keine Ordner-Flags in der Hilfe.
- `new_drawing` ist ohne `metric` imperial. Laser-DXF bleibt bei VectorCraft, Volumenkörper bei SolidCraft.
+64
View File
@@ -0,0 +1,64 @@
# cadcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Öffnet, zeichnet und exportiert DXF/DWG über den MCP-Server von CADCraft. CLI 0.13.0. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **CADCraft 0.13.0** (`C:\Program Files\CADCraft\cadcraft-cli.exe`, nicht auf PATH). Publisher Learning Machines LLC. Ob die App über den ArtCraft-Launcher oder einen eigenen Installer kommt, steht so nicht in der Registry.
- Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `cadcraft-mcp-v0.1.0.mcpb` und `cadcraft-mcp-v0.1.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/cadcraft-mcp%2Fv0.1.0/cadcraft-mcp-v0.1.0.mcpb) laden.
2. Die `.mcpb` doppelklicken. CADCraft fragt nicht nach Ordnern.
3. Unter Einstellungen → Erweiterungen prüfen, dass **CADCraft for Claude** eingeschaltet ist.
4. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
5. Claude komplett beenden und neu starten. **Neuen** Chat öffnen.
## Ordner und Start
`cadcraft-cli mcp` ist kopflos. `mcp --connect HOST:PORT` (optional `--lazy`, `--launch`) hängt an eine laufende App. Die Hilfe nennt keine Lese-/Schreib-Ordner.
## Test
Neuen Chat öffnen und fragen, ob die CADCraft-Werkzeuge da sind. Präfix `…CADCraft_for_Claude…`. Ein metrisches `new_drawing` und ein `render` reichen als Probe.
## Stolpersteine
- Ein neues Dokument ohne `metric: true` ist imperial.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
Statt der Erweiterung in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"cadcraft": {
"command": "C:\\Program Files\\CADCraft\\cadcraft-cli.exe",
"args": ["mcp"]
}
}
}
```
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+70
View File
@@ -0,0 +1,70 @@
---
name: cadcraft-mcp
description: "2D/3D-Zeichnungen (DXF, DWG) mit dem CADCraft-MCP-Server öffnen, zeichnen, abfragen und als DXF, DWG, SVG, PNG oder PDF ausgeben. Verwenden, wenn CADCraft-Werkzeuge verbunden sind oder der Nutzer CADCraft nennt; typisch für Grundrisse, Laschen in 2D, DXF/DWG von der Konstruktion. Nicht für parametrische Volumenkörper (SolidCraft) und nicht für Laser-DXF aus Illustrationen (VectorCraft)."
---
# Zeichnungen mit CADCraft (MCP)
CADCraft ist ein 2D/3D-CAD im AutoCAD-Stil (Rust). CLI 0.13.0. Koordinaten sind Zeichnungseinheiten, y nach oben. Der Server nennt sich selbst 2D/3D; welche 3D-Befehle es gibt, steht in `list_commands`, nicht hier.
## Voraussetzung
Die Werkzeuge `command_line`, `execute`, `list_commands`, `inspect_drawing`, `render` … müssen verbunden sein. Fehlen sie, dem Nutzer sagen, dass der Server nicht verbunden ist (Einrichtung siehe README).
`cadcraft-cli mcp` ist der kopflose Server auf stdin/stdout. `mcp --connect HOST:PORT` hängt an eine laufende App; `--lazy` und `--launch` sind zusätzliche Flags dieser Verbindung (nicht einzeln geprüft). Die Hilfe nennt keine Lese-/Schreib-Ordner.
## Werkzeuge
| Tool | Zweck |
|---|---|
| `command_line {text}` | eine Zeile wie an der AutoCAD-Eingabe (`line 0,0 10,0 10,5 c`, `circle 5,2.5 1`). Leerzeichen wirkt als Enter |
| `script {text}` | mehrzeiliges Skript, Leerzeile = Enter |
| `execute {command, params}` | ein Befehl ohne Dialog. IDs nur aus `list_commands` |
| `list_commands {filter}` | IDs, Aliase, Parameter. Immer mit Filter |
| `inspect_drawing` | Zählungen, Grenzen, Layer, Blöcke, Layouts |
| `query_entities` | nach Typ, Layer, Auswahl oder Fenster |
| `find_text` | TEXT, MTEXT, Attribute, Führungslinien |
| `render` | PNG, standardmäßig auf die Grenzen angepasst, oder `window` |
| `new_drawing {metric?}` | neu. Ohne `metric` imperial |
| `open {path}` / `save {path}` | DXF und DWG. Endung `.svg`, `.png` oder `.pdf` exportiert, die Zeichnung bleibt offen |
| `cancel` | Escape |
## Arbeitsweise
1. **Maßsystem zuerst.** Für Millimeter `new_drawing {metric: true}` oder in der CLI `run --metric`. Ein leeres `new_drawing` ist imperial.
2. **Befehle nie raten.** `list_commands {filter}` oder die AutoCAD-Zeile, wenn der Alias bekannt ist (`L`, `C`, `PLINE`, `RECTANG`, `OFFSET`, `ZOOM`).
3. **Prüfen:** `inspect_drawing`, bei Text `find_text`, Bild mit `render`.
4. **Speichern** unter neuem Namen. DXF/DWG über die Endung. Für ein Bild `--window` bzw. `render.window` setzen, sonst wird die ganze Zeichnung eingepasst.
Die CLI kann dasselbe ohne MCP: `info`, `convert` nach DXF/DWG/SVG/PNG/PDF, `run` mit `--cmd` (Wert `{last}` ist der letzte Handle), `sample bracket` oder `sample floorplan`, `commands FILTER`.
## Fallen
- **Imperial ist der Standard** von `new_drawing`. Eine Lasche in mm ohne `metric: true` wird in Zoll interpretiert.
- **y zeigt nach oben**, anders als in FigCraft und VectorCraft.
- **`save` auf `.png`/`.svg`/`.pdf` exportiert** und lässt die Zeichnung unbenannt, wenn sie neu ist. Danach zusätzlich als DXF speichern, wenn die Zeichnung bleiben soll.
- **`{last}`** gibt es in der CLI-Kette `--cmd`, nicht als belegtes Feld von `execute`.
## Rezepte
1. **Lasche in mm:** `new_drawing {metric: true}`, Kontur über `command_line` oder `execute`, Bohrungen, `inspect_drawing`, `render`, `save` als `.dxf` und bei Bedarf `.pdf`.
2. **Fremde DWG nur ansehen:** `open`, `inspect_drawing`, `find_text`, `render`. Nichts ändern, solange der Nutzer nur lesen will. Kundenzeichnungen mit NDA-Vermerk nur mit Zustimmung.
## Abschlussprüfung
- `inspect_drawing`: Grenzen und Einheiten zum Auftrag passend.
- `render` angesehen.
- Pfad der gespeicherten Datei genannt, Format (DXF oder DWG) dazu.
## Datenschutz
Ampel:
- Grün: allgemeine und technische Inhalte ohne Kundenbezug.
- Gelb: Projekt- und Geschäftsinfos, nur nach Abwägung oder anonymisiert.
- Rot: personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
## Grenzen
- Kein Ersatz für SolidCraft (Volumenkörper, STEP) und kein Ersatz für VectorCraft (Laser-DXF aus Schriften und Piktogrammen).
- Die Hilfe listet keine Ordnersperre. Nur Dateien öffnen und speichern, die der Nutzer genannt hat.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the CADCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,24 @@
CADCraft
Copyright (c) 2026 ArtCraft Team and the CADCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
Software dependencies are listed in Cargo.lock. One is under a weak-copyleft licence: the acadrust
crate (DWG reading and writing, https://github.com/hakanaktt/acadrust) is licensed under the
Mozilla Public License 2.0 and is used unmodified as a separate library (crates/dwg). Its source
is available from crates.io and the repository above.
None: every bundled asset is original to CADCraft (icons, drafting font, hatch patterns and
linetypes are drawn or defined in code). The per-file list is in ATTRIBUTION.md. Builds made with
the optional craft-fonts input (CRAFT_FONTS_DIR) embed the fonts listed in its ATTRIBUTION.md,
each under the SIL Open Font License 1.1.
CADCraft is an independent project and is not affiliated with, sponsored by or endorsed by
Autodesk, Inc. AutoCAD and DWG are trademarks of Autodesk, Inc.
@@ -0,0 +1,81 @@
{
"manifest_version": "0.3",
"name": "cadcraft-mcp",
"display_name": "CADCraft for Claude",
"version": "0.1.0",
"description": "DXF- und DWG-Zeichnungen öffnen, zeichnen und exportieren. CLI 0.13.0. Benötigt CADCraft unter C:\\Program Files\\CADCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\CADCraft\\cadcraft-cli.exe",
"args": [
"mcp"
]
}
},
"tools": [
{
"name": "command_line",
"description": "One AutoCAD-style command line. Spaces act as Enter."
},
{
"name": "script",
"description": "A multi-line script. A blank line is Enter."
},
{
"name": "execute",
"description": "Run one command by id with JSON params. No dialogs."
},
{
"name": "list_commands",
"description": "Command ids, aliases and parameter docs. Filter with filter."
},
{
"name": "inspect_drawing",
"description": "Counts, extents, layers, styles, blocks, layouts and undo."
},
{
"name": "query_entities",
"description": "Entities by type, layer, selection or window."
},
{
"name": "find_text",
"description": "TEXT, MTEXT, attributes and multileaders."
},
{
"name": "render",
"description": "PNG of the drawing, fitted to the extents or to window."
},
{
"name": "new_drawing",
"description": "New drawing. Imperial unless metric is true."
},
{
"name": "open",
"description": "Open a DXF or DWG file."
},
{
"name": "save",
"description": "Save DXF or DWG. A .svg, .png or .pdf path exports instead."
},
{
"name": "cancel",
"description": "Escape: cancel the running command or clear the selection."
}
]
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Erwarteter Pfad: C:\Program Files\CADCraft\cadcraft-cli.exe
Der Installer (ArtCraft-Launcher oder eigener) ist hier nicht geprueft.
@@ -0,0 +1 @@
{"version":"0.13.0","repository":"https://github.com/storytold/cadcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"cadcraft-cli.exe","path":"C:\\Program Files\\CADCraft\\cadcraft-cli.exe","tag":"v0.13.0","sha256":"d8c5c967a860e831fe2af5134c270a1fdcd45b3206183999abf13a90f46df723"}
+7
View File
@@ -0,0 +1,7 @@
# Changelog – effectcraft-mcp
## 0.1.0 (2026-10-26)
- Erste Version: Skill und Claude-Desktop-Erweiterung für EffectCraft 0.17.0 (`C:\Program Files\EffectCraft\effectcraft-cli.exe`, nicht auf PATH).
- Start: `mcp --empty` plus Lese- und Schreib-Ordner (dieser Aufruf kommt hoch). `--autosave` und `--bridge PORT` schließen sich aus. Die Hilfe lehnt Skripte ab, sobald die Ordner-Flags gesetzt sind.
- Projektdatei `.ecproj`. Exportformate der CLI genannt, nicht durch einen Render auf dieser Maschine geprüft.
+64
View File
@@ -0,0 +1,64 @@
# effectcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Baut Motion-Graphics in `.ecproj` über den MCP-Server von EffectCraft und rendert Standbilder oder Filme. CLI 0.17.0. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **EffectCraft 0.17.0** (`C:\Program Files\EffectCraft\effectcraft-cli.exe`, nicht auf PATH). Publisher Learning Machines LLC.
- Claude Desktop **oder** Cursor
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `effectcraft-mcp-v0.1.0.mcpb` und `effectcraft-mcp-v0.1.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/effectcraft-mcp%2Fv0.1.0/effectcraft-mcp-v0.1.0.mcpb) laden.
2. Die `.mcpb` doppelklicken. **Lese-Ordner** `Dokumente`, **Schreib-Ordner** `Dokumente\Claude`.
3. **EffectCraft for Claude** einschalten, Skill-ZIP hochladen, Claude neu starten, neuen Chat öffnen.
## Ordner und Start
Die Erweiterung startet `mcp --empty` mit Lese- und Schreib-Ordner. Dieser Aufruf ist geprüft. `--autosave` und `--bridge PORT` schließen sich aus; die Erweiterung setzt sie nicht. Die Hilfe sagt, mit den Ordner-Flags werden Skripte abgelehnt.
## Test
Neuen Chat öffnen, eine kleine Komposition mit einem Text anlegen und `render_preview` ansehen lassen. Präfix `…EffectCraft_for_Claude…`.
## Stolpersteine
- Speichern scheitert außerhalb des Schreib-Ordners.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
```json
{
"mcpServers": {
"effectcraft": {
"command": "C:\\Program Files\\EffectCraft\\effectcraft-cli.exe",
"args": [
"mcp",
"--empty",
"--automation-read-root", "C:\\Pfad\\zu\\Dokumente",
"--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\Claude"
]
}
}
}
```
Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+78
View File
@@ -0,0 +1,78 @@
---
name: effectcraft-mcp
description: "Motion-Graphics und Compositings (.ecproj) mit dem EffectCraft-MCP-Server aufbauen, keyframen und rendern. Verwenden, wenn EffectCraft-Werkzeuge verbunden sind oder der Nutzer EffectCraft nennt; typisch für Titel, Bauchbinden, einfache Animationen, Standbilder und Filmexporte. Nicht für den Schnitt einer Timeline aus Clips (FilmCraft)."
---
# Compositing mit EffectCraft (MCP)
EffectCraft ist ein Compositor im Stil von After Effects (Rust). CLI 0.17.0. Zeiten sind Sekunden. Projektdatei `.ecproj`.
## Voraussetzung
Die Werkzeuge `list_commands`, `execute_command`, `get_project`, `set_property`, `render_preview` … müssen verbunden sein. Fehlen sie, dem Nutzer sagen, dass der Server nicht verbunden ist (Einrichtung siehe README).
Start, wie die CLI es verlangt:
- Kopflos: `effectcraft-cli mcp`, dazu `--empty`, `--demo` oder `--project F.ecproj`. `--empty` zusammen mit beiden Ordner-Flags ist geprüft (Server kommt hoch).
- `--autosave` oder `--bridge PORT`, nicht beides. `--bridge PORT` hängt an der App. Die globale Option heißt ebenfalls `--bridge PORT`.
- `--automation-read-root` und `--automation-write-root` (je mehrfach). Lesen im Lese- oder Schreib-Ordner, Schreiben nur im Schreib-Ordner. Die Hilfe sagt an dieser Stelle, Skripte werden abgelehnt. `run_script` mit gesetzten Ordnern ist nicht extra probiert.
## Werkzeuge
| Tool | Zweck |
|---|---|
| `list_commands {filter}` / `describe_command` | Befehls-IDs. Nie raten. `command_list` ist derselbe Katalog |
| `execute_command {command, params}` | ein Befehl. `command_run` nimmt stattdessen `{id, params}` |
| `batch {steps}` | mehrere Befehle, ein Undo. `"$1.layer"` meint das Feld `layer` aus Schritt 1 |
| `command_batch` | mehrere Befehle, je ein eigenes Undo |
| `get_project` / `get_comp` / `get_layer` / `get_property` | nachlesen. Pfade wie `transform/position`, `effects/#1/blurriness` |
| `set_property` / `add_keyframe` / `add_effect` | Wert, Keys, Effekt (`Gaussian Blur` oder eine ID aus `list_effects`) |
| `render_frame` / `render_preview` | PNG der Komposition |
| `open_project` / `save_project` | `.ecproj`, `demo` oder `new` |
| `undo` / `redo` / `history` | Verlauf, `history.goto` springt auch auf einen Zweig |
| `run_script {code}` | JavaScript im After-Effects-Objektmodell |
| `list_effects` / `list_fonts` / `get_state` | Kataloge und wo der Abspielkopf steht |
| `doc_inspect` | Projekt plus aktive Komposition |
| `script_ui` | Fenster, die ein Skript geöffnet hat |
## Arbeitsweise
1. **Leer starten oder die genannte `.ecproj` öffnen.** Nicht raten, welches Projekt offen ist: `get_project`.
2. **Komposition, dann Ebenen, dann Keys.** Beispiel aus der Werkzeugbeschreibung: `comp.new`, `layer.newText` oder `layer.newSolid`, `set_property` / `add_keyframe`, `effect.apply`.
3. **`render_preview` nach jedem größeren Schritt.**
4. **Speichern** als `.ecproj` unter neuem Namen. Eine Filmdatei ist ein eigener Schritt.
CLI-Export (`render`), Formate: h264, hevc, av1, prores, webm, png, jpeg, tiff, exr, gif, wav, aiff. Ein Standbild: `render-frame`. Ob jedes Format auf diesem Rechner einen Encoder hat, ist nicht geprüft.
## Fallen
- **Zwei Lauf-Werkzeuge.** `execute_command` will `command`. `command_run` will `id`. Dieselbe ID, anderes Feld.
- **`batch` rollt zurück, `command_batch` nicht als eine Gruppe.** Für einen Titel, der ganz oder gar nicht entstehen soll, `batch`.
- **Zeiten sind Sekunden**, nicht Frames, solange der Befehl nicht `frame` sagt.
- **Schrift:** `list_fonts`, dann `layer.setText`. Eine fehlende Familie nicht raten.
- **Ordner und Skripte.** Die Hilfe lehnt Skripte ab, sobald die Ordner-Flags gesetzt sind. Dann `execute_command` statt `run_script`.
## Rezept
**Titel, 1920×1080, 5 s, 30 fps:** `comp.new`, `layer.newText`, Deckkraft bei 0 s und 1 s per `add_keyframe` auf `transform/opacity`, `render_preview` bei 0 und bei 1, `save_project` unter neuem Namen. Eine MP4 nur, wenn der Nutzer eine Filmdatei will, und nur in den Schreib-Ordner.
## Abschlussprüfung
- `render_preview` zur genannten Zeit angesehen.
- `get_project`: Name, Größe, Dauer passen.
- Pfad der `.ecproj` genannt. Eine exportierte Filmdatei nur, wenn sie wirklich geschrieben wurde.
## Datenschutz
Ampel:
- Grün: allgemeine und technische Inhalte ohne Kundenbezug.
- Gelb: Projekt- und Geschäftsinfos, nur nach Abwägung oder anonymisiert.
- Rot: personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
In Titeln Beispieltext statt echter Kundennamen.
## Grenzen
- Kein Schnittplatz. Clips aneinanderhängen ist FilmCraft.
- Encoder für h264, hevc, av1 und prores sind in der Hilfe genannt, auf dieser Maschine nicht durch einen Export geprüft.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the EffectCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,22 @@
EffectCraft
Copyright (c) 2026 ArtCraft Team and the EffectCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
list (author, source, license) is in ATTRIBUTION.md.
Inter (assets/fonts/Inter-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-Inter.txt.
Noto Serif (assets/fonts/NotoSerif-Regular.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-NotoSerif.txt.
JetBrains Mono (assets/fonts/JetBrainsMono-Regular.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-JetBrainsMono.txt.
The optional PDF document reader uses craft-pdf and Hayro-syntax 0.7.2, MIT OR Apache-2.0.
The shared patched syntax source is centralized in storytold/craft-libs, transferred from
PdfCraft revision 9ed3abe4907a127d36b12fbfeee71d7e26248da1. This parser-only use embeds no
Hayro fonts, CMaps or image codecs; EffectCraft keeps its existing fonts and drawing filters.
@@ -0,0 +1,158 @@
{
"manifest_version": "0.3",
"name": "effectcraft-mcp",
"display_name": "EffectCraft for Claude",
"version": "0.1.0",
"description": "Motion-Graphics in .ecproj aufbauen und rendern. CLI 0.17.0. Benötigt EffectCraft unter C:\\Program Files\\EffectCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\EffectCraft\\effectcraft-cli.exe",
"args": [
"mcp",
"--empty",
"--automation-read-root",
"${user_config.read_root}",
"--automation-write-root",
"${user_config.write_root}"
]
}
},
"tools": [
{
"name": "list_commands",
"description": "Engine commands. Filter with filter. command_list is the same catalog."
},
{
"name": "describe_command",
"description": "One command, including its parameter schema."
},
{
"name": "execute_command",
"description": "Run one command by the command field."
},
{
"name": "command_run",
"description": "Run one command by the id field."
},
{
"name": "batch",
"description": "Several commands as one undo step. $1.layer reads step 1."
},
{
"name": "command_batch",
"description": "Several commands, each its own undo step."
},
{
"name": "get_project",
"description": "Project overview: items, active comp, time, selection."
},
{
"name": "get_comp",
"description": "One composition and its layers."
},
{
"name": "get_layer",
"description": "A layer's property tree. Paths feed set_property."
},
{
"name": "get_property",
"description": "One property: value, keys, expression."
},
{
"name": "set_property",
"description": "Set a value or a key. expression sets an expression."
},
{
"name": "add_keyframe",
"description": "Add keys. interpolation: linear, bezier, hold, easyEase."
},
{
"name": "add_effect",
"description": "Apply an effect and optional parameter values."
},
{
"name": "list_effects",
"description": "Effect registry. Filter by id, name or category."
},
{
"name": "list_fonts",
"description": "Font families available to text layers."
},
{
"name": "get_state",
"description": "Editor state and what this build can do."
},
{
"name": "render_frame",
"description": "PNG of a comp frame."
},
{
"name": "render_preview",
"description": "PNG of a comp frame, for checking the work."
},
{
"name": "open_project",
"description": "Open an .ecproj, the demo, or a new empty project."
},
{
"name": "save_project",
"description": "Save the .ecproj, or Save As when path is set."
},
{
"name": "undo",
"description": "Undo the last edits."
},
{
"name": "redo",
"description": "Redo undone edits."
},
{
"name": "history",
"description": "Branching undo history. goto jumps to a state."
},
{
"name": "run_script",
"description": "After-Effects-style JavaScript. Refused when folder roots are set (CLI help)."
},
{
"name": "script_ui",
"description": "Drive ScriptUI windows a script opened."
},
{
"name": "doc_inspect",
"description": "Project overview and the active composition."
}
],
"user_config": {
"read_root": {
"type": "directory",
"title": "Lese-Ordner",
"description": "Hier darf der Agent Dateien lesen. Weit fassen (z. B. Dokumente).",
"required": true,
"default": "${HOME}/Documents"
},
"write_root": {
"type": "directory",
"title": "Schreib-Ordner",
"description": "Nur hier darf der Agent speichern. Eng fassen, z. B. Dokumente\\Claude.",
"required": true,
"default": "${HOME}/Documents/Claude"
}
}
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Erwarteter Pfad: C:\Program Files\EffectCraft\effectcraft-cli.exe
Der Installer (ArtCraft-Launcher oder eigener) ist hier nicht geprueft.
@@ -0,0 +1 @@
{"version":"0.17.0","repository":"https://github.com/storytold/effectcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"effectcraft-cli.exe","path":"C:\\Program Files\\EffectCraft\\effectcraft-cli.exe","tag":"v0.17.0","sha256":"c7fde6fda4d6fd133d1db7a7a03a402a57d758fa8780c4949c058bf07a7d8702"}
+13
View File
@@ -0,0 +1,13 @@
# Changelog – figcraft-mcp
## 0.2.0 (2026-10-26)
- CLI 0.11.2. PDF-Export mit Beschnitt, Schnittmarken und CMYK (`file.export`). CLI `convert` und `plugin publish`.
- `mcp --attach PORT` hängt an der App und lehnt die Ordner-Flags ab. Mit Ordnern bleibt der Server kopflos.
## 0.1.0 (2026-10-19)
- Erste Version: Skill und Claude-Desktop-Erweiterung für FigCraft 0.7.0 aus dem ArtCraft-Launcher (`C:\Program Files\FigCraft\figcraft-cli.exe`, nicht auf PATH).
- Kein `--attach`: mit Lese- und Schreib-Ordner ist die Anbindung an eine laufende App nicht erlaubt. Der Server läuft ohne Fenster.
- Standardordner wie bei WordCraft (Lese = Dokumente, Schreib = Dokumente\Claude). Bei FigCraft ist die Lage des Schreib-Ordners im Lese-Ordner nicht zwingend; der Standard bleibt derselbe.
- Cursor-Plugin `figcraft-mcp-cursor-v0.1.0.zip` (Server `figcraft`) inkl. Deeplink.
+83
View File
@@ -0,0 +1,83 @@
# figcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Entwirft Bedienoberflächen (HMI-Masken, App-Screens) über den MCP-Server von FigCraft und exportiert sie als PNG, PDF oder SVG, PDF auch mit Beschnitt und CMYK. Frühe Alpha, CLI 0.11.2. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **FigCraft** über den ArtCraft-Launcher (`C:\Program Files\FigCraft\figcraft-cli.exe`, im MSI enthalten, nicht auf PATH). FigCraft steht im Launcher seit Version 0.4.1; ältere Kataloge mit zwölf Apps führen es nicht. Fehlt die Kachel, den Launcher aktualisieren.
- Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `figcraft-mcp-v0.2.0.mcpb` und `figcraft-mcp-v0.2.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/figcraft-mcp%2Fv0.2.0/figcraft-mcp-v0.2.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren).
3. **Lese-Ordner:** `Dokumente`. **Schreib-Ordner:** `Dokumente\Claude`. Bei FigCraft ist es unerheblich, ob der Schreib-Ordner im Lese-Ordner liegt; der Standard bleibt derselbe wie bei PdfCraft und VectorCraft.
4. Unter Einstellungen → Erweiterungen prüfen, dass **FigCraft for Claude** eingeschaltet ist.
5. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
6. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
**Umsteigen von der manuellen Config:** Eintrag `figcraft` unter `mcpServers` vor der Installation entfernen.
## Ordner und Start
Der Server der Erweiterung bekommt Lese- und Schreib-Ordner und läuft ohne Fenster. `mcp --attach PORT` gibt es und hängt an `figcraft --control PORT`, lehnt die Ordner-Flags aber ab. Die Erweiterung setzt `--attach` deshalb nicht.
## Freigaben
In Claude bei `open_file`, `save_file` und `export` auf **„Immer fragen“** lassen, wenn du Pfade mitkontrollieren willst.
## Enthaltene Software
Die Erweiterung steuert [FigCraft](https://github.com/storytold/figcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. Das Icon ist `assets/app-icon/figcraft-512.png` (MIT oder Apache-2.0).
## Test
Neuen Chat öffnen und eine kleine HMI-Maske als PNG in den Schreib-Ordner exportieren lassen. Präfix `…FigCraft_for_Claude…`.
Fehlen die Tools: Erweiterung eingeschaltet? CLI unter `C:\Program Files\FigCraft\figcraft-cli.exe`? Neu starten, neuer Chat.
## Stolpersteine
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
- FigCraft ist eine frühe Alpha. Der Entwurf ist eine Vorlage, keine importierbare Maske für die Steuerung.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
Statt der Erweiterung in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"figcraft": {
"command": "C:\\Program Files\\FigCraft\\figcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root", "C:\\Pfad\\zu\\Dokumente",
"--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\Claude"
]
}
}
}
```
`--attach` nicht zusammen mit den Ordner-Flags setzen; die CLI lehnt das ab.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+79
View File
@@ -0,0 +1,79 @@
---
name: figcraft-mcp
description: Bedienoberflächen und Screens über den FigCraft-MCP-Server entwerfen, bearbeiten, ansehen und als PNG, PDF, SVG oder .fig exportieren (Figma-Klon, frühe Alpha). Verwenden, wenn FigCraft-Werkzeuge verbunden sind oder der Nutzer FigCraft nennt; typisch für HMI-Masken von Maschinensteuerungen, App-/Web-Entwürfe, Klick-Prototypen und Komponenten.
---
# Oberflächen mit FigCraft (MCP)
FigCraft ist ein Open-Source-Designwerkzeug (Rust), das Figma-Parität anstrebt. Es ist noch eine frühe Alpha. CLI 0.11.2. Die Export-Falle (ohne `ids`) ist am 0.7.0 bestätigt und an 0.11.2 nicht erneut durchgespielt.
## Voraussetzung
Die Werkzeuge `create_node`, `set_properties`, `batch`, `screenshot`, `export` … müssen verbunden sein. Ihr Präfix hängt vom Client und vom Namen der Erweiterung bzw. des Servers ab (z. B. `mcp__…__FigCraft_for_Claude__create_node`). 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).
Der Server mit Lese- und Schreib-Ordner arbeitet ohne Fenster. `mcp --attach PORT` hängt an einer laufenden App (`figcraft --control PORT`) und lehnt die Ordner-Flags ab. Lesen darf er im Lese- und Schreib-Ordner, schreiben nur im Schreib-Ordner.
## Werkzeuge
| Tool | Zweck |
|---|---|
| `create_node` | Ebene anlegen: frame, rectangle, ellipse, polygon, star, line, arrow, text, vector, section, component |
| `set_properties` | Eigenschaften setzen (`ids`, `props`) |
| `batch` | mehrere Befehle als **ein** Undo-Schritt; `{"$step": n}` verweist auf die id aus Schritt n |
| `inspect_document` / `get_node` | Ebenenbaum als JSON |
| `screenshot` | Seite oder Ebenen als PNG ansehen |
| `export` | png, jpg, svg, webp, pdf, fig |
| `open_file` / `save_file` | .figcraft, .fig (best effort), .svg, Bilder |
| `list_commands` / `run_command` | alle Menübefehle |
| `undo` / `redo`, `select` | Verlauf, Auswahl |
## Arbeitsweise
1. **Befehle nie raten:** `list_commands {filter: "…"}` (z. B. `component`, `instance`, `align`, `prototype`).
2. **Ganze Screens in einem `batch`** aufbauen: Rahmen → Bereiche → Texte, Verweise per `{"$step": n}`.
3. **Auto-Layout statt Koordinaten:** Rahmen mit `layout: "vertical"|"horizontal"`, `gap`, `padding`, `mainAlign`/`crossAlign`. Kinder darin bekommen kein x/y.
4. **Ansehen:** nach jedem größeren Schritt `screenshot {maxSize: 1024}`.
5. **Speichern** als `.figcraft` unter neuem Namen im Schreib-Ordner, exportieren für die Weitergabe.
## Fallen (im Test bestätigt)
- **`export` ohne `ids` exportiert die Auswahl**, also meist die zuletzt angelegte Ebene: Es kam ein PNG mit nur einer Textzeile heraus. Immer `ids: [<id des Hauptrahmens>]` angeben. Die id steht in `inspect_document` unter `pages[0].children`.
- **`run_command` erwartet `{command, params}`**, nicht `{id, …}` (anders als bei PdfCraft). Ebenso `batch {commands: [{command, params}]}`.
- **x/y sind relativ zum Elternrahmen**, y zeigt nach unten, Einheit px.
- **`save_file` ohne `path` überschreibt** die geöffnete Datei. Für Varianten immer einen neuen `path` angeben.
- **Schriftschnitt:** `fontStyle: "Bold"` funktioniert. Gibt es den Schnitt nicht, nimmt FigCraft den nächstliegenden und meldet das in `warnings`.
- **Transparenter Rahmen:** `fill: "#00000000"`.
- **.fig-Import/-Export** ist „best effort“: Figma öffnet nicht jede Datei. Für die Weitergabe PNG/PDF/SVG bevorzugen.
## Rezepte
1. **HMI-Maske** (z. B. 1024×600 für ein 7"-Panel):
1. Rahmen in Panelgröße mit dunklem Hintergrund anlegen.
2. Kopfleiste mit Anlagenname und Uhrzeit.
3. Statuskarte (vertikales Auto-Layout, Messwerte mit Einheit).
4. Tastenzeile (horizontales Auto-Layout; Start grün, Stop rot, Quittieren gelb, mindestens 80 px hoch für Handschuhe).
5. Meldungsliste (Zeit, Code, Text; Warnung gelb, Info grau).
Farben nach der gängigen Bedeutung: Rot für Halt/Störung, Gelb für Warnung, Grün für Betrieb.
2. **Komponenten:** Taste fertig gestalten → `run_command {command: "component.create", params: {ids: [id]}}` → Kopien über `instance.create {component, x, y, parent}`.
3. **Weitergabe:** `export` bzw. `file.export` mit `ids` des Hauptrahmens. PDF-Druck (CLI und `file.export`, 0.11.2): `bleed` (`"3mm"`, `"0.125in"`, `"9pt"` oder Punkt), `cropMarks`, `bleedMarks`, `cmyk`. `format: "png", scale: 2` für Präsentationen, `svg` für Web. Die CLI hat zusätzlich `convert <in> <out>` und `plugin publish`.
## Abschlussprüfung
- `screenshot` der ganzen Seite angesehen: Texte lesbar, nichts abgeschnitten, Abstände einheitlich.
- Export-Datei geprüft (Größe plausibel, bei PNG kurz ansehen).
- `.figcraft` gespeichert, Pfad dem Nutzer genannt.
## Datenschutz
Ampel:
- 🟢 Allgemeine und technische Inhalte ohne Kundenbezug.
- 🟡 Projekt- und Geschäftsinfos: nur nach Abwägung oder anonymisiert.
- 🔴 Personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
In Entwürfen Beispieldaten statt echter Kundennamen und Anlagennummern verwenden. Kundenlogos nur einsetzen, wenn der Nutzer sie liefert.
## Grenzen
- Frühe Alpha: Für die echte Steuerung (TIA Portal/WinCC usw.) ist der Entwurf nur eine Vorlage, keine importierbare Maske.
- Zusammenarbeit (Multiplayer) und Prototyp-Funktionen sind Vorschau; im headless Server nicht nutzen.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the FigCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,53 @@
FigCraft
Copyright (c) 2026 ArtCraft Team and the FigCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles no third-party fonts, icons or images in the repository: every icon is
drawn in code and original to FigCraft. The per-file list (author, source, license) of any bundled
asset is in ATTRIBUTION.md.
Release builds made with the optional craft-fonts build input (CRAFT_FONTS_DIR) embed the fonts
listed in ATTRIBUTION.md (Inter and others, SIL Open Font License 1.1); each package carries their
licence texts.
Rust crate dependencies keep their own licenses (MIT, Apache-2.0, BSD, ISC, Zlib, OFL for egui's
default fonts, CDLA-Permissive-2.0 for the root certificate list webpki-roots compiles in, and
similar permissive licenses); see each crate's metadata.
Linux Wayland window decorations
-------------------------------
sctk-adwaita 0.10.1 (https://github.com/PolyMeilex/sctk-adwaita,
commit d5f343c45c04d4a026db57f76760819b7325db00) is used by winit on Linux
for vector window controls. Its title-font features are disabled: no Cantarell
font is embedded by this dependency and no font file is added to this repo.
sctk-adwaita's MIT licence:
MIT License
Copyright (c) 2022 Bartłomiej Maryńczak
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

+126
View File
@@ -0,0 +1,126 @@
{
"manifest_version": "0.3",
"name": "figcraft-mcp",
"display_name": "FigCraft for Claude",
"version": "0.2.0",
"description": "Bedienoberflächen und Screens (z. B. HMI-Masken) entwerfen und als PNG/PDF/SVG exportieren, PDF mit Beschnitt und CMYK. CLI 0.11.2. Benötigt FigCraft aus dem ArtCraft-Launcher unter C:\\Program Files\\FigCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"icon": "icon.png",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\FigCraft\\figcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root",
"${user_config.read_root}",
"--automation-write-root",
"${user_config.write_root}"
]
}
},
"tools": [
{
"name": "list_commands",
"description": "List FigCraft commands: id, label, menu path, shortcut, whether it is undoable, and a parameter description."
},
{
"name": "run_command",
"description": "Execute one FigCraft command by id with JSON params (ids and params from list_commands)."
},
{
"name": "batch",
"description": "Run several commands in order as ONE undo step (engine `command.batch`)."
},
{
"name": "create_node",
"description": "Create a layer (engine `node.create`) and return its id and inspected properties."
},
{
"name": "set_properties",
"description": "Set properties on one or more layers as one undo step (engine `node.set`)."
},
{
"name": "inspect_document",
"description": "The active document as JSON: name, path, dirty flag, current page, selection, the current page's layer tree (id, name, type, x/y relative to the parent frame (groups don't count), width, height, absoluteBounds in page co"
},
{
"name": "get_node",
"description": "One layer as JSON (same fields as inspect_document) with its children to `depth`."
},
{
"name": "select",
"description": "Replace the selection with `ids` (switching to their page)."
},
{
"name": "export",
"description": "Export layers (default: the selection, else every top-level layer of the current page) as png, jpg, svg, webp or pdf at `scale`, or the whole file as `fig` (experimental: written from public format knowledge, with `warni"
},
{
"name": "screenshot",
"description": "Look at the design: renders the given layers (or the whole current page, with its background) to PNG and returns it as image content, plus its size and the scale used."
},
{
"name": "open_file",
"description": "Open a .figcraft or .json document (FigCraft or REST API file JSON), a .fig file (best effort, with `warnings` for what wasn't imported), an .svg (becomes vectors) or an image (becomes an image layer) as the active docum"
},
{
"name": "save_file",
"description": "Save the active document as a .figcraft file."
},
{
"name": "undo",
"description": "Undo the last change (one command, batch or gesture)."
},
{
"name": "redo",
"description": "Redo the last undone change."
},
{
"name": "pointer",
"description": "Drive the canvas with the mouse in page coordinates, exactly as a user would with the current tool: click to select, drag to move/resize/marquee, or draw with a shape tool (set `tool` first, e.g."
},
{
"name": "key",
"description": "Press a key or shortcut as if typed on the canvas: a menu shortcut (e.g."
},
{
"name": "type_text",
"description": "Type into a text layer."
},
{
"name": "inspect_ui",
"description": "UI state: current tool, view (zoom, centre), status, panels, timings and the app's windows (`windows`: id, title, files) when attached to the app; headless reports the session status."
}
],
"user_config": {
"read_root": {
"type": "directory",
"title": "Lese-Ordner",
"description": "Hier darf Claude Dateien lesen. Ruhig weit fassen (z. B. Dokumente); der Schreib-Ordner sollte darin liegen, damit Ergebnisse wieder geöffnet werden können.",
"required": true,
"default": "${HOME}/Documents"
},
"write_root": {
"type": "directory",
"title": "Schreib-Ordner",
"description": "Nur hier darf Claude speichern. Eng fassen, eigener Ordner, z. B. Dokumente\\Claude.",
"required": true,
"default": "${HOME}/Documents/Claude"
}
}
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Installiere FigCraft ueber den ArtCraft-Launcher.
Erwarteter Pfad: C:\Program Files\FigCraft\figcraft-cli.exe
@@ -0,0 +1 @@
{"version":"0.11.2","repository":"https://github.com/storytold/figcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"figcraft-cli.exe","path":"C:\\Program Files\\FigCraft\\figcraft-cli.exe","tag":"v0.11.2","sha256":"ba212a8c476f38640d9b5d3742ce3c7cb4177a420f23958b538d6ae0b8f039e6"}
+7
View File
@@ -0,0 +1,7 @@
# Changelog – filmcraft-mcp
## 0.1.0 (2026-10-26)
- Erste Version: Skill und Claude-Desktop-Erweiterung für FilmCraft 0.13.0 (`C:\Program Files\FilmCraft\filmcraft-cli.exe`, nicht auf PATH).
- `mcp` kopflos. `--bridge 127.0.0.1:PORT` steht vor dem Unterbefehl und spricht `filmcraft --control PORT` an. Keine Ordner-Flags in der Hilfe.
- Zeitbasis 254016000000 Ticks pro Sekunde. `command_run` nimmt `id`. Die `ui_*`-Werkzeuge nur an der App.
+59
View File
@@ -0,0 +1,59 @@
# filmcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Schneidet `.fcproj`-Projekte über den MCP-Server von FilmCraft und exportiert die Sequenz. CLI 0.13.0. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **FilmCraft 0.13.0** (`C:\Program Files\FilmCraft\filmcraft-cli.exe`, nicht auf PATH). Publisher Learning Machines LLC.
- Claude Desktop **oder** Cursor
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `filmcraft-mcp-v0.1.0.mcpb` und `filmcraft-mcp-v0.1.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/filmcraft-mcp%2Fv0.1.0/filmcraft-mcp-v0.1.0.mcpb) laden.
2. Die `.mcpb` doppelklicken. FilmCraft fragt nicht nach Ordnern.
3. **FilmCraft for Claude** einschalten, Skill-ZIP hochladen, Claude neu starten, neuen Chat öffnen.
## Ordner und Start
`filmcraft-cli mcp` ist kopflos und hat keine Ordner-Flags. An die App: `filmcraft-cli --bridge 127.0.0.1:PORT mcp`, die App mit `filmcraft --control PORT`. Die Erweiterung setzt `--bridge` nicht.
## Test
Neuen Chat öffnen und fragen, ob die FilmCraft-Werkzeuge da sind. Präfix `…FilmCraft_for_Claude…`. Ohne genanntes Projekt nichts importieren.
## Stolpersteine
- Es gibt keine Ordnersperre. In Claude bei Import und Export auf **„Immer fragen“** lassen.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
```json
{
"mcpServers": {
"filmcraft": {
"command": "C:\\Program Files\\FilmCraft\\filmcraft-cli.exe",
"args": ["mcp"]
}
}
}
```
Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+66
View File
@@ -0,0 +1,66 @@
---
name: filmcraft-mcp
description: "Schnitte (.fcproj) mit dem FilmCraft-MCP-Server importieren, schneiden und exportieren. Verwenden, wenn FilmCraft-Werkzeuge verbunden sind oder der Nutzer FilmCraft nennt; typisch für Rohschnitt, Titel auf der Timeline, Export nach h264, ProRes, DNxHR oder als Bildsequenz. Nicht für Compositing und Keyframes (EffectCraft)."
---
# Schnitt mit FilmCraft (MCP)
FilmCraft ist ein Schnittprogramm (Rust), angelegt an Premiere Pro. CLI 0.13.0. Projektdatei `.fcproj`. Die Zeitbasis ist 254016000000 Ticks pro Sekunde. Die meisten Befehle nehmen auch `seconds`, `frame` oder `timecode`.
## Voraussetzung
Die Werkzeuge `command_list`, `command_run`, `doc_inspect`, `media_import`, `render_preview` … müssen verbunden sein. Fehlen sie, dem Nutzer sagen, dass der Server nicht verbunden ist (Einrichtung siehe README).
`filmcraft-cli mcp` ist kopflos. Die App steuert `--bridge 127.0.0.1:PORT` vor dem Unterbefehl (`filmcraft --control PORT`). Die `ui_*`-Werkzeuge gelten nur an der laufenden App. Die Hilfe nennt keine Lese-/Schreib-Ordner. `--project`, `--demo`, `--save` und `--save-as` sind globale Optionen.
## Werkzeuge
| Tool | Zweck |
|---|---|
| `command_list {filter}` | IDs, Menü, Parameter. Immer mit Filter |
| `command_run {id, params}` | ein Befehl. Feld heißt `id`, nicht `command` |
| `command_batch {steps}` | mehrere Befehle, Stopp beim ersten Fehler |
| `doc_inspect` | Projektbaum und aktive Sequenz |
| `project_inspect` / `sequence_inspect` | nur der Baum, nur die Sequenz |
| `media_import {paths}` | Medien per absolutem Pfad. `image_sequence` für nummerierte Bilder |
| `render_frame` / `render_preview` | PNG der aktiven Sequenz |
| `ui_elements`, `ui_click`, `ui_drag`, `ui_key`, `ui_type`, `ui_screenshot`, `ui_inspect`, `ui_control` | nur mit `--bridge` |
## Arbeitsweise
1. **Projekt nennen.** Kopflos ohne `--project` ist kein Kundenprojekt offen. `doc_inspect`, bevor etwas geschnitten wird.
2. **Befehle nie raten.** `command_list {filter: "razor"}` und dann `command_run`. Die CLI-Hilfe nennt als Beispiele `timeline.razor`, `sequence.addEdit`, `timeline.trim`, `effects.apply`, `file.import`, `file.newBin`. Ob jede dieser IDs in 0.13.0 noch so heißt, vor dem Aufruf mit `command_list` prüfen, nicht aus dieser Liste abschreiben.
3. **Ansehen:** `render_preview {seconds}`.
4. **Export** über den Befehl, den `command_list` für den Export nennt, oder die CLI `export`. Formate der CLI: h264, hevc, prores, dnxhr, apv, mjpeg, mxf-op1a, mxf-opatom, png, tiff, bmp, gif, wav, aiff, aac. Offline-Medien machen den Export zum Fehler, solange `--allow-offline` fehlt.
## Fallen
- **`command_run` nimmt `id`.** `{command: "…"}` ist das falsche Feld.
- **Ticks sind nicht Sekunden.** Für eine Zeitangabe `seconds` bevorzugen, wenn der Befehl das Feld hat. 254016000000 Ticks = 1 s.
- **`ui_*` ohne App tut nichts Nützliches.** Kopflos `command_run` und `render_preview`.
- **Fehlende Medien.** Die CLI warnt und endet mit Code 1, wenn ein Export Platzhalter zeichnet. Dem Nutzer die fehlende Datei nennen, nicht mit `--allow-offline` still weitermachen, solange er das nicht verlangt.
## Rezept
**Rohschnitt:** Projekt öffnen (`--project` oder der Import-Befehl aus `command_list`), `media_import` mit den Pfaden vom Nutzer, Clips in die Sequenz nur mit IDs aus `sequence_inspect`, an der Stelle schneiden, die `command_list` hergibt, `render_preview` an zwei Zeitpunkten, speichern unter neuem Namen (`.fcproj`). Eine Exportdatei nur auf Wunsch und nie über das Original.
## Abschlussprüfung
- `sequence_inspect`: die genannten Clips liegen in der richtigen Reihenfolge.
- Zwei Frames mit `render_preview` angesehen.
- Pfad von Projekt und, falls exportiert, der Mediendatei genannt.
## Datenschutz
Ampel:
- Grün: allgemeine und technische Inhalte ohne Kundenbezug.
- Gelb: Projekt- und Geschäftsinfos, nur nach Abwägung oder anonymisiert.
- Rot: personenbezogene Daten, Aufnahmen von Personen und NDA-Inhalte gehören nicht in die Cloud-KI.
`render_preview` schickt ein Bild ans Modell. Bei rot markiertem Material nicht rendern, sondern nur schneiden, wenn der Nutzer die Zeiten vorgibt, oder ihn selbst sichten lassen.
## Grenzen
- Kein Compositor. Titel mit Keyframes und Effekten auf Ebenen sind EffectCraft; ein Effekt auf einem Clip nur, wenn `command_list` ihn in FilmCraft führt.
- Encoder sind in der Hilfe genannt, auf dieser Maschine nicht durch einen Export geprüft.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the FilmCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,21 @@
FilmCraft
Copyright (c) 2026 ArtCraft Team and the FilmCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
list (author, source, license) is in ATTRIBUTION.md.
Inter font (assets/fonts/Inter-*.ttf) — OFL-1.1. See assets/fonts/OFL-Inter.txt.
Noto Serif font (assets/fonts/NotoSerif-Regular.ttf) — OFL-1.1. See assets/fonts/OFL-NotoSerif.txt.
JetBrains Mono font (assets/fonts/JetBrainsMono-Regular.ttf) — OFL-1.1. See assets/fonts/OFL-JetBrainsMono.txt.
Builds made with craft-fonts (CRAFT_FONTS_DIR; all official releases) also embed the fonts listed in
https://github.com/storytold/craft-fonts/blob/main/ATTRIBUTION.md (BIZ UDPGothic, Shippori Mincho,
BIZ UDMincho, Noto Sans CJK SC, Noto Sans Arabic, Noto Sans Thai, Noto Sans Georgian) — OFL-1.1. Their licence texts ship with the packages as OFL-<family>.txt.
Public-domain film and NASA frames and CC0 music shown in README screenshots (docs/images/) — public domain / CC0-1.0. See ATTRIBUTION.md.
@@ -0,0 +1,101 @@
{
"manifest_version": "0.3",
"name": "filmcraft-mcp",
"display_name": "FilmCraft for Claude",
"version": "0.1.0",
"description": "Schnitte in .fcproj importieren, schneiden und exportieren. CLI 0.13.0. Benötigt FilmCraft unter C:\\Program Files\\FilmCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\FilmCraft\\filmcraft-cli.exe",
"args": [
"mcp"
]
}
},
"tools": [
{
"name": "command_list",
"description": "Command ids, labels and parameter docs. Filter with filter."
},
{
"name": "command_run",
"description": "Run one command by id with params."
},
{
"name": "command_batch",
"description": "Run several commands. Stops at the first error by default."
},
{
"name": "doc_inspect",
"description": "Project tree plus the active sequence."
},
{
"name": "project_inspect",
"description": "Bins and items."
},
{
"name": "sequence_inspect",
"description": "Active sequence: tracks, clips, markers, playhead. 254016000000 ticks = 1 second."
},
{
"name": "media_import",
"description": "Import media by absolute path."
},
{
"name": "render_frame",
"description": "PNG of a sequence frame."
},
{
"name": "render_preview",
"description": "PNG of a sequence frame. Bridge mode: Program monitor."
},
{
"name": "ui_elements",
"description": "Live app only: clickable element ids."
},
{
"name": "ui_click",
"description": "Live app only: click an element or a point."
},
{
"name": "ui_drag",
"description": "Live app only: drag from one point or element to another."
},
{
"name": "ui_key",
"description": "Live app only: press a key or shortcut."
},
{
"name": "ui_type",
"description": "Live app only: type into the focused field."
},
{
"name": "ui_screenshot",
"description": "Live app only: screenshot of the window or one panel."
},
{
"name": "ui_inspect",
"description": "Live app only: tool, workspace, panels, playback."
},
{
"name": "ui_control",
"description": "Live app only: call a control-channel method."
}
]
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Erwarteter Pfad: C:\Program Files\FilmCraft\filmcraft-cli.exe
Der Installer (ArtCraft-Launcher oder eigener) ist hier nicht geprueft.
@@ -0,0 +1 @@
{"version":"0.13.0","repository":"https://github.com/storytold/filmcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"filmcraft-cli.exe","path":"C:\\Program Files\\FilmCraft\\filmcraft-cli.exe","tag":"v0.13.0","sha256":"ed5c7e7f4df343a90f745867a6d4f6aea1ebd15c34b72bad0e94dc6ff3cee189"}
+12 -1
View File
@@ -1,11 +1,22 @@
# Changelog – gridcraft-mcp # Changelog – gridcraft-mcp
## 0.4.0 (2026-10-26)
- CLI 0.12.1. `open_workbook` öffnet .xlsm, .xls, .xlsb und .ods. Werkzeug `select`. Pivot: `insert.pivotTable`, `insert.pivotChart`, `pivot.*`.
- CLI-Befehle info, convert, eval, cat, check, run, commands, functions, mcp --connect PORT, send, version. Die Fallen von 0.8.0 sind nicht erneut durchgespielt.
## 0.3.0 (2026-10-19)
- Skill clientneutral: Claude-/Cursor-Details nur noch in README/docs; schärfere `description`.
- Praxiserkenntnisse: `range.fill` und aktive Zelle, `alreadyOpen`, Parameter-Beispiele (Validation, Conditional Format, Layout), Rezepte (Kalkulation / BOM / Vorlage füllen), Abschlussprüfung, Datenschutz.
- Neu: Cursor-Plugin je Skill (`gridcraft-mcp-cursor-v0.3.0.zip`) inkl. Deeplink.
## 0.2.0 (2026-10-19) ## 0.2.0 (2026-10-19)
- Erweiterung (`.mcpb`) als Standardweg; `display_name` ohne Umlaut („GridCraft for Claude“, Werkzeug-Präfix jetzt `…_for_Claude`). - Erweiterung (`.mcpb`) als Standardweg; `display_name` ohne Umlaut („GridCraft for Claude“, Werkzeug-Präfix jetzt `…_for_Claude`).
- Allgemeine Werkzeugnamen im Skill (Präfix hängt vom Client und vom Erweiterungsnamen ab). - Allgemeine Werkzeugnamen im Skill (Präfix hängt vom Client und vom Erweiterungsnamen ab).
- Doku: ArtCraft-Voraussetzung und „Erweiterung einschalten“; UTF-8-Fix in Manifest und README. - Doku: ArtCraft-Voraussetzung und „Erweiterung einschalten“; UTF-8-Fix in Manifest und README.
- Apostroph-Falle für Text mit führendem `=` (Beschriftungen wie `= Materialkosten`). - Apostroph-Falle für Text mit führendem `=`.
## 0.1.0 (2026-10-19) ## 0.1.0 (2026-10-19)
+21 -31
View File
@@ -4,74 +4,66 @@
## Zweck ## Zweck
Erstellt und bearbeitet Excel-Arbeitsmappen (`.xlsx`, `.csv`) über den MCP-Server von GridCraft. GridCraft ist der Open-Source-Excel-Nachbau aus der ArtCraft-Suite, getestet mit 0.8.0. Die Anweisungen für Claude stehen in [SKILL.md](SKILL.md). Erstellt und bearbeitet Excel-Arbeitsmappen (`.xlsx`, `.xlsm`, `.xls`, `.xlsb`, `.ods`, `.csv`) über den MCP-Server von GridCraft, einschließlich Pivot. CLI 0.12.1. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen ## Voraussetzungen
- Claude Desktop (die App)
- **GridCraft** über den ArtCraft-Launcher (`C:\Program Files\GridCraft\gridcraft-cli.exe`) - **GridCraft** über den ArtCraft-Launcher (`C:\Program Files\GridCraft\gridcraft-cli.exe`)
- Die Erweiterung `gridcraft-mcp-….mcpb` und dieses Skill-ZIP (siehe [Installation](#installation)) - Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Keine Ordnerbeschränkung.** Anders als WordCraft kennt GridCraft keine Lese-/Schreib-Roots. Der Server kann jede Datei lesen und schreiben, die der Windows-Benutzer lesen und schreiben darf. In Claude bei den GridCraft-Werkzeugen `open_workbook`, `save_workbook` und `execute_command` auf „Immer fragen“ lassen. **Keine Ordnerbeschränkung.** In Claude bei `open_workbook`, `save_workbook` und `execute_command` auf „Immer fragen“ lassen.
## Installation **Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz: Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `gridcraft-mcp-v0.2.0.mcpb` und `gridcraft-mcp-v0.2.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.2.0/gridcraft-mcp-v0.2.0.mcpb) laden. 1. `gridcraft-mcp-v0.4.0.mcpb` und `gridcraft-mcp-v0.4.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/gridcraft-mcp%2Fv0.4.0/gridcraft-mcp-v0.4.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren). 2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren).
3. Unter Einstellungen → Erweiterungen prüfen, dass **GridCraft for Claude** eingeschaltet ist. 3. Unter Einstellungen → Erweiterungen prüfen, dass **GridCraft for Claude** eingeschaltet ist.
4. Skill-ZIP in Claude hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**. 4. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
5. Claude komplett beenden (auch Taskleiste) und neu starten. 5. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
Wer v0.1.0 installiert hat: alte Erweiterung unter Einstellungen → Erweiterungen entfernen, v0.2.0 installieren, einschalten, Skill-ZIP v0.2.0 hochladen (ersetzt den alten Skill). Alte Skills `wordcraft-dokumente` bitte löschen. Wer v0.1.0, v0.2.0 oder v0.3.0 installiert hat: alte Erweiterung entfernen, v0.4.0 installieren, einschalten, Skill-ZIP v0.4.0 hochladen.
**Umsteigen von der manuellen Config:** Wer den Server früher in `claude_desktop_config.json` eingetragen hat: Eintrag `gridcraft` unter `mcpServers` vor der Installation der Erweiterung entfernen (vorher Sicherungskopie der Datei anlegen), sonst gibt es die Werkzeuge doppelt. **Umsteigen von der manuellen Config:** Eintrag `gridcraft` unter `mcpServers` vor der Installation der Erweiterung entfernen.
## Enthaltene Software ## Enthaltene Software
Die Erweiterung steuert [GridCraft](https://github.com/storytold/gridcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte des Upstreams liegen in der `.mcpb` unter `LICENSES/`. Die Erweiterung steuert [GridCraft](https://github.com/storytold/gridcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert.
## Im Test geprüft ## Im Test geprüft
Formeln, Tabellen, Zahlenformate und der PDF-Export. Beim Öffnen und Speichern einer bestehenden `.xlsx` blieben erhalten: verbundene Zellen, Kommentare, bedingte Formatierung, Datenüberprüfung, Namen, blattübergreifende Formeln, Fixierung, A4 quer und die Kopfzeile. Formeln, Tabellen, Zahlenformate, PDF-Export, Stückliste/BOM mit `range.fill`, Datenüberprüfung und bedingte Formatierung. Beim Öffnen/Speichern bestehender `.xlsx` blieben u. a. verbundene Zellen, Kommentare und A4 quer erhalten.
## Bekannte Grenzen ## Bekannte Grenzen
Kurzfassung, die Einzelheiten stehen in [SKILL.md](SKILL.md): Kurzfassung in [SKILL.md](SKILL.md): englische Formeln, Apostroph bei Text mit `=`, Diagramme nur aus zusammenhängendem Bereich, CSV ungeeignet für deutsches Excel, keine Makros.
- Formeln nur englisch und mit Komma als Trenner.
- Deutsche Zahlen und Datumsangaben als Text werden nicht erkannt und rechnen nicht mit.
- Diagramme nur aus einem zusammenhängenden Bereich.
- CSV-Export ist komma-getrennt und schreibt das Anzeigeformat.
- Keine Makros.
## Test ## Test
Neuen Chat öffnen und fragen: „Sind die GridCraft-Tools verfügbar? Lies A1:E10 aus \<Pfad zu einer Test-xlsx\>.“ Neuen Chat öffnen und fragen: „Sind die GridCraft-Tools verfügbar? Lies A1:E10 aus \<Pfad zu einer Test-xlsx\>.“ Präfix `…GridCraft_for_Claude…`.
Fehlen die Tools: Einstellungen → Erweiterungen – ist die Erweiterung eingeschaltet? Dann Claude komplett neu starten. Fehlen die Tools: Erweiterung eingeschaltet? CLI unter `C:\Program Files\GridCraft\gridcraft-cli.exe`? Neu starten, neuer Chat.
## Stolpersteine ## Stolpersteine
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust. - Erweiterungen sind nicht signiert.
- Formeln mit deutschen Namen ergeben `#NAME?` – englische Funktionsnamen verlangen. - Formeln mit deutschen Namen ergeben `#NAME?`.
## Deinstallation/Update ## Deinstallation/Update
Deinstallation: Einstellungen → Erweiterungen → entfernen; Skill in der Skill-Liste löschen. Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP.
Update: neue `.mcpb` und Skill-ZIP installieren, bestehende Version ersetzen lassen, Claude neu starten.
## Alternative: manuell (für Entwickler) ## Alternative: manuell (für Entwickler)
Statt der Erweiterung kann der MCP-Server in `claude_desktop_config.json` eingetragen werden. Gemeinsame Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). Statt der Erweiterung in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json` - Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json` - Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
GridCraft muss über den ArtCraft-Launcher installiert sein (`C:\Program Files\GridCraft\gridcraft-cli.exe`).
```json ```json
{ {
"mcpServers": { "mcpServers": {
@@ -83,8 +75,6 @@ GridCraft muss über den ArtCraft-Launcher installiert sein (`C:\Program Files\G
} }
``` ```
Auffinden der EXE:
```powershell ```powershell
Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "gridcraft-cli.exe" -ErrorAction SilentlyContinue Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "gridcraft-cli.exe" -ErrorAction SilentlyContinue
``` ```
+112 -36
View File
@@ -1,23 +1,19 @@
--- ---
name: gridcraft-mcp name: gridcraft-mcp
description: Excel-Arbeitsmappen (.xlsx, .csv) über den GridCraft-MCP-Server erstellen, öffnen, ändern, berechnen, formatieren und prüfen – Kalkulationen, Stücklisten, Listen, Diagramme, PDF-Export. description: "Excel-Arbeitsmappen (.xlsx, .xlsm, .xls, .xlsb, .ods, .csv) mit dem GridCraft-MCP-Server erstellen, öffnen, ändern, berechnen und prüfen, einschließlich Pivot-Tabellen. Verwenden, wenn GridCraft-Werkzeuge verbunden sind oder der Nutzer GridCraft nennt; typisch für Kalkulationen, Stücklisten (BOM), Listen, Diagramme, Pivot, PDF-Export. Nicht für eingebaute xlsx-Hilfen ohne GridCraft-Server."
--- ---
# Tabellen mit GridCraft (MCP) # Tabellen mit GridCraft (MCP)
GridCraft ist eine Open-Source-Tabellenkalkulation (Rust), die Excel-Parität anstrebt. Alles ist ein Befehl mit stabiler ID nach dem Excel-Ribbon (`home.bold`, `insert.chart`, `data.sort` …); Ribbon, CLI und MCP rufen dieselben Befehle auf. Getestet mit Version 0.8.0. GridCraft ist eine Open-Source-Tabellenkalkulation (Rust), die Excel-Parität anstrebt. Alles ist ein Befehl mit stabiler ID nach dem Excel-Ribbon (`home.bold`, `insert.chart`, `data.sort` …); Ribbon, CLI und MCP rufen dieselben Befehle auf. CLI 0.12.1. Die Fallen weiter unten sind am 0.8.0 bestätigt und an 0.12.1 nicht erneut durchgespielt.
## Voraussetzung ## Voraussetzung
Die Werkzeuge heißen `write_range`, `read_range`, `execute_command` … mit einem Präfix, der vom Client und vom Namen der Erweiterung abhängt (z. B. `mcp__…__GridCraft_for_Claude__write_range`). Sind sie zurückgestellt, per ToolSearch nach dem Werkzeugnamen ohne Präfix suchen (z. B. `write_range`) und alle benötigten in einem Aufruf laden. Fehlen sie, dem Nutzer sagen, dass der Server nicht läuft, statt auf etwas anderes auszuweichen. Die Werkzeuge `write_range`, `read_range`, `execute_command` … müssen verbunden sein. Ihr Präfix hängt vom Client und vom Namen der Erweiterung bzw. des Servers ab (z. B. `mcp__…__GridCraft_for_Claude__write_range`). 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 etwas anderes auszuweichen.
**Standardweg:** GridCraft aus dem ArtCraft-Launcher und die Claude-Desktop-Erweiterung „GridCraft 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. **Keine Ordnerbeschränkung:** Anders als WordCraft kann der Server jede Datei lesen und schreiben, die der Nutzer lesen und schreiben darf. Deshalb:
**Alternative (Entwickler):** Eintrag `gridcraft` in `claude_desktop_config.json`; die App kann ihn beim Speichern eigener Einstellungen überschreiben.
**Keine Ordnerbeschränkung:** Anders als WordCraft kennt GridCraft keine `--automation-read-root/-write-root`. Der Server kann jede Datei lesen und schreiben, die der Nutzer lesen und schreiben darf. Deshalb:
- Nur Dateien öffnen, die der Nutzer genannt hat. - Nur Dateien öffnen, die der Nutzer genannt hat.
- Nie über ein Original speichern. Immer unter neuem Namen speichern (z. B. `<name>_bearbeitet.xlsx` im selben Ordner oder in einem vom Nutzer genannten Ausgabeordner) und den Pfad nennen. - Nie über ein Original speichern. Immer unter neuem Namen speichern und den Pfad nennen.
- Vor jedem `save_workbook` / `file.export*` den Zielpfad prüfen. - Vor jedem `save_workbook` / `file.export*` den Zielpfad prüfen.
## Tools ## Tools
@@ -31,55 +27,135 @@ Die Werkzeuge heißen `write_range`, `read_range`, `execute_command` … mit ein
| `write_range` | `{range, values}` – 2-D-Array; Strings mit `=` sind Formeln | | `write_range` | `{range, values}` – 2-D-Array; Strings mit `=` sind Formeln |
| `set_cell` / `get_cell` | eine Zelle schreiben/lesen (Wert, Formel, Text, Stil) | | `set_cell` / `get_cell` | eine Zelle schreiben/lesen (Wert, Formel, Text, Stil) |
| `evaluate_formula` | Formel testen, ohne das Blatt zu ändern | | `evaluate_formula` | Formel testen, ohne das Blatt zu ändern |
| `select` | Auswahl setzen (`range`, `active?`); Befehle ohne `range` wirken darauf |
| `format_range` | `bold, italic, underline, fontName, fontSize, fontColor, fillColor, numberFormat, horizontalAlign, wrapText, borders` | | `format_range` | `bold, italic, underline, fontName, fontSize, fontColor, fillColor, numberFormat, horizontalAlign, wrapText, borders` |
| `create_table` | `{range, name?, header?, style?}` | | `create_table` | `{range, name?, header?, style?}` |
| `insert_chart` | `{range, type, title?, subtype?, at?}` | | `insert_chart` | `{range, type, title?, subtype?, at?}` |
| `sort_range` / `filter` | Sortieren / AutoFilter | | `sort_range` / `filter` | Sortieren / AutoFilter |
| `new_workbook` / `open_workbook` / `save_workbook` | Dateien (.xlsx, .csv, .tsv, .json, .html) | | `new_workbook` / `open_workbook` / `save_workbook` | öffnen: .xlsx, .xlsm, .xls, .xlsb, .ods, .csv, .tsv, .txt, .json; speichern: .xlsx, .csv, .tsv, .json, .html |
| `undo` / `redo` | Verlauf | | `undo` / `redo` | Verlauf |
| `list_functions` | verfügbare Tabellenfunktionen | | `list_functions` | verfügbare Tabellenfunktionen |
| `screenshot` | nur im Remote-Modus (`--connect`) | | `screenshot` | nur mit verbundener Desktop-App |
Bereiche mit Blatt: `"Kalkulation!A3:E8"`. Bereiche mit Blatt: `"Kalkulation!A3:E8"`.
## Arbeitsweise ## Arbeitsweise
1. **Befehls-IDs nie raten:** `list_commands {search: "…"}` (z. B. `column width`, `freeze`, `page`, `rename`, `chart.`). 1. **Befehls-IDs nie raten:** `list_commands {search: "…"}` (z. B. `column width`, `freeze`, `page`, `rename`, `chart.`, `range.fill`).
2. **Daten in einem Rutsch:** `write_range` mit ganzer Tabelle inkl. Formeln statt vieler `set_cell`. 2. **Daten in einem Rutsch:** `write_range` mit ganzer Tabelle inkl. Formeln statt vieler `set_cell`.
3. **Formeln statt fester Werte** für alles Berechnete (Summen, MwSt, Aufschläge), damit der Nutzer in Excel weiterrechnen kann. Parameter (Aufschlag, MwSt-Satz) in eigene Zellen und per absolutem Bezug (`$B$1`) verwenden. 3. **Formeln statt fester Werte** für alles Berechnete. Parameter in eigene Zellen und per absolutem Bezug (`$B$1`).
4. **Prüfen:** `read_range` (berechnete Werte), `read_range {formulas: true}` (Formeln), `read_range {formatted: true}` (Anzeige), `inspect_workbook` (Struktur). Beim PDF-Export das Ergebnis ansehen. 4. Vor dem Massenbefüllen Formel-Syntax mit `evaluate_formula` testen.
5. **Speichern** als .xlsx unter neuem Namen; zur Kontrolle mit `open_workbook` wieder öffnen und Formeln lesen. 5. **Prüfen:** `read_range`, `read_range {formulas: true}`, `read_range {formatted: true}`, `inspect_workbook`.
6. **Speichern** als .xlsx unter neuem Namen.
## Deutsche Eingaben – wichtigste Fallen (im Test bestätigt) ## Deutsche Eingaben – wichtigste Fallen
- **Formeln nur englisch und mit Komma:** `=SUM(E2:E5)`, `=ROUND(E8,2)`, `=VLOOKUP(…,FALSE)`, `=IF(…)`. Deutsche Namen (`=SUMME(…)`) ergeben `#NAME?`, Semikolon als Trenner ergibt einen Formelfehler. Excel zeigt die Formeln beim Öffnen trotzdem auf Deutsch an. - **Formeln nur englisch und mit Komma:** `=SUM(E2:E5)`, `=ROUND(E8,2)`, `=VLOOKUP(…,FALSE)`, `=IF(…)`. Deutsche Namen ergeben `#NAME?`.
- **Zahlen als JSON-Zahl mit Punkt** übergeben (`0.75`, nicht `"0,75"`). Ein String mit Komma wird **als Text** gespeichert und rechnet nicht mit. - **Zahlen als JSON-Zahl mit Punkt** (`0.75`, nicht `"0,75"`).
- **Datumswerte als ISO** (`"2026-10-19"`) oder `=DATE(2026,10,19)`. `"19.10.2026"` wird zu Text. Danach Zahlenformat setzen: `numberFormat: "DD.MM.YYYY"`. - **Datumswerte als ISO** (`"2026-10-19"`) oder `=DATE(2026,10,19)`. Danach `numberFormat: "DD.MM.YYYY"`.
- **Zahlenformate sind sprachneutral:** `"#,##0.00 €"` erscheint in GridCraft als `1,114.10 €`, in einem deutschen Excel aber korrekt als `1.114,10 €`. Nicht „reparieren“. - **Zahlenformate sind sprachneutral:** `"#,##0.00 €"` erscheint in GridCraft als `1,114.10 €`, in deutschem Excel korrekt. Nicht „reparieren“.
- **Neue Mappe = US-Letter, Blatt heißt `Sheet1`:** für deutsche Dokumente `pageLayout.size {paper: "A4"}` und `sheet.rename {sheet: "Sheet1", name: "…"}`. - **Neue Mappe = US-Letter, Blatt heißt `Sheet1`:** `pageLayout.size {paper: "A4"}` und `sheet.rename`.
- **Text, der mit `=` beginnt, wird als Formel gelesen.** Beschriftungen wie `= Materialkosten` ergeben `#NAME?`. Wie in Excel einen Apostroph voranstellen: `"'= Materialkosten"` – gespeichert wird reiner Text. - **Text, der mit `=` beginnt, wird als Formel gelesen.** Apostroph voranstellen: `"'= Materialkosten"`.
## range.fill und aktive Zelle
`range.fill {input}` interpretiert relative Bezüge **relativ zur aktiven Zelle**, nicht zur ersten Zelle des Bereichs (aus `C12` wurde fälschlich `O23`). Richtig:
1. `select {range:"M12:M111", active:"M12"}`
2. `execute_command` mit `range.fill {input:"=…C12…"}` **ohne** `range` im fill-Aufruf
Vor dem Massenbefüllen Formel mit `evaluate_formula` testen.
## Pivot (0.12.1)
`list_commands {search: "pivot"}` vor dem ersten Aufruf. Belegte IDs, Auszug:
- `insert.pivotTable` — `source` (Bereich oder Tabellenname), `destination` (`"new"` = neues Blatt, Bericht bei A3, oder `"Sheet1!H3"`), `rows`, `columns`, `values` (`{field, func?, name?}`), `filters`
- `insert.pivotChart` — Diagramm an die Pivot-Tabelle gebunden (`pivot`, `type`, `at`)
- `pivot.addField` / `pivot.removeField` / `pivot.moveField` — `area`: `rows`, `columns`, `values`, `filters`
- `pivot.refresh`, `pivot.layout` (`compact|outline|tabular`), `pivot.filter`, `pivot.sort`, `pivot.valueSettings`
## open_workbook und alreadyOpen
`.xls` bringt Werte, Formeln und Zahlenformate. `.xlsb` und `.ods` bringen Blattdaten und zwischengespeicherte Formelwerte; die Warnungen der Antwort lesen.
`open_workbook` auf eine bereits offene Datei liefert nur `{"alreadyOpen": true}` und lädt **nicht** neu – für die Kontrolle der gespeicherten Datei ungeeignet. Andere Mappe aktivieren/schließen oder Datei extern prüfen.
## Parameter-Beispiele (im Test bestätigt)
Datenüberprüfung:
```json
{"command":"data.validation","params":{"range":"E12:E100","type":"list","formula1":"\"A,B,C\"","dropdown":true,"errorStyle":"warning","errorTitle":"Eingabe","errorMessage":"Wert aus der Liste wählen"}}
```
```json
{"command":"data.validation","params":{"range":"N12:N100","type":"whole","operator":"between","formula1":"1","formula2":"9"}}
```
```json
{"command":"data.validation","params":{"range":"F12:F100","type":"decimal","operator":"greaterOrEqual","formula1":"0"}}
```
Bedingte Formatierung:
```json
{"command":"home.conditionalFormat","params":{"range":"A12:N111","rule":{"type":"expression","formula":"AND($E12<>\"\",$N12=\"\")","preset":"lightRedFill"}}}
```
```json
{"command":"home.conditionalFormat","params":{"range":"A12:A111","rule":{"type":"expression","formula":"$A12=\"x\"","style":{"font":{"bold":true}}}}}
```
Layout:
```json
{"command":"home.columnWidth","params":{"cols":"E:E","chars":36}}
{"command":"view.freezePanes","params":{"cell":"F12"}}
{"command":"pageLayout.printTitles","params":{"rows":"11:11"}}
{"command":"pageLayout.headerFooter","params":{"header":"&L&F&R&A","footer":"&LStand: &D&RSeite &P von &N"}}
```
## Weitere Fallen ## Weitere Fallen
- **Diagramme nur aus zusammenhängendem Bereich:** `insert_chart {range: "B1:B5,E1:E5"}` liefert ein leeres Diagramm über den Daten. Kategorie und Werte nebeneinander anordnen (oder Hilfsbereich anlegen) und `range: "A1:B5"` nutzen. Immer `at` setzen (z. B. `"H2"`), damit das Diagramm keine Daten verdeckt. - **Diagramme nur aus zusammenhängendem Bereich;** immer `at` setzen.
- **PDF-Export** (`file.exportPdf {path}`) schneidet breite Inhalte ab: vorher `home.autofitColumnWidth {cols: "A:E"}`, ggf. `pageLayout.orientation {orientation: "landscape"}` und `pageLayout.scaleToFit {width: 1}`. - **PDF-Export** schneidet breite Inhalte ab: vorher `home.autofitColumnWidth`, ggf. Querformat und `pageLayout.scaleToFit {width: 1}`.
- **Spaltenbreiten** werden nicht automatisch angepasst: nach dem Befüllen `home.autofitColumnWidth`. - **CSV-Export** ist komma-getrennt und schreibt die formatierte Anzeige – für deutsches Excel oft ungeeignet.
- **CSV-Export** (`save_workbook` mit `.csv`) schreibt Komma-getrennt und die **formatierte Anzeige** (`412.50 €`). Für deutsches Excel oder ERP-Import ungeeignet – lieber .xlsx liefern oder vor dem CSV-Export Zahlenformate entfernen und den Nutzer auf das Trennzeichen hinweisen. - **`open_workbook` öffnet eine weitere Mappe** und macht sie aktiv.
- **`open_workbook` öffnet eine weitere Mappe** und macht sie aktiv; Befehle wirken auf die aktive Mappe. Bei mehreren Mappen mit `inspect_workbook` prüfen, welche aktiv ist. - `undo` nach `open_workbook` hat keinen Verlauf.
- `undo` nach `open_workbook` hat keinen Verlauf; Fehler vor dem Speichern beheben.
## Bestehende Mappen bearbeiten ## Bestehende Mappen bearbeiten
Im Test blieben beim Öffnen und Speichern einer Excel-Datei erhalten: verbundene Zellen, Schrift, Zahlenformate, Kommentare, bedingte Formatierung, Datenüberprüfung, benannte Bereiche, blattübergreifende Formeln, fixierte Bereiche, Spaltenbreiten, Seitenformat (A4 quer) und Kopfzeile. 1. `open_workbook` → `inspect_workbook` → relevante Bereiche mit `read_range {formulas: true}` lesen.
2. Nur gewünschte Zellen ändern; Formeln anderer Zellen nicht durch Werte ersetzen.
3. Ergebnis gegenlesen, unter neuem Namen speichern.
4. Dem Nutzer kurz sagen, was geändert wurde.
Ablauf: ## Rezepte
1. `open_workbook` → `inspect_workbook` → relevante Bereiche mit `read_range {formulas: true}` lesen, bevor etwas geändert wird.
2. Nur die gewünschten Zellen ändern; Formeln anderer Zellen nicht durch Werte ersetzen. ### Kalkulation / Zuschlagskalkulation
3. Ergebnis gegenlesen (`read_range`), unter neuem Namen speichern.
4. Dem Nutzer kurz sagen, was geändert wurde (Zellen, alter → neuer Wert), und vorschlagen, die Datei einmal in Excel zu öffnen. Parameterblatt mit Werten und absoluten Bezügen (`$B$1`). Skonto/Rabatt im Hundert korrekt formeln. Datenblatt mit `write_range`, Summen/MwSt als Formeln. A4, Zahlenformate, speichern unter neuem Namen.
### Stückliste / BOM
Kopfzeile und Zusammenfassung → Datenzeilen schreiben → Formeln per `select` + `range.fill` nachziehen → Auswahllisten (`data.validation`) → bedingte Formatierung → Freeze/PrintTitles → Revisionsblatt → speichern.
### Vorlage füllen
Vorlage öffnen → Zeilen ab Startzeile mit `write_range` schreiben → bei Bedarf `home.insertRows` → Formeln per `range.fill` nachziehen → prüfen → unter neuem Namen speichern.
## Abschlussprüfung
- `read_range` / `read_range {formulas: true}` auf Kernbereiche.
- Bei PDF: Ergebnis ansehen (Breite, Seitenumbruch).
- Gespeicherte Datei nicht mit `open_workbook` auf dieselbe Mappe „neu laden“ erwarten (`alreadyOpen`); externe Prüfung oder andere Mappe.
- Pfad dem Nutzer nennen.
## Datenschutz
- Grün: allgemeine/technische Inhalte ohne Kundenbezug.
- Gelb: Projekt-/Geschäftsinfos, Preise nur nach Abwägung oder anonymisiert.
- Rot: personenbezogene Daten und NDA-Inhalte nicht in die Cloud-KI.
- GridCraft hat keine Ordnersperre – nur Dateien öffnen/speichern, die der Nutzer genannt hat.
## Grenzen ## Grenzen
- Keine Netzwerkfunktionen (`WEBSERVICE` liefert `#VALUE!`), keine Makros/VBA. - Keine Netzwerkfunktionen (`WEBSERVICE` liefert `#VALUE!`), keine Makros/VBA.
- Funktionsumfang mit `list_functions` prüfen, bevor exotische Funktionen genutzt werden. - Funktionsumfang mit `list_functions` prüfen.
- Im Remote-Modus (`--connect`) steuert der Server die geöffnete Desktop-App; das ist ebenfalls nicht auf Ordner beschränkt. - Mit verbundener Desktop-App (`mcp --connect PORT`, die Screenshot-Hilfe nennt 7979) entfällt jede Ordnersperre ebenfalls. Die CLI kennt keine Lese-/Schreib-Ordner.
- CLI neben MCP: `info`, `convert`, `eval`, `cat`, `check`, `run`, `commands`, `functions`, `send`, `version`.
+2 -2
View File
@@ -2,8 +2,8 @@
"manifest_version": "0.3", "manifest_version": "0.3",
"name": "gridcraft-mcp", "name": "gridcraft-mcp",
"display_name": "GridCraft for Claude", "display_name": "GridCraft for Claude",
"version": "0.2.0", "version": "0.4.0",
"description": "Excel-Arbeitsmappen (.xlsx, .csv) erstellen und bearbeiten. Getestet mit GridCraft 0.8.0. Benötigt GridCraft aus dem ArtCraft-Launcher unter C:\\Program Files\\GridCraft\\. Ohne Ordnersperre – GridCraft kann alle Dateien lesen und schreiben, auf die der Benutzer Zugriff hat.", "description": "Excel-Arbeitsmappen erstellen und bearbeiten, einschließlich Pivot. CLI 0.12.1. Benötigt GridCraft aus dem ArtCraft-Launcher unter C:\\Program Files\\GridCraft\\. Ohne Ordnersperre – GridCraft kann alle Dateien lesen und schreiben, auf die der Benutzer Zugriff hat.",
"author": { "author": {
"name": "Dominic Gundel" "name": "Dominic Gundel"
}, },
+1 -1
View File
@@ -1 +1 @@
{"version":"0.8.0","repository":"https://github.com/storytold/gridcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"gridcraft-cli.exe","path":"C:\\Program Files\\GridCraft\\gridcraft-cli.exe","tag":"v0.8.0","sha256":"2eafa6b8d08357fb44610e030ebe54491b5abc1329da3d748878228a868d779a"} {"version":"0.12.1","repository":"https://github.com/storytold/gridcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"gridcraft-cli.exe","path":"C:\\Program Files\\GridCraft\\gridcraft-cli.exe","tag":"v0.12.1","sha256":"4e20b4ab006f6923cc3c5480df27eebd2a01456aa73c07c24681e70acc6e7d96"}
+13
View File
@@ -0,0 +1,13 @@
# Changelog – pdfcraft-mcp
## 0.2.0 (2026-10-26)
- CLI 0.14.0. Zusätzlich `batch` (convert, ocr, optimize), `audit` und `tools`. `--compact` und die Ordner-Flags bleiben.
- `ocr_status` auf diesem Rechner: verfügbar, Sprache nur Englisch, Modelle unter `C:\Program Files\PdfCraft\models`.
## 0.1.0 (2026-10-19)
- Erste Version: Skill und Claude-Desktop-Erweiterung für PdfCraft 0.9.0 aus dem ArtCraft-Launcher (`C:\Program Files\PdfCraft\pdfcraft-cli.exe`, nicht auf PATH).
- Der Server startet mit `--compact`: 17 Kernwerkzeuge plus `tool_search`/`tool_call`. Ohne die Option sind es 171 Werkzeuge mit etwa 176 KB Beschreibung; das übersteigt die zuletzt von Cursor genannte Werkzeuggrenze.
- Lese-Ordner `${HOME}/Documents`, Schreib-Ordner `${HOME}/Documents/Claude`. Der Schreib-Ordner muss im Lese-Ordner liegen, sonst lassen sich eigene Ergebnisse nicht wieder öffnen.
- Cursor-Plugin `pdfcraft-mcp-cursor-v0.1.0.zip` (Server `pdfcraft`) inkl. Deeplink; die Argumente inklusive `--compact` und der Ordner werden übernommen.
+89
View File
@@ -0,0 +1,89 @@
# pdfcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Öffnet, liest, schwärzt, bereinigt und bündelt PDFs über den MCP-Server von PdfCraft. CLI 0.14.0 (Schwärzen und Doku-Pakete am 0.9.0 geprüft). Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **PdfCraft** über den ArtCraft-Launcher (`C:\Program Files\PdfCraft\pdfcraft-cli.exe`, im MSI enthalten, nicht auf PATH)
- Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `pdfcraft-mcp-v0.2.0.mcpb` und `pdfcraft-mcp-v0.2.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/pdfcraft-mcp%2Fv0.2.0/pdfcraft-mcp-v0.2.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren).
3. **Lese-Ordner weit:** `Dokumente` (`${HOME}/Documents`). **Schreib-Ordner eng und darin:** `Dokumente\Claude`. PdfCraft lehnt es ab, eine selbst geschriebene Datei wieder zu öffnen, wenn der Schreib-Ordner außerhalb des Lese-Ordners liegt.
4. Unter Einstellungen → Erweiterungen prüfen, dass **PdfCraft for Claude** eingeschaltet ist.
5. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
6. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
**Umsteigen von der manuellen Config:** Eintrag `pdfcraft` unter `mcpServers` vor der Installation der Erweiterung entfernen (vorher Sicherungskopie).
## Ordner
| | Standard |
|---|---|
| Lesen | `${HOME}/Documents` |
| Schreiben | `${HOME}/Documents/Claude` |
Der Server startet mit `--compact`. Ohne die Option liefert er 171 Werkzeuge mit etwa 176 KB Beschreibung. Mit ihr sind es 17 Kernwerkzeuge plus `tool_search` und `tool_call`. Dieselbe Option steht im Cursor-Plugin, weil Cursor die Zahl der aktiven Werkzeuge begrenzt (siehe [docs/CURSOR.md](../../docs/CURSOR.md)).
## Freigaben
In Claude bei `doc_open`, `doc_save` und `tool_call` auf **„Immer fragen“** lassen, wenn du Pfade und Schwärzungen mitkontrollieren willst. `redact_apply` und `doc_remove_hidden` ändern die Datei endgültig.
## Enthaltene Software
Die Erweiterung steuert [PdfCraft](https://github.com/storytold/pdfcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. Das Icon ist die App-Kachel aus `assets/app-icon/` (512×512, ebenfalls MIT oder Apache-2.0).
## Test
Neuen Chat öffnen. Ein Test-PDF schwärzen lassen und `doc_audit_redactions` ausführen (Ergebnis `count: 0`). Die Werkzeuge heißen mit Präfix `…PdfCraft_for_Claude…`.
Fehlen die Tools: Erweiterung eingeschaltet? CLI unter `C:\Program Files\PdfCraft\pdfcraft-cli.exe`? Neu starten, neuer Chat.
## Stolpersteine
- Speichern oder erneutes Öffnen mit „path rejected“: Ziel lag außerhalb des erlaubten Ordners, oder der Schreib-Ordner liegt nicht im Lese-Ordner. Einstellungen → Erweiterungen → PdfCraft for Claude.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
Statt der Erweiterung den MCP-Server in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"pdfcraft": {
"command": "C:\\Program Files\\PdfCraft\\pdfcraft-cli.exe",
"args": [
"mcp",
"--compact",
"--automation-read-root", "C:\\Pfad\\zu\\Dokumente",
"--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\Claude"
]
}
}
}
```
`--compact` nicht weglassen. Beide Ordner setzen; der Schreib-Ordner muss im Lese-Ordner liegen.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+94
View File
@@ -0,0 +1,94 @@
---
name: pdfcraft-mcp
description: PDFs über den PdfCraft-MCP-Server öffnen, auslesen, schwärzen, bereinigen, zusammenführen, aufteilen, mit Kopf-/Fußzeile, Seitenzahlen, Wasserzeichen und Lesezeichen versehen und nach Word exportieren. Verwenden, wenn PdfCraft-Werkzeuge verbunden sind oder der Nutzer PdfCraft nennt; typisch für Schwärzen vor der Weitergabe, Dokumentationspakete (Betriebsanleitung, Datenblätter, Konformitätserklärung), Angebote und Zeichnungen auslesen.
---
# PDFs mit PdfCraft (MCP)
PdfCraft ist ein Open-Source-PDF-Programm (Rust), das Acrobat-Pro-Parität anstrebt. CLI 0.14.0. Die Schwärz-Fallen sind am 0.9.0 bestätigt und an 0.14.0 nicht erneut durchgespielt.
## Voraussetzung
Die Werkzeuge `doc_open`, `text_extract`, `tool_search`, `tool_call` … müssen verbunden sein. Ihr Präfix hängt vom Client und vom Namen der Erweiterung bzw. des Servers ab (z. B. `mcp__…__PdfCraft_for_Claude__doc_open`). 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.
Der Server läuft im **Kompaktmodus** (`--compact`): Er zeigt 17 Kernwerkzeuge. Die übrigen gut 150 erreicht man über `tool_search` und `tool_call`. Ohne Kompaktmodus wären es 171 Werkzeuge mit rund 45.000 Tokens Beschreibung.
Dateizugriff: Lesen nur im Lese-Ordner, Schreiben nur im Schreib-Ordner. Andere Pfade werden mit `automation path rejected: outside the read root …` bzw. `… write root …` abgelehnt. Das ist ein normaler Fehler: dem Nutzer den erlaubten Ordner nennen. Der Schreib-Ordner muss **im** Lese-Ordner liegen (z. B. Lese = Dokumente, Schreib = Dokumente\Claude), sonst lassen sich eigene Ergebnisse nicht wieder öffnen.
## Werkzeuge
| Direkt | Zweck |
|---|---|
| `doc_open` / `doc_close` / `doc_save` | öffnen (liefert `doc`-Nummer), schließen, speichern (`path` = neue Datei) |
| `doc_info` / `doc_inspect` | Seiten, Metadaten, Zustand |
| `text_extract` / `text_find` | Text je Seite; Fundstellen mit Rechtecken |
| `page_render` / `render_preview` | Seite als PNG ansehen |
| `doc_combine` / `doc_split` | zusammenführen / aufteilen |
| `edit_undo` | rückgängig |
| `command_list` / `command_run` / `command_batch` | Befehlskatalog |
| `tool_search` / `tool_call` | alle weiteren Werkzeuge finden / ausführen |
Wichtige Werkzeuge über `tool_call`: `redact_mark`, `redact_apply`, `doc_audit_redactions`, `doc_hidden_info`, `doc_remove_hidden`, `doc_header_footer`, `doc_watermark`, `page_add_text`, `bookmark_list`/`bookmark_add`/`bookmark_rename`, `page_delete`/`page_move`/`page_rotate`/`page_extract`/`page_insert_file`, `doc_export_office`, `doc_export_text`, `form_fields`/`form_fill`, `comment_list`, `doc_compare`, `doc_protect`, `ocr_status`/`ocr_recognize`, `pdfa_verify`.
## Arbeitsweise
1. **Parameter nie raten:** Vor dem ersten Aufruf eines Werkzeugs `tool_search {name: "<werkzeug>"}`. Die Namen sind uneinheitlich, z. B. `doc_combine {out}`, `doc_split {out_dir}`, `doc_set_info {key, value}`. Unbekannte Parameter werden mit `-32602` abgelehnt und der Fehler nennt die erlaubten. Dann korrigieren und erneut aufrufen.
2. **Seiten zählen ab 1.** Rechtecke sind PDF-Punkte, Ursprung oben links (1 mm = 2,835 pt).
3. Änderungen bleiben im Speicher, bis `doc_save` aufgerufen wird. Bis dahin lassen sie sich mit `edit_undo` zurücknehmen.
4. **Speichern immer unter neuem Namen** in den Schreib-Ordner (`doc_save {doc, path}`). `doc_save` ohne `path` überschreibt die geöffnete Datei.
5. **Prüfen:** `render_preview` ansehen, `text_extract` gegenlesen, gespeicherte Datei neu öffnen.
## Fallen (im Test bestätigt)
- **Schwärzen erfasst nur, was markiert ist.** `redact_mark {find: "EUR"}` schwärzt nur „EUR“, der Betrag davor bleibt stehen. Ganze Werte markieren:
- per `words` (Liste exakter Werte) oder
- per Rechteck: mit `text_find` das Label suchen (z. B. „Preis:“), dann `redact_mark {page, rect: [x1+2, y0-1, <rechter Rand>, y1+1]}`.
- **`overlay`-Text ist echter Text.** Er erscheint danach in `text_extract` und in der Datei. Nur neutrale Wörter verwenden („geschwärzt“), nie den Originalwert.
- **`redact_mark` allein entfernt nichts.** Erst `redact_apply` löscht endgültig. Danach `doc_audit_redactions`: Es findet Scheinschwärzungen (schwarze Kästen über weiterhin lesbarem Text) und nicht angewendete Markierungen.
- **Metadaten:** `doc_hidden_info` zeigt Autor, Programm, Kommentare, Anhänge, versteckte Ebenen; `doc_remove_hidden` entfernt sie. Vor jeder Weitergabe ausführen.
- **Muster** für `redact_mark {pattern}`: `email`, `phone`, `date`, `credit-card`, `ssn`. Es gibt kein Muster für Geldbeträge und keins für Namen; diese per `words` oder Rechteck schwärzen.
- **`doc_combine {paths, out, open: true}`** schreibt die Datei sofort. Das geöffnete Ergebnis heißt „Combined“ und hat keinen Pfad: Spätere Änderungen mit `doc_save {path}` speichern. Lesezeichen heißen danach wie die Quelldateien; mit `bookmark_rename` umbenennen.
- **Kopf-/Fußzeile:** `doc_header_footer {footer_right: "Seite <<1>> von <<n>>"}` funktioniert. Datums-Platzhalter gibt es nur amerikanisch (`<<m/d/yyyy>>`, `<<d/m/yyyy>>`, `<<yyyy-mm-dd>>`), `<<dd.mm.yyyy>>` bleibt als Text stehen. Das Datum ausgeschrieben einsetzen (`Stand 19.10.2026`).
- `page_add_text`/Kopfzeilen: Schriften nur helvetica, times, courier; Umlaute, ß und € gehen.
- **OCR:** `ocr_status` (CLI 0.14.0 auf diesem Rechner: `available: true`, Sprache nur `en`, Modelle unter `C:\Program Files\PdfCraft\models`). `batch --steps convert,ocr,optimize` nimmt `--language` (Hilfe zeigt `en`). Deutsch ist nicht in der Sprachliste.
## Rezepte
1. **Schwärzen vor der Weitergabe** (z. B. Kunden-PDF für eine Vorlage oder Cloud-KI):
1. `doc_open`.
2. Markieren:
- `redact_mark {pattern: "email"}` und `{pattern: "phone"}`;
- `{words: [Namen, Firma, Adresse]}` mit den Werten vom Nutzer;
- Beträge per Rechteck.
3. `redact_apply`, dann `doc_audit_redactions` (Ergebnis muss `count: 0` sein), dann `doc_remove_hidden`.
4. `text_extract` auf Reste prüfen und `render_preview` ansehen.
5. Mit `doc_save {path: "<name>_geschwaerzt.pdf"}` speichern.
2. **Dokumentationspaket:** `doc_combine {paths: [Deckblatt, Konformitätserklärung, Betriebsanleitung, Datenblätter, Schaltplan], out, open: true}` → Lesezeichen umbenennen → `doc_header_footer` (Projekt, „Seite <<1>> von <<n>>“) → ggf. `doc_watermark {text: "ENTWURF", opacity: 0.15}` → `doc_save {path}`.
3. **Auslesen:** `text_extract {doc, pages}` bzw. `text_find`; Tabellen/Formulare über `form_fields`. Ergebnis als Text/Tabelle zurückgeben, Original nicht verändern.
4. **Nach Word:** `doc_export_office {doc, path: "….docx"}`, danach mit WordCraft weiterbearbeiten.
## Abschlussprüfung
- Alle geänderten Seiten mit `render_preview` angesehen.
- Bei Schwärzungen: `doc_audit_redactions` hat `count: 0`, `text_extract` zeigt keine geschwärzten Werte, `doc_hidden_info` ist leer.
- Gespeicherte Datei neu geöffnet, Seitenzahl plausibel, Pfad dem Nutzer genannt.
## Datenschutz
Ampel:
- 🟢 Allgemeine und technische Inhalte ohne Kundenbezug.
- 🟡 Projekt- und Geschäftsinfos, Preise: nur nach Abwägung oder anonymisiert.
- 🔴 Personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
**Blind schwärzen** bei 🔴-Dokumenten: Das Original nie mit `text_extract`, `page_render`, `render_preview` oder `doc_audit_redactions` lesen. Diese Werkzeuge schicken den Inhalt ans Modell. Stattdessen:
1. Nur mit Mustern und vom Nutzer genannten Werten markieren (`redact_mark` meldet nur Anzahlen).
2. Erst nach `redact_apply` das Ergebnis ansehen und prüfen.
Dem Nutzer sagen, welche Kategorien geschwärzt wurden, und ihn das Ergebnis selbst gegenlesen lassen.
## Grenzen
- Digitale Signaturen: Nach Schwärzen, Zusammenführen oder Seitenänderungen ist eine bestehende Signatur ungültig. Den Nutzer vorher darauf hinweisen.
- Komplexe Layouts exportieren nur näherungsweise nach Word (`doc_export_office`).
- Formulare und JavaScript nur bearbeiten, wenn der Nutzer das ausdrücklich will.
- CLI zusätzlich zu den MCP-Werkzeugen: `batch` (Schritte `convert`, `ocr`, `optimize`), `audit` (Scheinschwärzung, Exit-Code bei Fund), `tools` (JSON-Schemas). `audit` ersetzt nicht `doc_audit_redactions` nach einem Schwärzlauf.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the PdfCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,60 @@
PdfCraft
Copyright (c) 2026 ArtCraft Team and the PdfCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
list (author, source, license) is in ATTRIBUTION.md.
- Lucide icons (assets/icons/*.svg) — ISC License. See assets/icons/LICENSE-lucide.txt.
The Windows PDF file icon (assets/app-icon/pdfcraft-document.svg and .ico) adapts Lucide's
file-text outline and combines it with contributor-original artwork. See
assets/app-icon/LICENSE-document.txt (ISC AND (MIT OR Apache-2.0)), packaged as
LICENSE-document.txt beside the Windows executables.
- Inter typeface (assets/fonts/Inter-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-Inter.txt.
- JetBrains Mono typeface (assets/fonts/JetBrainsMono-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-JetBrainsMono.txt.
- Dancing Script typeface (assets/fonts/DancingScript.ttf), Copyright 2016 The Dancing Script Project Authors — SIL Open Font License 1.1 (Reserved Font Name "Dancing Script"). See assets/fonts/OFL-DancingScript.txt.
- Fonts from craft-fonts (https://github.com/storytold/craft-fonts), an optional build input
(CRAFT_FONTS_DIR) that is not part of this repository. Builds made with it, which includes every
official release, embed the fonts listed in
https://github.com/storytold/craft-fonts/blob/main/ATTRIBUTION.md (BIZ UDPGothic, Shippori Mincho,
BIZ UDMincho; the web build only BIZ UDPGothic Regular) under the SIL Open Font License 1.1. Those
packages carry each font's licence as OFL-<family>.txt. Builds made with the craft-fonts revision
pinned in .github/workflows/ also include Noto Sans Thai (in the web build too), Copyright 2022
The Noto Project Authors (https://github.com/notofonts/thai), under SIL OFL 1.1; its licence is
fonts/noto-sans-thai/OFL.txt in the craft-fonts build input.
- hayro (rendering, via crates.io) — Apache-2.0 OR MIT. Its `embed-fonts` feature bundles the Foxit
standard-14 Type 1 fonts under BSD-3-Clause ("Copyright 2014 PDFium Authors"), and hayro-cmap bundles
Adobe CMap resources under BSD-3-Clause.
- lopdf (bootstrap document inspection, via crates.io) — MIT.
- egui default fonts (epaint_default_fonts, via eframe) — Ubuntu Light (Ubuntu Font Licence 1.0),
Hack (MIT / Bitstream Vera licence), Noto Emoji (SIL OFL 1.1), emoji-icon-font (MIT).
- Colour profile in hayro-interpret — CGATS001Compat-v2-micro.icc (CC0-1.0, Clinton Ingram).
Required notices:
Foxit standard-14 substitute fonts (vendor/hayro-interpret/assets/*.pfb):
Copyright 2014 PDFium Authors. All rights reserved. Original code copyright 2014 Foxit Software Inc.
Redistributed under the BSD-3-Clause licence in vendor/hayro-interpret/assets/LICENSE_FOXIT.
CMap resources (bundled by hayro-cmap; character-mapping data, not visual assets):
Copyright 1990-2023 Adobe. All rights reserved. Redistributed under the BSD-3-Clause licence
(https://github.com/adobe-type-tools/cmap-resources/blob/master/LICENSE.txt). Neither the name of
Adobe nor the names of its contributors are used to endorse or promote this product.
Showcase PDF (built by `cargo xtask demo-pdf`, not committed): fonts are downloaded at build time from
google/fonts at a pinned commit, verified by SHA-256, all under the SIL Open Font License 1.1 — see the
"Downloaded at build time" table in ATTRIBUTION.md.
Asset licences are not visible to cargo-deny; keep this file current whenever assets or asset-bundling
dependencies change (plan/adr/0002, 0006).
Vendored (vendor/, patched; see vendor/README.md):
- hayro 0.7.1 — Apache-2.0 OR MIT, Copyright the hayro authors (licence files kept in vendor/hayro).
- hayro-interpret 0.7.0 — Apache-2.0 OR MIT, Copyright the hayro authors (LICENSE-APACHE, LICENSE-MIT kept in vendor/hayro-interpret).
Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

+123
View File
@@ -0,0 +1,123 @@
{
"manifest_version": "0.3",
"name": "pdfcraft-mcp",
"display_name": "PdfCraft for Claude",
"version": "0.2.0",
"description": "PDFs öffnen, auslesen, schwärzen, bereinigen, zusammenführen und mit Seitenzahlen/Wasserzeichen versehen. CLI 0.14.0. Benötigt PdfCraft aus dem ArtCraft-Launcher unter C:\\Program Files\\PdfCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"icon": "icon.png",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\PdfCraft\\pdfcraft-cli.exe",
"args": [
"mcp",
"--compact",
"--automation-read-root",
"${user_config.read_root}",
"--automation-write-root",
"${user_config.write_root}"
]
}
},
"tools": [
{
"name": "doc_open",
"description": "Open a PDF file and return its document id, page count and whether it can be edited."
},
{
"name": "doc_info",
"description": "Metadata, page sizes and labels, bookmarks, annotations, form fields, links, layers, page transitions and display times, attachments, fonts, security and repair notes."
},
{
"name": "doc_save",
"description": "Save to its own file (an incremental update, which keeps signatures valid) or to a new path (a full rewrite)."
},
{
"name": "doc_close",
"description": "Close a document."
},
{
"name": "page_render",
"description": "Render one page to a PNG image (default 96 dpi, at most 600)."
},
{
"name": "text_extract",
"description": "Extract the text of some or all pages, in reading order."
},
{
"name": "text_find",
"description": "Find a phrase (case-insensitive, whitespace-normalised) and return matches in page order with page and line rectangles in points (origin top-left)."
},
{
"name": "doc_combine",
"description": "Combine files, in order, into one PDF (bookmarks are kept under one entry per file)."
},
{
"name": "doc_split",
"description": "Split into several files written to out_dir: every N pages, before given pages, at top-level bookmarks (bookmarks: true; files named after them, repeated titles get -2, -3), or by file size (max_mb)."
},
{
"name": "edit_undo",
"description": "Undo the last edit of a document."
},
{
"name": "command_list",
"description": "Every registered PdfCraft command with its menu, shortcut, whether it is enabled now, and the tool that automates it."
},
{
"name": "command_run",
"description": "Run a registry command through its headless tool."
},
{
"name": "command_batch",
"description": "Run steps in order (at most 1000)."
},
{
"name": "doc_inspect",
"description": "With doc, return doc_info; otherwise return information for every open document (empty documents array when none are open)."
},
{
"name": "render_preview",
"description": "Render a PNG bounded by max_side (default 1024), without changing or saving the document."
},
{
"name": "tool_search",
"description": "Search and list all PdfCraft automation tools, including the core tools, with a one-sentence description each."
},
{
"name": "tool_call",
"description": "Run any PdfCraft tool by name with its arguments, exactly as if it were called directly."
}
],
"user_config": {
"read_root": {
"type": "directory",
"title": "Lese-Ordner",
"description": "Hier darf Claude Dateien lesen. Ruhig weit fassen (z. B. Dokumente); der Schreib-Ordner sollte darin liegen, damit Ergebnisse wieder geöffnet werden können.",
"required": true,
"default": "${HOME}/Documents"
},
"write_root": {
"type": "directory",
"title": "Schreib-Ordner",
"description": "Nur hier darf Claude speichern. Eng fassen, eigener Ordner, z. B. Dokumente\\Claude.",
"required": true,
"default": "${HOME}/Documents/Claude"
}
}
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Installiere PdfCraft ueber den ArtCraft-Launcher.
Erwarteter Pfad: C:\Program Files\PdfCraft\pdfcraft-cli.exe
@@ -0,0 +1 @@
{"version":"0.14.0","repository":"https://github.com/storytold/pdfcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"pdfcraft-cli.exe","path":"C:\\Program Files\\PdfCraft\\pdfcraft-cli.exe","tag":"v0.14.0","sha256":"bdd19e35f2f8bf4da75144545a1059fc9abcf499389313254adc13947e44ecaf"}
+19
View File
@@ -0,0 +1,19 @@
# Changelog – solidcraft-mcp
## 0.3.0 (2026-10-26)
- CLI 0.23.0. Kantenwahl lehnt Punkte ab, die weiter als 5 % der Körpergröße von jeder Kante liegen. Mitgelieferte Skills über `skill_reference`: modeling, mechanisms, editing, checking (Checking-Text gegen 0.21.0).
- Neue Werkzeuge: `describe_command`, `crash_reports`, `pending`, `running`, `skill_reference`. Export zusätzlich OBJ und ASCII-STL.
- `--connect 127.0.0.1:PORT` steuert die App (`solidcraft --control PORT`). Ohne laufende App scheitern die Entwurfswerkzeuge; `skill_reference` bleibt. Die Erweiterung startet weiter kopflos mit zwei `--allow-path`. `solvecraft-cli.exe` ist nur noch ein Alias.
- Laser-DXF bleibt bei VectorCraft. Die SolidCraft-Hilfe nennt CADCraft nicht.
## 0.2.0 (2026-10-20)
- Befehlserklärungen zu SolidCraft 0.16.2: Nut vor dem Einstieg bei gleicher Startebene und gleichem Außenradius (`boolean Cut: no result` — Einstieg zuerst, die Nut ein Stück hinein und etwas flacher); `sketch.circle.center` lehnt einen Ausdruck in `diameter` ab (`needs radius or diameter`), Zahl plus `sketch.dimension` mit `type: diameter`, `solid.cylinder` nimmt Ausdrücke; `solid.revolve` mit `angle` dreht von der Skizzierebene nach −Y; ein Kreismuster solcher Schnitte kann `Boolean retry: tool displacement` um etwa 4e-4 mm warnen, das Volumen bleibt in der Toleranz.
- `solid.combine` mit `intersect` auf leerer Überdeckung löscht den Zielkörper und meldet trotzdem Erfolg. Vorher `inspect.interference`.
## 0.1.0 (2026-10-20)
- Erste Version: Skill und Claude-Desktop-Erweiterung für SolidCraft 0.16.2. SolidCraft kommt über den eigenen Installer (`C:\Program Files\SolidCraft\solidcraft-cli.exe`, nicht auf PATH), nicht über den ArtCraft-Launcher.
- Lese- und Schreib-Ordner sind Pflicht und werden beide als `--allow-path` übergeben. Der Server läuft ohne Fenster. Kein `--connect`, kein `--allow-any-path`.
- Cursor-Plugin `solidcraft-mcp-cursor-v0.1.0.zip` (Server `solidcraft`) inkl. Deeplink; die Ordner-Argumente werden übernommen.
+90
View File
@@ -0,0 +1,90 @@
# solidcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Baut parametrische 3D-Teile über den MCP-Server von SolidCraft, misst sie und gibt sie als .solidcraft, STEP, STL, OBJ oder 3MF aus. CLI 0.23.0. Der Quader 40×30×20 mm = 24000 mm³ ist an 0.16.2 gemessen, an 0.23.0 nicht wiederholt. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **SolidCraft 0.23.0** über den eigenen Installer, getrennt vom ArtCraft-Launcher: [GitHub Releases](https://github.com/tangency-labs/solidcraft/releases) (MSI) oder `winget install bherbruck.SolidCraft`. CLI: `C:\Program Files\SolidCraft\solidcraft-cli.exe` (nicht auf PATH). `solvecraft-cli.exe` ist nur ein Alias.
- Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `solidcraft-mcp-v0.3.0.mcpb` und `solidcraft-mcp-v0.3.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/solidcraft-mcp%2Fv0.3.0/solidcraft-mcp-v0.3.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren).
3. **Beide Ordner ausfüllen.** Lese-Ordner weit: `Dokumente`. Schreib-Ordner eng: `Dokumente\Claude`. Jeder wird als `--allow-path` übergeben. Fehlt einer, kann der Agent dort nicht speichern.
4. Unter Einstellungen → Erweiterungen prüfen, dass **SolidCraft for Claude** eingeschaltet ist.
5. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
6. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
**Umsteigen von der manuellen Config:** Eintrag `solidcraft` unter `mcpServers` vor der Installation entfernen.
## Ordner und Start
Der Server der Erweiterung bekommt zwei `--allow-path` (Lese-Ordner und Schreib-Ordner) und läuft kopflos. `--allow-path` erlaubt Lesen und Schreiben in dem genannten Ordner. **Kein `--allow-any-path`.**
`--connect 127.0.0.1:PORT` ist der andere Start: er steuert die laufende App (`solidcraft --control PORT`). Die Erweiterung setzt ihn nicht. Eine Cursor-`mcp.json` kann ihn trotzdem setzen, zusammen mit `--allow-path`. Lauscht die App nicht, scheitern die Entwurfswerkzeuge mit `no SolidCraft app is listening`; `skill_reference` geht weiter. Port 7878 ist der Port aus dieser Konfiguration, kein zweiter Standard neben dem, den der Nutzer an `--control` übergibt.
| | Standard |
|---|---|
| Lesen | `${HOME}/Documents` |
| Schreiben | `${HOME}/Documents/Claude` |
## Freigaben
In Claude bei `open`, `save` und `export` auf **„Immer fragen“** lassen, wenn du Pfade mitkontrollieren willst.
## Enthaltene Software
Die Erweiterung steuert [SolidCraft](https://github.com/tangency-labs/solidcraft) (MIT oder Apache-2.0) aus dem eigenen Installer; die CLI wird **nicht** mitgeliefert. Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. Das Icon ist die App-Kachel 512×512 aus `assets/icons/app/linux/exports/hicolor/512x512/apps/ai.storyteller.solidcraft.png` (Tag v0.16.2, ebenfalls MIT oder Apache-2.0).
## Test
Neuen Chat öffnen und einen Quader 40×30×20 mm bauen lassen. Das Volumen muss 24000 mm³ sein. Präfix `…SolidCraft_for_Claude…`.
Fehlen die Tools: Erweiterung eingeschaltet? CLI unter `C:\Program Files\SolidCraft\solidcraft-cli.exe`? Neu starten, neuer Chat.
## Stolpersteine
- Speichern scheitert, weil der Pfad außerhalb der erlaubten Ordner liegt: beide Ordner unter Einstellungen → Erweiterungen → SolidCraft for Claude setzen.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
Statt der Erweiterung in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"solidcraft": {
"command": "C:\\Program Files\\SolidCraft\\solidcraft-cli.exe",
"args": [
"mcp",
"--allow-path", "C:\\Pfad\\zu\\Dokumente",
"--allow-path", "C:\\Pfad\\zu\\Dokumente\\Claude"
]
}
}
}
```
Beide `--allow-path` setzen. `--allow-any-path` weglassen. `--connect 127.0.0.1:PORT` nur, wenn die App mit `solidcraft --control PORT` läuft.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+107
View File
@@ -0,0 +1,107 @@
---
name: solidcraft-mcp
description: parametrische 3D-Teile über den SolidCraft-MCP-Server bauen, ändern, messen und als .solidcraft, STEP, STL, OBJ oder 3MF ausgeben. Verwenden, wenn SolidCraft-Werkzeuge verbunden sind oder der Nutzer SolidCraft nennt; typisch für Laschen, Platten, Gehäuse, Bohrbilder, Baugruppen. Nicht für Laser-DXF (VectorCraft), nicht für DXF/DWG-Zeichnungen (CADCraft) und nicht für native SOLIDWORKS-Dateien.
---
# Parametrische Teile mit SolidCraft (MCP)
SolidCraft ist ein Open-Source-CAD (Rust) für parametrische Volumenkörper. CLI 0.23.0. Die mitgelieferten Skills (`skill_reference`) sind die Befehlsreferenz; dieser Text hält nur die Regeln fest, die davon abweichen oder die der Agent sonst falsch macht. Nur `solidcraft-cli.exe` starten. `solvecraft-cli.exe` ist ein Alias und fällt weg.
## Voraussetzung
Die Werkzeuge `list_commands`, `execute`, `batch`, `inspect_design`, `measure`, `screenshot`, `export`, `open`, `save` … müssen verbunden sein. Ihr Präfix hängt vom Client ab. Fehlen sie, dem Nutzer sagen, dass der Server nicht verbunden ist (Einrichtung siehe README).
Zwei Starts, beides ist `solidcraft-cli mcp`:
- **Kopflos**, ohne `--connect` (optional `--headless`). Der Server rechnet im eigenen Prozess. `--allow-path` (mehrfach) begrenzt Lesen und Schreiben. Das ist der Start der Erweiterung.
- **An der App:** `--connect 127.0.0.1:PORT` (optional `--token`). Die App muss mit `solidcraft --control PORT` lauschen. Tut sie das nicht, antworten Entwurfswerkzeuge mit `no SolidCraft app is listening at 127.0.0.1:7878`. `skill_reference` liest trotzdem, die Skills stecken in der CLI. `--connect` ist nötig, wenn der Nutzer die offene Datei in der App sehen und anfassen soll. Für einen neuen Teil im Hintergrund reicht kopflos.
Lauscht die App nicht, nicht im Kreis wiederholen. Dem Nutzer sagen, dass `solidcraft --control 7878` fehlt, oder kopflos neu starten.
## Mitgelieferte Skills
Vor dem Bauen `skill_reference` lesen, nicht den Befehlskatalog auswendig lernen. `file` ist `SKILL.md` oder `reference.md` (Standard `reference.md`).
| Skill | Wann |
|---|---|
| `solidcraft-modeling` | neues Teil |
| `solidcraft-mechanisms` | Baugruppe, Gelenk, Zahnrad, Kurve, Kontakt, Bewegungsstudie |
| `solidcraft-editing` | bestehende Datei ändern, Checkpoint, Absturz |
| `solidcraft-checking` | Parameterbereiche, jeder zulässige Wert, STEP-Vergleich, Portierung aus build123d, CadQuery oder OpenSCAD. Der Text in der CLI nennt die Prüfung gegen 0.21.0 |
## Werkzeuge
| Tool | Zweck |
|---|---|
| `list_commands {filter}` | Befehlskatalog. Nur mit Filter; ohne Filter über 100 KB |
| `describe_command {id}` | Parameter eines Befehls; für `solid.box`, `solid.extrude` und `engine.describe` auch JSON Schema |
| `execute {command, params, verbose}` | ein Befehl; ein Fehler lässt den Entwurf unverändert |
| `batch {commands, verbose}` | Schritte der Reihe nach; beim ersten Fehler wird der Stapel zurückgenommen |
| `inspect_design` | Parameter, Zeitachse, Körper, Skizzen, Gelenke |
| `measure` | Volumen (mm³), Fläche, Schwerpunkt, Hüllbox |
| `body_topology {body}` | Kanten (Mittelpunkt) und Flächen |
| `set_parameter {name, value}` | Parameter anlegen oder ändern |
| `screenshot` | PNG. Immer `source: "model"`, wenn die App verbunden ist |
| `export {path, format}` | step, 3mf, 3mf-tagged, stl, stla, obj, urdf |
| `open {path}` / `save {path}` | .solidcraft, STEP, Netz (.3mf, .stl, .obj, .glb, .gltf). `save` nach `.json` ist Klartext |
| `new_design` | leerer Entwurf |
| `undo` / `redo` | ein Schritt |
| `crash_reports` | Absturzberichte auf diesem Rechner. Den auslösenden Befehl nicht unverändert wiederholen |
| `running` | was die App gerade rechnet. Fragen, wenn ein Aufruf hängt, bevor derselbe Befehl noch einmal geht |
| `pending` | Ergebnis eines Aufrufs, der mit `still running:` zurückkam. Nicht noch einmal senden |
| `skill_reference` | mitgelieferte Skills, siehe oben |
## Arbeitsweise
1. **Zuerst `skill_reference`**, dann rechnen: Parameter, Lage (Teil um den Ursprung), für jede Kante oder Fläche den Weltpunkt, erwartetes Volumen und die Hüllbox.
2. **Wenige große `batch`-Aufrufe.** Ein Stapel ist alles oder nichts (`failed.index`, `failed.error`). Einen riskanten Schritt allein schicken.
3. **Danach `measure`** gegen die eigene Rechnung. Volumen, Hüllbox und Flächenzahl (`faces`, nicht `kernel.faces`). Eine Lücke von etwa 0,001–0,01 % gilt als Treffer; lange flache Bögen etwa 0,1 %.
4. **Kanten** über den exakten Mittelpunkt wählen, als nackte Zahlen. Die senkrechte Eckkante eines zentrierten Quaders liegt bei `[w/2, d/2, h/2]`.
5. In großen Entwürfen `"verbose": false`.
Längen sind mm. Winkel in Ausdrücken brauchen eine Einheit, z. B. `"30 deg"`.
## Fallen
- **Ein Schnitt kann Erfolg melden und das Volumen unverändert lassen.** An 0.16.2 gemessen, an 0.23.0 nicht wiederholt: `solid.box` 40×30×20 mm ergab 24000 mm³. Ein `solid.cylinder` mit `operation: "cut"` daneben ließ das Volumen stehen. Nur ein `measure`, das zur Rechnung passt, zählt. Die mitgelieferte Anleitung sagt dasselbe für eine Bohrung, deren Skizze in der Luft liegt.
- **Kantenwahl:** weiter als 5 % der Körpergröße von jeder Kante entfernt wird abgelehnt (`the nearest edge is 15.000 mm away`). Es gibt keine stille Schnappwahl mehr ohne Schranke. Den Mittelpunkt aus der Geometrie rechnen. Eine Wahl ist eine nackte Zahl, wird einmal aufgelöst und folgt danach ihrer Kante.
- **Außen verrunden, bevor geschält wird,** damit die Schale den Rundungen folgt. Ausnahme: eine Kante der Fläche, die die Schale entfernt. Die mitgelieferte Anleitung nennt eine zweite Ausnahme: eine Verrundung zwischen zwei gekrümmten Flächen vor der Schale scheitert (`offset: only bodies with planes, cylinders, cones, spheres and tori`).
- **Eine nackte Zahl folgt keinem Parameter.** Was mitziehen soll, steht in einer Skizzenbemaßung oder einem Ausdruck.
- **`new_design` und `open` verwerfen ungespeicherte Arbeit.** Hat der Entwurf Features auf der Zeitachse, vorher fragen.
- **Screenshot mit `source: "model"`.** Ohne `source` liefert ein mit der App verbundener Server das Fenster, und `view` dreht dessen Kamera.
- **Nut vor dem Einstieg, gleiche Startebene und gleicher Außenradius** (0.16.2): der zweite `solid.revolve` mit `cut` meldet `boolean Cut: the operation failed: no result`. Einstieg zuerst.
- **`sketch.circle.center` nimmt im Feld `diameter` keinen Ausdruck** (`needs radius or diameter`). Zahl plus `sketch.dimension` mit `type: diameter`.
- **`solid.revolve` mit `angle` dreht von der Skizzierebene in die negative Winkelrichtung** (von +X nach −Y). `direction: symmetric` legt den Winkel um die Ebene.
- **Ein Kreismuster solcher Schnitte kann `Boolean retry: tool displacement` um etwa `4e-4` mm warnen.** Das Volumen an 0.16.2 blieb in der Toleranz. Die Checking-Anleitung sagt, eine Boolean-Warnung kann die Geometrie trotzdem falsch lassen: Volumen prüfen.
- **Überdeckung:** `solid.combine` mit `intersect` auf leerer Überdeckung löscht den Zielkörper und meldet trotzdem Erfolg. Zum Prüfen `inspect.interference`.
- **Absturz:** `crash_reports`, dann `doc.recovery_list` und `doc.recover`. Den abstürzenden Befehl nicht unverändert wiederholen. Vor riskanten Änderungen an einer bestehenden Datei `edit.checkpoint`.
## Rezepte
1. **Grundplatte mit Bohrbild:** Parameter, ein `batch` (Skizze auf `XY`, Extrusion, Verrundung über Mittelpunkte innerhalb der 5-%-Schranke, Bohrung, Muster mit Ausdrücken), `measure`, `set_parameter`, erneut `measure`, `save` als `.solidcraft`, `export` als STEP.
2. **Kleines Gehäuse:** Kasten, Außenkanten verrunden, Schale, Rand der Öffnung danach runden, `measure` nach jedem Schritt.
3. **Baugruppe:** nicht hier nachbauen. `skill_reference {"skill":"solidcraft-mechanisms","file":"SKILL.md"}`, dann erst Gelenke. URDF lässt Gelenke weg, die eine Schleife schließen.
4. **Vorhandenes STEP nur ansehen:** `open` nur mit Zustimmung. `measure`, ein Bild `screenshot {source: "model", view: "iso"}`. Nichts ändern, solange der Nutzer nur messen will.
## Abschlussprüfung
- `measure` passt zum selbst gerechneten Volumen, zur Hüllbox und zur Flächenzahl.
- `inspect_design` mit `measure: false` und `sketches: false`: kein `error` in der Zeitachse. Eine Boolean-Warnung nennen; stimmt das Volumen nicht, ist die Geometrie falsch, auch ohne Fehlerzeile.
- Ein `screenshot` mit `source: "model"` angesehen.
- Pfade von `.solidcraft` und Export dem Nutzer genannt.
## Datenschutz
Ampel:
- Grün: allgemeine und technische Inhalte ohne Kundenbezug.
- Gelb: Projekt- und Geschäftsinfos, nur nach Abwägung oder anonymisiert.
- Rot: personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
Ein Kunden-STEP mit Kundenname oder NDA-Vermerk ist rot: nur mit Zustimmung des Nutzers öffnen.
## Grenzen
- Kein SLDPRT und kein SLDASM.
- Kein Ersatz für eine freigegebene Fertigungszeichnung.
- 2D-DXF für Laser bleibt bei VectorCraft. Die SolidCraft-Hilfe nennt CADCraft nicht; DXF/DWG als Zeichnung mit AutoCAD-Befehlen ist CADCraft, nicht dieser Skill.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 SolidCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,36 @@
SolidCraft
Copyright (c) 2026 SolidCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
Third-party material
Software dependencies are listed in Cargo.lock; their licences are in THIRD-PARTY-LICENSES.txt
(`cargo xtask licences`), which the programs also carry (Help > About > Licences,
`solidcraft-cli licences`). The geometry kernel builds on the truck crates
(truck-modeling, truck-shapeops, truck-meshalgo, truck-stepio, truck-topology and their
dependencies, https://github.com/ricosjp/truck), licensed under the Apache License 2.0 and used
as libraries. truck-shapeops 0.4.0 is vendored in vendor/truck-shapeops with SolidCraft
modifications (listed in vendor/README.md and marked in the source); its licence is in
vendor/truck-shapeops/LICENSE. Copyright (c) RICOS Co. Ltd.
Some code is adapted from sibling projects in the storytold family (CADCraft, GridCraft), which are
licensed MIT OR Apache-2.0; ATTRIBUTION.md lists the files.
The release packaging (.github/workflows/release.yml, packaging/) is adapted from PhotoCraft
(https://github.com/storytold/photocraft), licensed under the Apache License 2.0.
The incremental Radiance RGBE row adapter in crates/render/src/lighting/hdr.rs adapts
decoding state machines from image 0.25.10 (https://github.com/image-rs/image),
MIT OR Apache-2.0. ATTRIBUTION.md describes the bounded/cancellable changes; the
original licence texts are included in THIRD-PARTY-LICENSES.txt.
Most bundled assets are drawn in code or contributed originally; third-party fonts (Liberation Sans
for sketch text, BIZ UDPGothic for web Japanese display) are licensed under SIL OFL 1.1. The
per-file list is in ATTRIBUTION.md.
SolidCraft is an independent project and is not affiliated with, sponsored by or endorsed by
Autodesk, Dassault Systèmes, PTC, Siemens, Blender or any other CAD vendor. Fusion, AutoCAD,
Inventor, Alias and Tinkercad are trademarks of Autodesk, Inc.; SolidWorks is a trademark of
Dassault Systèmes; Onshape and Creo are trademarks of PTC; Blender is a trademark of the Blender
Foundation. Product names appear only to describe compatibility, such as the mouse navigation
presets in Preferences › Navigation and file formats from public specifications.
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@@ -0,0 +1,110 @@
{
"manifest_version": "0.3",
"name": "solidcraft-mcp",
"display_name": "SolidCraft for Claude",
"version": "0.3.0",
"description": "Parametrische 3D-Teile bauen, ändern, messen und als STEP, STL, OBJ oder 3MF ausgeben. CLI 0.23.0. Benötigt SolidCraft aus dem eigenen Installer unter C:\\Program Files\\SolidCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"icon": "icon.png",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\SolidCraft\\solidcraft-cli.exe",
"args": [
"mcp",
"--allow-path",
"${user_config.read_root}",
"--allow-path",
"${user_config.write_root}"
]
}
},
"tools": [
{
"name": "list_commands",
"description": "Command catalog: id, label, tab/panel, shortcut, parameter docs, enabled now. filter matches id, label, tab and panel."
},
{
"name": "execute",
"description": "Run any command with JSON parameters. Failures leave the design unchanged."
},
{
"name": "batch",
"description": "Run steps in order, stop at the first error and undo the completed steps."
},
{
"name": "inspect_design",
"description": "Parameters, timeline, bodies, sketches, selection and undo depth."
},
{
"name": "measure",
"description": "Volume (mm3), area, centre of mass, bounding box and topology counts per body, with totals."
},
{
"name": "body_topology",
"description": "Edges (midpoint, length, ends) and faces (name, point, centroid) of one body."
},
{
"name": "set_parameter",
"description": "Create or change a user parameter and recompute."
},
{
"name": "screenshot",
"description": "A PNG image of a named view or camera. Pass source model so width and height apply."
},
{
"name": "export",
"description": "STEP, 3MF or mesh export; URDF writes the assembly with its meshes."
},
{
"name": "open",
"description": "Open a .solidcraft design, a STEP file as bodies, or a 3MF/STL file as mesh bodies."
},
{
"name": "save",
"description": "Save the design, to its current file when path is omitted."
},
{
"name": "new_design",
"description": "Start an empty design."
},
{
"name": "undo",
"description": "Undo one change."
},
{
"name": "redo",
"description": "Redo one change."
}
],
"user_config": {
"read_root": {
"type": "directory",
"title": "Lese-Ordner",
"description": "Erlaubter Ordner, weit fassen (z. B. Dokumente). Beide Ordner ausfüllen, sonst kann der Agent dort nicht speichern.",
"required": true,
"default": "${HOME}/Documents"
},
"write_root": {
"type": "directory",
"title": "Schreib-Ordner",
"description": "Zweiter erlaubter Ordner, eng fassen, z. B. Dokumente\\Claude. Wird als weiteres --allow-path übergeben.",
"required": true,
"default": "${HOME}/Documents/Claude"
}
}
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Installiere SolidCraft ueber den eigenen Installer.
Erwarteter Pfad: C:\Program Files\SolidCraft\solidcraft-cli.exe
@@ -0,0 +1 @@
{"version":"0.23.0","repository":"https://github.com/tangency-labs/solidcraft","bundled":false,"source":"SolidCraft-Installer","exe":"solidcraft-cli.exe","path":"C:\\Program Files\\SolidCraft\\solidcraft-cli.exe","tag":"v0.23.0","sha256":"3a8ad3262b659df64df7fa962309807eca400b31df352eb7f4a353381a32e3cb"}
+13
View File
@@ -0,0 +1,13 @@
# Changelog – vectorcraft-mcp
## 0.2.0 (2026-10-26)
- CLI 0.17.0. Lesbar zusätzlich .drawcraft, .psd, .psb, .af, .afdesign, .afpub; schreibbar unter anderem .psd. DWG steht in keiner der beiden Listen.
- `mcp` ohne Ordner-Flags versucht zuerst 127.0.0.1:7979 und fällt sonst auf kopflos zurück. Ordner-Flags erzwingen kopflos.
## 0.1.0 (2026-10-19)
- Erste Version: Skill und Claude-Desktop-Erweiterung für VectorCraft 0.13.1 aus dem ArtCraft-Launcher (`C:\Program Files\VectorCraft\vectorcraft-cli.exe`, nicht auf PATH).
- Lese- und Schreib-Ordner sind Pflicht. Ohne sie versucht der Server zuerst, eine laufende App auf `127.0.0.1:7979` zu erreichen; mit beiden Ordnern läuft er ohne Fenster.
- Der Schreib-Ordner muss im Lese-Ordner liegen, sonst lassen sich eigene Ergebnisse nicht wieder öffnen. Standard: Lese = Dokumente, Schreib = Dokumente\Claude.
- Cursor-Plugin `vectorcraft-mcp-cursor-v0.1.0.zip` (Server `vectorcraft`) inkl. Deeplink; die Ordner-Argumente werden übernommen.
+88
View File
@@ -0,0 +1,88 @@
# vectorcraft-mcp
[Alle Skills](../../README.md)
## Zweck
Zeichnet Vektorgrafiken über den MCP-Server von VectorCraft und exportiert sie als SVG, PDF oder DXF. CLI 0.17.0 (Typenschilder und DXF für Laser am 0.13.1 geprüft). Öffnet auch PSD und Affinity. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen
- **VectorCraft** über den ArtCraft-Launcher (`C:\Program Files\VectorCraft\vectorcraft-cli.exe`, im MSI enthalten, nicht auf PATH)
- Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
**Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `vectorcraft-mcp-v0.2.0.mcpb` und `vectorcraft-mcp-v0.2.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/vectorcraft-mcp%2Fv0.2.0/vectorcraft-mcp-v0.2.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren).
3. **Lese-Ordner weit:** `Dokumente`. **Schreib-Ordner eng und darin:** `Dokumente\Claude`. VectorCraft lehnt es ab, eine selbst geschriebene Datei wieder zu öffnen, wenn der Schreib-Ordner außerhalb des Lese-Ordners liegt.
4. Unter Einstellungen → Erweiterungen prüfen, dass **VectorCraft for Claude** eingeschaltet ist.
5. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
6. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
**Umsteigen von der manuellen Config:** Eintrag `vectorcraft` unter `mcpServers` vor der Installation entfernen.
## Ordner und Start
Ohne Lese- und Schreib-Ordner versucht der Server zuerst, eine laufende App auf `127.0.0.1:7979` zu erreichen. Mit beiden Ordnern läuft er ohne Fenster. Deshalb nie ohne die Ordner-Argumente starten. Die Cursor-Übersetzung übernimmt dieselben Argumente.
| | Standard |
|---|---|
| Lesen | `${HOME}/Documents` |
| Schreiben | `${HOME}/Documents/Claude` |
## Freigaben
In Claude bei `open_file`, `save_file` und `export` auf **„Immer fragen“** lassen, wenn du Pfade mitkontrollieren willst.
## Enthaltene Software
Die Erweiterung steuert [VectorCraft](https://github.com/storytold/vectorcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. Das Icon ist die App-Kachel aus `assets/app-icon/` (512×512, ebenfalls MIT oder Apache-2.0).
## Test
Neuen Chat öffnen und ein Typenschild 100×50 mm als DXF exportieren lassen. Im CAD prüfen, ob die Maße 100×50 mm sind. Präfix `…VectorCraft_for_Claude…`.
Fehlen die Tools: Erweiterung eingeschaltet? CLI unter `C:\Program Files\VectorCraft\vectorcraft-cli.exe`? Neu starten, neuer Chat.
## Stolpersteine
- „path rejected“ oder die gespeicherte Datei lässt sich nicht wieder öffnen: Schreib-Ordner liegt nicht im Lese-Ordner. Einstellungen → Erweiterungen → VectorCraft for Claude.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update
Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
## Alternative: manuell (für Entwickler)
Statt der Erweiterung in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"vectorcraft": {
"command": "C:\\Program Files\\VectorCraft\\vectorcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root", "C:\\Pfad\\zu\\Dokumente",
"--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\Claude"
]
}
}
}
```
Die Ordner-Argumente nicht weglassen, sonst spricht der Server zuerst `127.0.0.1:7979` an.
## Änderungen
[CHANGELOG.md](CHANGELOG.md)
+84
View File
@@ -0,0 +1,84 @@
---
name: vectorcraft-mcp
description: Vektorgrafiken über den VectorCraft-MCP-Server zeichnen, bearbeiten und als SVG, PDF, DXF, EPS, PNG exportieren (Illustrator-Klon); öffnet auch DXF, SVG, PDF, AI, EPS, PSD, Affinity (.af, .afdesign, .afpub). Verwenden, wenn VectorCraft-Werkzeuge verbunden sind oder der Nutzer VectorCraft nennt; typisch für Typenschilder und Laser-/Gravurvorlagen als DXF in mm, Hinweisschilder, Piktogramme, Skizzen und Illustrationen für Betriebsanleitungen.
---
# Vektorgrafik mit VectorCraft (MCP)
VectorCraft ist ein Open-Source-Vektorprogramm (Rust), das Illustrator-Parität anstrebt. CLI 0.17.0. Die Maß- und Schriftfallen sind am 0.13.1 bestätigt und an 0.17.0 nicht erneut durchgespielt.
## Voraussetzung
Die Werkzeuge `draw_shape`, `draw_path`, `add_text`, `run_command`, `export`, `render_preview` … müssen verbunden sein. Ihr Präfix hängt vom Client und vom Namen der Erweiterung bzw. des Servers ab (z. B. `mcp__…__VectorCraft_for_Claude__draw_shape`). 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).
Dateizugriff: Lesen nur im Lese-Ordner, Schreiben nur im Schreib-Ordner. Die Ordner-Flags erzwingen den kopflosen Modus. Ohne sie versucht `mcp` zuerst `127.0.0.1:7979` (`vectorcraft --control 7979`) und fällt sonst auf kopflos zurück. Die Werkzeuge `inspect_ui`, `type_text`, `open_panel`, `ui_*` und `screenshot {window: true}` gehen im kopflosen Server nicht.
## Werkzeuge
| Tool | Zweck |
|---|---|
| `run_command {command, params}` | jeder Menübefehl, z. B. `file.new` |
| `list_commands {filter, brief}` | Befehle suchen |
| `draw_shape` | rectangle/ellipse (`x,y,width,height`, `radius`), polygon, star, line (`x1,y1,x2,y2`) |
| `draw_path` | `points: [[x,y],…]` oder SVG-`d`; `closed`, `fill`, `stroke`, `strokeWidth`, `join`, `cap`, `dash` |
| `add_text` | Punkttext (`x,y` = Grundlinie) oder Flächentext (`width,height`); `size`, `font`, `color`, `justify` |
| `set_paint`, `transform`, `pathfinder`, `apply_effect` | Farbe, verschieben/drehen/skalieren, Boolesche Operationen, Effekte |
| `inspect_document {depth}` / `doc_inspect` | Ebenen, Objekte, Begrenzungen |
| `render_preview` / `screenshot` | Zeichenfläche als PNG |
| `open_file` / `save_file` / `export` | lesen u. a. .vectorcraft, .drawcraft, .svg, .pdf, .ai, .eps, .dxf, .psd, .psb, .af, .afdesign, .afpub; schreiben u. a. .vectorcraft, .svg, .pdf, .ai, .dxf, .eps, .psd, .png |
| `undo` / `redo` | Verlauf |
## Arbeitsweise
1. **Neues Dokument in mm-Größe:** `run_command {command: "file.new", params: {name, width: "100 mm", height: "50 mm", units: "Millimeters"}}`. Ohne `file.new` ist das Format US-Letter (612 × 792 pt).
2. **Koordinaten sind immer Punkt**, auch wenn die Einheit auf mm steht. Umrechnen: `pt = mm × 72 / 25,4` (1 mm = 2,8346 pt). Ursprung oben links, y nach unten.
3. **Befehle nie raten:** `list_commands {filter: "…", brief: true}`.
4. **Ansehen:** `render_preview {max_side: 1000}`. Für scharfe Bilder lieber `export {format: "png", scale: 3}`.
5. **Speichern** als `.vectorcraft` unter neuem Namen, dann in das Zielformat exportieren.
## Fallen (im Test bestätigt)
- **`add_text {y}` ist die Grundlinie**, nicht die Oberkante. Die Schrift ragt um etwa 0,7 × `size` nach oben.
- **Schriften:** Fehlt eine Schrift (z. B. `Helvetica-Bold`), wird still auf „Source Sans 3“ ausgewichen; der Export meldet das in `warnings`. Unter Windows z. B. `Arial` verwenden und die Warnungen beim Export lesen. `run_command text.fontList` listet die vorhandenen Schriften.
- **DXF für Laser/Gravur:**
- `export {format: "dxf", path}` schreibt im Maßstab 1:1 in mm (`$INSUNITS` = mm), y nach oben, Ursprung unten links. Im Test hatte ein 100 × 50 mm großes Schild genau 0–100 × 0–50.
- Text wird als Kontur geschrieben, Kreise als echte CIRCLE.
- Flächen bekommen zusätzlich Schraffuren (HATCH). Für Laser- und CAD-Programme ggf. `run_command document.exportDxf {path, version: "R12"}` ohne Schraffuren, oder `preserve: "editability"`, wenn Text als Text bleiben soll.
- **SVG:** Text bleibt `<text>` (Schrift muss beim Empfänger vorhanden sein). Mit `outlineText: true` wird er zu Pfaden; das ist für die Weitergabe sicherer.
- **Lese-/Schreib-Ordner getrennt:** Eine Datei im Schreib-Ordner kann nur wieder geöffnet werden, wenn der Schreib-Ordner im Lese-Ordner liegt.
- `open_file` öffnet ein **neues** Dokument und macht es aktiv; Befehle wirken auf das aktive Dokument.
## Rezepte
1. **Typenschild (DXF für Laser/Gravur, PDF zur Freigabe):**
1. `file.new` in Schildgröße.
2. Kontur mit `draw_shape rectangle {radius}`, Bohrungen als `ellipse`, eine Trennlinie.
3. Texte zeilenweise mit `add_text` (Hersteller, Typ, Serien-Nr., Baujahr, Spannung/Frequenz, Strom, Schutzart, Gewicht).
4. `render_preview` ansehen.
5. Speichern, dann `export` als PDF und DXF.
Pflichtangaben nach Maschinenrichtlinie/Maschinenverordnung und das CE-Zeichen in Originalproportionen gibt der Nutzer vor; nicht selbst ergänzen.
2. **Hinweis-/Warnschild:** Dreieck mit `draw_path {closed, join: "round"}`, Symbol aus einfachen Formen, Text darunter mit `justify: "center"`. Export als SVG (für WordCraft-Dokumente) und PNG `scale: 3`.
3. **Grafik für die Betriebsanleitung:** DXF/PDF vom Konstrukteur mit `open_file` öffnen, Beschriftungen, Pfeile und Positionsnummern ergänzen, als SVG/PNG exportieren.
## Abschlussprüfung
- `render_preview` angesehen: Texte innerhalb der Kontur, nichts verdeckt.
- Export-`warnings` gelesen (Schriftersatz, nicht unterstützte Effekte).
- Bei DXF: Maße im Ergebnis plausibel (Breite × Höhe in mm), dem Nutzer Version und Einheit nennen.
- Pfade der gespeicherten Dateien dem Nutzer genannt.
## Datenschutz
Ampel:
- 🟢 Allgemeine und technische Inhalte ohne Kundenbezug.
- 🟡 Projekt- und Geschäftsinfos: nur nach Abwägung oder anonymisiert.
- 🔴 Personenbezogene Daten und NDA-Inhalte gehören nicht in die Cloud-KI.
Kundenzeichnungen (DXF/PDF) mit Kundenname oder NDA-Vermerk sind 🔴: nur mit Zustimmung des Nutzers öffnen.
## Grenzen
- **Keine zertifizierten Sicherheitszeichen.** Selbst gezeichnete Warnschilder sind Entwürfe. Für die Maschine die offiziellen ISO-7010-Zeichen verwenden und das dem Nutzer sagen.
- Logos und Marken Dritter nicht nachzeichnen. Eigenes Firmenlogo nur aus einer Datei, die der Nutzer liefert.
- DWG steht weder bei den lesbaren noch bei den schreibbaren Formaten der CLI 0.17.0. DXF bleibt das Austauschformat für Laser und CAD. Ob binäres DXF geöffnet wird, sagt die Hilfe nicht.
@@ -0,0 +1,2 @@
server/*.exe
**/*.exe
@@ -0,0 +1,177 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 ArtCraft Team and the VectorCraft contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,125 @@
VectorCraft
Copyright (c) 2026 ArtCraft Team and the VectorCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
list (author, source, license) is in ASSETS.md.
- Lucide icons (assets/icons/*.svg except dc-*.svg) — ISC License; the icons Lucide derived from Feather are also under the MIT License (Cole Bemis). See assets/icons/LICENSE-lucide.txt.
- Source Sans 3 and Source Serif 4 (assets/fonts/Source*) — SIL Open Font License 1.1. See assets/fonts/OFL-SourceSans3.txt, OFL-SourceSerif4.txt.
- Inter (assets/fonts/Inter-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-Inter.txt.
- JetBrains Mono (assets/fonts/JetBrainsMono-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-JetBrainsMono.txt.
- egui's default fonts, compiled into the app through the epaint_default_fonts crate — Ubuntu Light
(Ubuntu Font Licence 1.0), Hack (MIT), Noto Emoji (SIL Open Font License 1.1) and emoji-icon-font
(MIT). Their license texts ship with that crate.
Rust dependencies (vello_cpu, kurbo, peniko, skrifa, harfrust, usvg, linesweeper, egui, eframe, …) are
fetched through crates.io under their own permissive licenses (mostly MIT and/or Apache-2.0; also
BSD, ISC, Zlib, BSL-1.0 and Unicode-3.0).
JPEG export uses the jpeg-encoder crate (MIT OR Apache-2.0, and the IJG License): this software is
based in part on the work of the Independent JPEG Group.
WebAssembly plug-ins run in the wasmi interpreter (MIT OR Apache-2.0); its wasmparser dependency is
under the Apache License 2.0 with the LLVM exception.
The experimental Windows 7 build (packaging/windows/windows7.ps1) compiles a modified copy of the
windows-link crate 0.2.1 (vendor/windows-link; Microsoft, MIT OR Apache-2.0) that binds CoTaskMemFree
through ole32.dll. Its license texts are in vendor/windows-link and ship in that build's ZIP; every
other build uses the unmodified crate from crates.io.
Builds made with craft-fonts (the CRAFT_FONTS_DIR build option; all official releases) embed the
fonts listed in https://github.com/storytold/craft-fonts/blob/main/ATTRIBUTION.md (BIZ UDPGothic,
Shippori Mincho, BIZ UDMincho, Noto Sans CJK SC and Noto Sans Arabic in the current manifest;
web builds BIZ UDPGothic Regular only) under the SIL
Open Font License 1.1. Their license texts ship with the release packages as OFL-<family>.txt.
PDF import decodes CJK text with Adobe's CMap resources (https://github.com/adobe-type-tools/cmap-resources),
compiled into the app through the hayro-cmap crate under the BSD 3-Clause License:
Copyright 1990-2023 Adobe. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Neither the name of Adobe nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Shared PDF backend
The patched hayro-interpret 0.7.0, hayro-syntax 0.7.2, hayro-jbig2 0.3.0, hayro-cmap 0.1.0
and hayro-postscript 0.1.0 are fetched from https://github.com/storytold/craft-libs at revision
2eca9b3a53a98ac52efed2a27353c6a6927ead10. Their upstream project is
https://github.com/LaurenzV/hayro, licensed MIT OR Apache-2.0. The snapshot retains each
crate's upstream licence files. The patch ledger is at
https://github.com/storytold/craft-libs/blob/2eca9b3a53a98ac52efed2a27353c6a6927ead10/vendor/README.craft-reader.md.
Assets already bundled through Hayro's default features retain their licences:
- Foxit standard-14 substitutes: Copyright 2014 PDFium Authors. All rights reserved.
Original code copyright 2014 Foxit Software Inc. BSD-3-Clause; see
licenses/pdf-backend/hayro-interpret/assets/LICENSE_FOXIT.
- CGATS001Compat-v2-micro.icc: CC0-1.0, Clinton Ingram; see
licenses/pdf-backend/hayro-interpret/assets/CGATS_LICENSE.txt.
- Predefined CMaps: Copyright 1990-2023 Adobe. All rights reserved. BSD-3-Clause,
non-visual character-mapping data; see licenses/pdf-backend/hayro-cmap/LICENSE.txt.
Adobe and contributor names do not endorse or promote this product.
Per-file hashes and sources are recorded in ASSETS.md.
Linux Wayland window decorations
-------------------------------
sctk-adwaita 0.10.1 (https://github.com/PolyMeilex/sctk-adwaita,
commit d5f343c45c04d4a026db57f76760819b7325db00) is used by winit on Linux
for vector window controls. Its title-font features are disabled: no Cantarell
font is embedded by this dependency and no font file is added to this repo.
sctk-adwaita's MIT licence:
MIT License
Copyright (c) 2022 Bartłomiej Maryńczak
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

@@ -0,0 +1,182 @@
{
"manifest_version": "0.3",
"name": "vectorcraft-mcp",
"display_name": "VectorCraft for Claude",
"version": "0.2.0",
"description": "Vektorgrafiken zeichnen und als SVG/PDF/DXF exportieren. Öffnet auch PSD und Affinity. CLI 0.17.0. Benötigt VectorCraft aus dem ArtCraft-Launcher unter C:\\Program Files\\VectorCraft\\.",
"author": {
"name": "Dominic Gundel"
},
"repository": {
"type": "git",
"url": "https://git.gundel.dev/dg/claude-skills.git"
},
"homepage": "https://git.gundel.dev/dg/claude-skills",
"license": "MIT",
"icon": "icon.png",
"compatibility": {
"platforms": [
"win32"
]
},
"server": {
"type": "binary",
"entry_point": "server/README.txt",
"mcp_config": {
"command": "C:\\Program Files\\VectorCraft\\vectorcraft-cli.exe",
"args": [
"mcp",
"--automation-read-root",
"${user_config.read_root}",
"--automation-write-root",
"${user_config.write_root}"
]
}
},
"tools": [
{
"name": "command_list",
"description": "Discover command ids, labels, parameter descriptions and enabled state."
},
{
"name": "command_run",
"description": "Run an engine command by id with its JSON params."
},
{
"name": "command_batch",
"description": "Run steps in order; each edit is its own undo step, or with atomic:true the whole batch is one (named `label`, else after its first edit)."
},
{
"name": "doc_inspect",
"description": "Summary of the active document, including artboards, layer tree, selection and history."
},
{
"name": "render_preview",
"description": "Render an artboard (default the first) as inline PNG without changing the document."
},
{
"name": "ui_inspect",
"description": "Inspect the connected desktop interface; returns a tool error in headless mode."
},
{
"name": "ui_screenshot",
"description": "Capture the connected desktop window as inline PNG; requires a running desktop app."
},
{
"name": "list_commands",
"description": "List VectorCraft commands (id, label, menu path, shortcut, parameter description, enabled state)."
},
{
"name": "run_command",
"description": "Execute any VectorCraft command by id with JSON params (see list_commands for ids and params)."
},
{
"name": "inspect_document",
"description": "Summary of the active document: artboards, layer tree (ids, names, kinds, bounds, fill/stroke), selection, undo history, current tool and default paint."
},
{
"name": "inspect_ui",
"description": "UI state of the running desktop app: tool and options, panels, dialogs, view (zoom/center), window, documents, perf."
},
{
"name": "select_tool",
"description": "Switch the active tool (as clicking it in the Tools panel)."
},
{
"name": "pointer_gesture",
"description": "Drive the active tool with mouse events in document coordinates, exactly like the mouse would (e.g."
},
{
"name": "draw_path",
"description": "Create a path from points ([[x,y],…] or [{x,y,in?:[x,y],out?:[x,y]},…] with Bézier handles) or SVG path data `d`, then apply optional paint, stroke dash/cap/join, opacity, name and live effects."
},
{
"name": "draw_shape",
"description": "Create a live shape and apply optional paint."
},
{
"name": "set_paint",
"description": "Set fill, stroke and/or stroke weight on the selection (or `ids`) and as the default for new art."
},
{
"name": "press_key",
"description": "Send a key press with modifiers, e.g."
},
{
"name": "type_text",
"description": "Type text into the focused widget (text tool, dialog field)."
},
{
"name": "invoke_menu",
"description": "Invoke a menu item by its command id (same ids as list_commands, including UI-only commands like view.zoomIn or window.* in the desktop app)."
},
{
"name": "open_panel",
"description": "Open a panel in the desktop app's dock by id (layers, swatches, stroke, align, pathfinder, transform, …; case-insensitive, display labels like \"Layers\" work too)."
},
{
"name": "screenshot",
"description": "Render the active artboard to PNG and return it as an image (optionally also saving it to `path`)."
},
{
"name": "open_file",
"description": "Open a file as a new, active document: .vectorcraft, .drawcraft, .svg, .svgz, .pdf, .ai, .ait, .png, .jpg, .jpeg, .gif, .webp, .tif, .tiff, .bmp, .tga, .vda, .icb, .vst, .psd, .psb, .vctemplate, .dxf, .emf, .wmf, .eps, ."
},
{
"name": "save_file",
"description": "Save the active document with the engine's document.save: by default to its own file in its own format (native .vectorcraft unless it was opened from or saved as SVG, PDF or a restorable .ai)."
},
{
"name": "export",
"description": "Export the active document with the engine's document.export (the same bytes in the app and headless), in any format of the `format` enum: vectors (svg/svgz with the artboard as viewBox, eps, dxf, emf, wmf), pdf and ai ("
},
{
"name": "add_text",
"description": "Create point type at (x, y) (the first baseline), area type when width/height are given (`fit` autoHeight grows the frame to the text, shrinkText scales the text down to fit), or type in/on an existing path (`path` id + "
},
{
"name": "apply_effect",
"description": "Append a live effect (Effect menu) to the selection or `ids`."
},
{
"name": "pathfinder",
"description": "Combine the selected (or `ids`) objects destructively, back to front: unite, minusFront, intersect, exclude, divide, trim, merge, crop, outline, minusBack."
},
{
"name": "transform",
"description": "Move, rotate, scale, reflect or shear the selection (or `ids`); several may be combined and run in that order."
},
{
"name": "create_graph",
"description": "Create a graph (graph tools) in the plot rectangle."
},
{
"name": "text_wrap",
"description": "Make the selected (or `ids`) objects wrap objects: area type below them in the same layer flows around them (offset in pt, invert = flow inside)."
},
{
"name": "undo",
"description": "Undo the last change (Edit → Undo)."
},
{
"name": "redo",
"description": "Redo the last undone change (Edit → Redo)."
}
],
"user_config": {
"read_root": {
"type": "directory",
"title": "Lese-Ordner",
"description": "Hier darf Claude Dateien lesen. Ruhig weit fassen (z. B. Dokumente); der Schreib-Ordner sollte darin liegen, damit Ergebnisse wieder geöffnet werden können.",
"required": true,
"default": "${HOME}/Documents"
},
"write_root": {
"type": "directory",
"title": "Schreib-Ordner",
"description": "Nur hier darf Claude speichern. Eng fassen, eigener Ordner, z. B. Dokumente\\Claude.",
"required": true,
"default": "${HOME}/Documents/Claude"
}
}
}
@@ -0,0 +1,3 @@
Diese Erweiterung enthaelt keine CLI.
Installiere VectorCraft ueber den ArtCraft-Launcher.
Erwarteter Pfad: C:\Program Files\VectorCraft\vectorcraft-cli.exe
@@ -0,0 +1 @@
{"version":"0.17.0","repository":"https://github.com/storytold/vectorcraft","bundled":false,"source":"ArtCraft-Launcher","exe":"vectorcraft-cli.exe","path":"C:\\Program Files\\VectorCraft\\vectorcraft-cli.exe","tag":"v0.17.0","sha256":"4f6e76d6394dfe77e081770ef207abd5804207378f9b1c489acfe5dbb1a9d52a"}
+13
View File
@@ -1,5 +1,18 @@
# Changelog – wordcraft-mcp # Changelog – wordcraft-mcp
## 0.4.0 (2026-10-26)
- CLI 0.11.0. Neues Dokument folgt der Systemregion (auf diesem Rechner A4, nicht mehr pauschal US-Letter). `mcp --connect` und die Ordner-Flags schließen sich aus.
- Formate: XML (Flat OPC, Word 2003 XML über die CLI). Passwort und Zotero nur als CLI belegt; das MCP-Feld für Passwörter ist nicht geprüft.
- Renderer-Grenzen bleiben als Befund von 0.8.0 stehen.
## 0.3.0 (2026-10-19)
- Skill clientneutral: Claude-/Cursor-Details nur noch in README/docs; schärfere `description`.
- Praxiserkenntnisse: batch inkl. Markieren, Fallen (format.set, Nummerierung, Löschen von unten, Highlight, UTF-8-Bytes), Rezepte (neues Dokument / Vorlage / füllen), Abschlussprüfung, Datenschutz-Ampel.
- Ordner-Empfehlung in der Erweiterung: Lese weit, Schreib eng.
- Neu: Cursor-Plugin je Skill (`wordcraft-mcp-cursor-v0.3.0.zip`) inkl. Deeplink.
## 0.2.0 (2026-10-19) ## 0.2.0 (2026-10-19)
- Erweiterung (`.mcpb`) als Standardweg; `display_name` ohne Umlaut („WordCraft for Claude“, Werkzeug-Präfix jetzt `…_for_Claude`). - Erweiterung (`.mcpb`) als Standardweg; `display_name` ohne Umlaut („WordCraft for Claude“, Werkzeug-Präfix jetzt `…_for_Claude`).
+25 -23
View File
@@ -4,59 +4,61 @@
## Zweck ## Zweck
Erstellt, bearbeitet und prüft Word-Dokumente über den MCP-Server von WordCraft – inklusive Nachverfolgung von Änderungen und der Fallen, die beim Praxistest mit WordCraft 0.8.0 aufgefallen sind. Die Anweisungen für Claude stehen in [SKILL.md](SKILL.md). Erstellt, bearbeitet und prüft Word-Dokumente über den MCP-Server von WordCraft – inklusive Nachverfolgung. CLI 0.11.0; die Fallen stammen aus dem Praxistest mit 0.8.0 und sind nicht erneut durchgespielt. Die Anweisungen für den Agenten stehen in [SKILL.md](SKILL.md) (clientneutral).
## Voraussetzungen ## Voraussetzungen
- Claude Desktop (die App)
- **WordCraft** über den ArtCraft-Launcher (`C:\Program Files\WordCraft\wordcraft-cli.exe`) - **WordCraft** über den ArtCraft-Launcher (`C:\Program Files\WordCraft\wordcraft-cli.exe`)
- Die Erweiterung `wordcraft-mcp-….mcpb` und dieses Skill-ZIP (siehe [Installation](#installation)) - Claude Desktop **oder** Cursor (siehe unten)
- Die Erweiterung bzw. das Plugin sowie dieses Skill-ZIP
Falls der Plugin-Skill `wordcraft-dokumente` installiert ist: deaktivieren, damit Claude `wordcraft-mcp` verwendet. Falls der Plugin-Skill `wordcraft-dokumente` installiert ist: deaktivieren bzw. löschen.
## Installation **Cursor:** siehe [Wurzel-README](../../README.md) und [docs/CURSOR.md](../../docs/CURSOR.md).
## Installation (Claude Desktop)
Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz: Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz:
1. `wordcraft-mcp-v0.2.0.mcpb` und `wordcraft-mcp-v0.2.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.2.0/wordcraft-mcp-v0.2.0.mcpb) laden. 1. `wordcraft-mcp-v0.4.0.mcpb` und `wordcraft-mcp-v0.4.0.zip` aus dem [Release](https://git.gundel.dev/dg/claude-skills/releases/download/wordcraft-mcp%2Fv0.4.0/wordcraft-mcp-v0.4.0.mcpb) laden.
2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren). Lese- und Schreib-Ordner setzen; Schreibordner vorher anlegen und nicht gleich dem Leseordner wählen. 2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren). **Lese-Ordner weit** (z. B. Dokumente oder Benutzerordner), **Schreib-Ordner eng** (eigener Ordner, z. B. `Dokumente\Claude`).
3. Unter Einstellungen → Erweiterungen prüfen, dass **WordCraft for Claude** eingeschaltet ist. 3. Unter Einstellungen → Erweiterungen prüfen, dass **WordCraft for Claude** eingeschaltet ist.
4. Skill-ZIP in Claude hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**. 4. Skill-ZIP hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**.
5. Claude komplett beenden (auch Taskleiste) und neu starten. 5. Claude komplett beenden (auch Taskleiste) und neu starten. **Neuen** Chat öffnen.
Wer v0.1.0 installiert hat: alte Erweiterung unter Einstellungen → Erweiterungen entfernen, v0.2.0 installieren, einschalten, Skill-ZIP v0.2.0 hochladen (ersetzt den alten Skill). Alte Skills `wordcraft-dokumente` bitte löschen. Bei `open_document` / `save_document` in Claude „Immer fragen“ lassen, wenn du Pfade mitkontrollieren willst.
**Umsteigen von der manuellen Config:** Wer den Server früher in `claude_desktop_config.json` eingetragen hat: Eintrag `wordcraft` unter `mcpServers` vor der Installation der Erweiterung entfernen (vorher Sicherungskopie der Datei anlegen), sonst gibt es die Werkzeuge doppelt. Wer v0.1.0, v0.2.0 oder v0.3.0 installiert hat: alte Erweiterung entfernen, v0.4.0 installieren, einschalten, Skill-ZIP v0.4.0 hochladen. Alte Skills `wordcraft-dokumente` bitte löschen.
**Umsteigen von der manuellen Config:** Eintrag `wordcraft` unter `mcpServers` vor der Installation der Erweiterung entfernen (vorher Sicherungskopie), sonst gibt es die Werkzeuge doppelt.
## Enthaltene Software ## Enthaltene Software
Die Erweiterung steuert [WordCraft](https://github.com/storytold/wordcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte des Upstreams liegen in der `.mcpb` unter `LICENSES/`. Die Erweiterung steuert [WordCraft](https://github.com/storytold/wordcraft) (MIT oder Apache-2.0) aus dem ArtCraft-Launcher; die CLI wird **nicht** mitgeliefert. Lizenztexte liegen in der `.mcpb` unter `LICENSES/`.
## Test ## Test
Neuen Chat öffnen und fragen: „Sind die WordCraft-Tools verfügbar?“ Neuen Chat öffnen und fragen: „Sind die WordCraft-Tools verfügbar?“ Die Werkzeuge heißen mit Präfix `…WordCraft_for_Claude…`.
Fehlen die Tools: Einstellungen → Erweiterungen – ist die Erweiterung eingeschaltet? Dann Claude komplett neu starten. Fehlen die Tools: Einstellungen → Erweiterungen – eingeschaltet? CLI unter `C:\Program Files\WordCraft\wordcraft-cli.exe` vorhanden? Dann Claude neu starten und neuen Chat öffnen.
## Stolpersteine ## Stolpersteine
- Speichern mit „path rejected“: Ziel lag außerhalb des Schreib-Ordners. Einstellungen → Erweiterungen → WordCraft for Claude → Einstellungen prüfen. - Speichern mit „path rejected“: Ziel lag außerhalb des Schreib-Ordners. Einstellungen → Erweiterungen → WordCraft for Claude → Einstellungen.
- Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust. - Erweiterungen sind nicht signiert; nur installieren, wenn du der Quelle vertraust.
## Deinstallation/Update ## Deinstallation/Update
Deinstallation: Einstellungen → Erweiterungen → entfernen; Skill in der Skill-Liste löschen. Einstellungen → Erweiterungen → entfernen; Skill löschen. Update: neue `.mcpb` und Skill-ZIP, ersetzen lassen, neu starten.
Update: neue `.mcpb` und Skill-ZIP installieren, bestehende Version ersetzen lassen, Claude neu starten.
## Alternative: manuell (für Entwickler) ## Alternative: manuell (für Entwickler)
Statt der Erweiterung kann der MCP-Server in `claude_desktop_config.json` eingetragen werden. Gemeinsame Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). Statt der Erweiterung den MCP-Server in `claude_desktop_config.json` eintragen. Stolpersteine: [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md).
- Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json` - Claude-Installer: `%APPDATA%\Claude\claude_desktop_config.json`
- Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json` (der Suffix `pzs8sxrjxfjjc` ist der Herausgeber-Hash und bei allen Store-Installationen gleich) - Microsoft-Store-App: `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json` (Herausgeber-Hash `pzs8sxrjxfjjc`, bei allen Store-Installationen gleich)
WordCraft muss über den ArtCraft-Launcher installiert sein (`C:\Program Files\WordCraft\wordcraft-cli.exe`). Der Schreibordner muss vorher existieren. Die App kann den Eintrag beim Speichern eigener Einstellungen überschreiben – dann neu eintragen und **sofort** neu starten.
```json ```json
{ {
@@ -67,14 +69,14 @@ WordCraft muss über den ArtCraft-Launcher installiert sein (`C:\Program Files\W
"mcp", "mcp",
"--author", "Claude", "--author", "Claude",
"--automation-read-root", "C:\\Pfad\\zu\\Dokumente", "--automation-read-root", "C:\\Pfad\\zu\\Dokumente",
"--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\claude_out" "--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\Claude"
] ]
} }
} }
} }
``` ```
Auffinden der EXE: Laufende App steuern (nicht auf Ordner beschränkt): `wordcraft --control 7981` und `wordcraft-cli mcp --connect 127.0.0.1:7981`. `--connect` und die Ordner-Flags zusammen sind ein Fehler.
```powershell ```powershell
Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "wordcraft-cli.exe" -ErrorAction SilentlyContinue Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "wordcraft-cli.exe" -ErrorAction SilentlyContinue
+73 -46
View File
@@ -1,6 +1,6 @@
--- ---
name: wordcraft-mcp 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) # Dokumente mit WordCraft (MCP)
@@ -9,25 +9,11 @@ WordCraft ist ein Open-Source-Textverarbeitungsprogramm (Rust), das Word-Paritä
## Voraussetzung ## 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. 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.
**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`.
## Freigaben ## Freigaben
Der eigentliche Schutz sind `--automation-read-root` und `--automation-write-root`, nicht die Freigabe-Dialoge. Empfohlene Tool-Berechtigungen im Connector: 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.
- 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`.
## Tools ## Tools
@@ -37,33 +23,34 @@ Aufrufe sparen: genaue Dateipfade vom Nutzer erfragen statt zu raten, zusammenh
| `execute` | einen Befehl ausführen: `{command, params}` | | `execute` | einen Befehl ausführen: `{command, params}` |
| `batch` | mehrere Befehle in Reihenfolge (stoppt beim ersten Fehler) | | `batch` | mehrere Befehle in Reihenfolge (stoppt beim ersten Fehler) |
| `new_document` | blank, sample, letter, resume, report | | `new_document` | blank, sample, letter, resume, report |
| `open_document` / `save_document` | docx, doc (nur öffnen), odt, rtf, html, md, tex, txt, json; speichern auch pdf, png | | `open_document` / `save_document` | docx, doc (nur öffnen), odt, rtf, html, md, tex, txt, json, xml (Flat OPC; CLI `--format wordml2003` für Word 2003 XML); speichern auch pdf, png |
| `type_text` | an der Schreibmarke tippen (ersetzt Markierung) | | `type_text` | an der Schreibmarke tippen (ersetzt Markierung) |
| `select_text` | n-tes Vorkommen eines Textes markieren | | `select_text` | n-tes Vorkommen eines Textes markieren |
| `get_text` / `inspect_document` | Dokument zurücklesen (Struktur als JSON, inkl. Kopf-/Fußzeilen unter `parts`) | | `get_text` / `inspect_document` | Dokument zurücklesen (Struktur als JSON, inkl. Kopf-/Fußzeilen unter `parts`) |
| `render_page` | Seite als PNG | | `render_page` | Seite als PNG |
| `parity` | Funktionsabdeckung gegenüber Word | | `parity` | Funktionsabdeckung gegenüber Word |
| `screenshot`, `click`, `key`, `ui_inspect` | nur mit `--connect` | | `screenshot`, `click`, `key`, `ui_inspect` | nur mit verbundener Desktop-App |
## Arbeitsweise ## 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. 1. **Befehls-IDs nie raten.** Vor jedem unbekannten Befehl `list_commands` mit `query` aufrufen (z. B. `table.`, `insert.`, `layout.`, `styles.`, `review`, `caret.`, `select.`).
2. **Formatvorlagen statt Direktformatierung.** `styles.modify` an Normal/Heading1/Heading2/Title; Absätze nur per `para.set {"props":{"style":"Heading1"}}` zuweisen. 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. **Gebündelt arbeiten.** Zusammenhängende Schritte als `batch`. 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` für Inhalt/Struktur/Kopf-Fußzeilen, `render_page` für Layout. 4. **Prüfen, bevor gespeichert wird.** `inspect_document`, `render_page`.
5. **Speichern** mit `save_document` in den Schreibordner; PDF per Endung `.pdf`. 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: 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 5 (Zugriff verweigert)` → Pfad ist ein existierender Ordner
- `os error 2 (nicht gefunden)` → existiert nicht - `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) ## Neues Dokument – Grundeinrichtung (DE)
`new_document blank` startet in **US-Letter** und englischer Sprache. Immer zuerst: `new_document blank` übernimmt das Papier der Systemregion (CLI 0.11.0: A4, in Letter-Regionen US-Letter; `WORDCRAFT_REGION` setzt die Region fest). Auf diesem Rechner war ein leeres Dokument A4 (11906×16838 Twip), die Ränder 1 Zoll. Sprache und Ränder deshalb weiter explizit setzen:
```json ```json
[{"command":"layout.size","params":{"name":"A4"}}, [{"command":"layout.size","params":{"name":"A4"}},
{"command":"layout.margins","params":{"top":70.87,"bottom":56.69,"left":70.87,"right":56.69}}, {"command":"layout.margins","params":{"top":70.87,"bottom":56.69,"left":70.87,"right":56.69}},
@@ -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. 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 ## Kopf- und Fußzeile, Seitenzahl
- Nach `insert.header` / `insert.footer` **sofort** `insert.closeHeader`, sonst landet folgender Text in der Kopf-/Fußzeile. - 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 ```json
[{"command":"insert.footer"}, [{"command":"insert.footer"},
{"command":"text.insert","params":{"text":"Seite "}}, {"command":"text.insert","params":{"text":"Seite "}},
@@ -87,43 +86,69 @@ Text aufbauen: `para.set {style}` → `text.insert` → `text.newParagraph`, Sti
{"command":"para.set","params":{"props":{"align":"center"}}}, {"command":"para.set","params":{"props":{"align":"center"}}},
{"command":"insert.closeHeader"}] {"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`.
- Kontrolle: `inspect_document` → `parts[]` mit `kind: header/footer`. Fehler korrigieren mit `insert.removeFooter` und neu aufbauen.
## Tabellen ## Tabellen
- `insert.table {"rows":n,"cols":n,"style":"TableGrid"}` liefert `{"table":[index]}` = Blockindex. - `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`. - 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}}`. - 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). - `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).
## 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.
## Überarbeitung fremder Dokumente (Nachverfolgung) ## Überarbeitung fremder Dokumente (Nachverfolgung)
1. Original nur öffnen, nie darauf speichern; erste Speicherung sofort mit neuem Namen in den Schreibordner. 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. 2. `file.setAuthor {"name":"…"}` und `review.trackChanges {"value": true}` – **immer mit value**.
3. Ersetzen: `select_text` → `type_text`. Ergebnis ist Einfügung + Löschung (ganzes Wort). 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; zum Markieren das neue Wort verwenden. 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": ...}`. 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) ## 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**. 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` - 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) ## Renderer-Grenzen (an 0.8.0 gesehen)
An 0.11.0 nicht erneut geprüft:
Bekannte Darstellungsfehler von `render_page`, die **nicht** von eigenen Änderungen kommen:
- mehrzeilige Zellen in dunkel hinterlegten Tabellenköpfen zeigen nur die letzte Zeile - mehrzeilige Zellen in dunkel hinterlegten Tabellenköpfen zeigen nur die letzte Zeile
- Seitenzahlfelder in Fußzeilen importierter python-docx-Dokumente bleiben leer - 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 ## Word-Kompatibilität
@@ -133,5 +158,7 @@ Bei Auffälligkeiten erst das Original rendern und vergleichen, bevor man die ei
## Grenzen ## Grenzen
- Die Ordnerbeschränkung gilt nur headless; mit `--connect` ist die App nicht eingeschränkt. - Die Ordner-Flags gelten nur kopflos. `mcp --connect HOST:PORT` und `--automation-read-root` / `--automation-write-root` zusammen sind ein Fehler (CLI 0.11.0). Mit verbundener App entfällt die Ordnersperre.
- Befehle ohne Pfad wirken immer auf das zuletzt geöffnete Dokument. Vor dem Öffnen eines anderen Dokuments speichern. - Befehle ohne Pfad wirken immer auf das zuletzt geöffnete Dokument. Vor dem Öffnen eines anderen Dokuments speichern.
- Passwortgeschützte Dateien: die CLI nimmt `--password`, `--password-file` oder `WORDCRAFT_PASSWORD` und schreibt das Passwort wieder mit. Ob `open_document` ein Passwort-Feld hat, ist nicht geprüft.
- Zotero (CLI, Zotero muss laufen): `addEditCitation`, `addEditBibliography`, `addNote`, `refresh`, `removeCodes`, `setDocPrefs`. Kein eigenes MCP-Werkzeug dafür geprüft.
Loaded 100 of 105 files, more files were not shown because too many files have changed in this diff. Show more