diff --git a/.gitignore b/.gitignore index 89eda0c..0d46d35 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ dist/ *.zip +skills/*/extension/server/*.exe .DS_Store Thumbs.db diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 19de1f4..40636b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Mitarbeiten -Kollegen installieren einen Skill ohne Git: 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. Dieser Text ist für alle, die einen Skill anlegen oder aktualisieren. ## Aufbau eines Skills @@ -9,12 +9,18 @@ skills// ├── SKILL.md Pflicht – Anweisungen für Claude (liegt im ZIP) ├── README.md Pflicht – Doku für Menschen (nicht im ZIP) ├── CHANGELOG.md Pflicht – Versionen (nicht im ZIP) +├── extension/ optional – Claude-Desktop-Erweiterung (.mcpb) +│ ├── manifest.json +│ ├── icon.png optional +│ ├── upstream.json von scripts/fetch-cli geschrieben +│ ├── LICENSES/ Upstream-Lizenztexte +│ └── server/ CLI-exe nur beim Bauen (nicht committen) ├── scripts/ optional – Hilfsskripte, die Claude ausführen kann ├── references/ optional – Nachschlagematerial, das Claude bei Bedarf liest └── 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. +`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). ## Regeln @@ -69,14 +75,20 @@ skills// Ein Paket pro Skill, Dateiname `dist/-v.zip`. Im ZIP liegt der Ordner `/` mit `SKILL.md` auf oberster Ebene. `README.md` und `CHANGELOG.md` werden nicht eingepackt. +Skills mit `extension/` liefern zusätzlich `dist/-v.mcpb`. Die CLI wird aus der ArtCraft-Launcher-Installation kopiert (`scripts/fetch-cli`), nicht von GitHub heruntergeladen. Die `.mcpb` bleibt unsigniert, solange kein Code-Signing-Zertifikat vorliegt (`mcpb sign` braucht `--cert` / `--key`; `--self-signed` hilft nicht gegen Defender). + ```sh -scripts/package.sh # alle Skills +scripts/package.sh # nur Skill-ZIPs scripts/package.sh +scripts/package-mcpb.sh # eine .mcpb +scripts/package-all.sh # ZIP + .mcpb wo extension/ existiert ``` ```powershell powershell -ExecutionPolicy Bypass -File scripts\package.ps1 powershell -ExecutionPolicy Bypass -File scripts\package.ps1 -Name +powershell -ExecutionPolicy Bypass -File scripts\package-mcpb.ps1 -Name +powershell -ExecutionPolicy Bypass -File scripts\package-all.ps1 ``` ### Vom eigenen Rechner @@ -106,6 +118,23 @@ GITEA_TOKEN='' scripts/release.sh 3. Tag: `/v` (der Tag muss schon auf dem Server liegen). Titel: ` `. 4. Als Text den Abschnitt dieser Version aus `skills//CHANGELOG.md` einfügen. 5. `dist/-v.zip` als Anhang hochladen. +6. Falls vorhanden: `dist/-v.mcpb` ebenfalls hochladen (oder `scripts/release.ps1` nutzen – hängt beides an). + +Nur die `.mcpb` nachträglich an ein bestehendes Release hängen (Token nur in der Umgebung): + +```powershell +$env:GITEA_TOKEN = '' +$id = +$name = 'wordcraft-mcp-v0.2.0.mcpb' +$bytes = [IO.File]::ReadAllBytes("dist\$name") +$req = [Net.HttpWebRequest]::Create("https://git.gundel.dev/api/v1/repos/dg/claude-skills/releases/$id/assets?name=$name") +$req.Method = 'POST' +$req.Headers.Add('Authorization', "token $env:GITEA_TOKEN") +$req.ContentType = 'application/octet-stream' +$req.ContentLength = $bytes.LongLength +$s = $req.GetRequestStream(); $s.Write($bytes, 0, $bytes.Length); $s.Close() +$resp = $req.GetResponse(); (New-Object IO.StreamReader($resp.GetResponseStream())).ReadToEnd() +``` ## Hinweise zu den Skripten diff --git a/README.md b/README.md index d9b3269..4275ea9 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,15 @@ Sammlung von Skills für Claude. Jeder Skill ist ein abgeschlossener Ordner: `SKILL.md` für Claude, `README.md` für Menschen. Die fertigen Pakete liegen als ZIP in den [Releases](https://git.gundel.dev/dg/claude-skills/releases) auf [git.gundel.dev/dg/claude-skills](https://git.gundel.dev/dg/claude-skills). +Schritt-für-Schritt-Installation: [docs/INSTALLATION.md](docs/INSTALLATION.md). + ## Skills -| Skill | Kurzbeschreibung | Version | Doku | Download | -|---|---|---|---|---| -| [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.1.0 | [README](skills/gridcraft-mcp/README.md) | [gridcraft-mcp-v0.1.0.zip](https://git.gundel.dev/dg/claude-skills/releases/tag/gridcraft-mcp/v0.1.0) | -| [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; statt wordcraft-dokumente verwenden. | 0.1.1 | [README](skills/wordcraft-mcp/README.md) | [wordcraft-mcp-v0.1.1.zip](https://git.gundel.dev/dg/claude-skills/releases/tag/wordcraft-mcp/v0.1.1) | +| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) | +|---|---|---|---|---|---| +| [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) | +| [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) | ## Skill installieren diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md new file mode 100644 index 0000000..3000c6e --- /dev/null +++ b/docs/INSTALLATION.md @@ -0,0 +1,109 @@ +# Claude-Werkzeuge für Word und Excel einrichten + +Mit dieser Anleitung kann Claude Word-Dokumente (über **WordCraft für Claude**) und Excel-Tabellen (über **GridCraft für Claude**) direkt auf deinem Rechner erstellen und bearbeiten. Dauer: etwa 10 Minuten. Du brauchst keine Programmierkenntnisse. + +Für jedes Werkzeug installierst du zwei Dinge: + +| Datei | Was sie ist | Wozu | +|---|---|---| +| `…​.mcpb` | **Erweiterung** für die Claude-App | gibt Claude die Werkzeuge (Datei öffnen, schreiben, speichern …) | +| `…​.zip` | **Skill** | Anleitung für Claude, wie man die Werkzeuge richtig benutzt | + +Ohne Erweiterung kann Claude nichts tun, ohne Skill macht es mehr Fehler. Installiere also immer beides. + +--- + +## Voraussetzungen + +- Windows 10 oder 11 +- **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. + +WordCraft oder GridCraft selbst musst du **nicht** installieren – das Nötige steckt in der Erweiterung. + +--- + +## 1. Dateien herunterladen + +Öffne die Releases-Seite: **https://git.gundel.dev/dg/claude-skills/releases** + +Lade jeweils die neueste Version herunter: + +- `wordcraft-mcp-vX.Y.Z.mcpb` und `wordcraft-mcp-vX.Y.Z.zip` +- `gridcraft-mcp-vX.Y.Z.mcpb` und `gridcraft-mcp-vX.Y.Z.zip` + +Die ZIP-Dateien **nicht entpacken**. + +--- + +## 2. Erweiterungen installieren + +Für jede `.mcpb`-Datei: + +1. Claude Desktop öffnen. +2. Die `.mcpb`-Datei **doppelklicken** – oder sie ins Claude-Fenster ziehen. + *Klappt beides nicht:* Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ → Datei auswählen. +3. Es öffnet sich ein Installationsfenster. Angaben prüfen und bestätigen. +4. **Nur bei WordCraft für Claude** fragt Claude nach zwei Ordnern: + - **Lese-Ordner:** Hier darf Claude Dokumente lesen, z. B. `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. +5. Installieren. Die Erweiterung erscheint unter Einstellungen → Erweiterungen und muss **eingeschaltet** sein. + +> **Windows meldet „Der Computer wurde durch Windows geschützt“ oder Defender schlägt an?** +> Die Erweiterungen sind nicht signiert. Wende dich an Dominic, bevor du die Warnung übergehst. + +--- + +## 3. Skills installieren + +Für jede `.zip`-Datei: + +1. In Claude auf **„+“** → **„Skill erstellen“** → **„Skill hochladen“**. +2. Die ZIP-Datei auswählen und bestätigen. + +Die Skills heißen danach `wordcraft-mcp` und `gridcraft-mcp`. + +--- + +## 4. Claude neu starten + +Claude **komplett beenden** – auch das Symbol unten rechts in der Taskleiste (Rechtsklick → Beenden) – und wieder öffnen. + +--- + +## 5. Testen + +Neuen Chat öffnen 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. + +Claude sollte beide Werkzeuge finden und eine `.xlsx`-Datei im Ausgabeordner speichern. Beim ersten Mal fragt Claude, ob es die Werkzeuge benutzen darf – erlauben. + +--- + +## Sicher arbeiten – bitte lesen + +- **GridCraft hat keine Ordnersperre.** Anders als WordCraft kann es jede Datei öffnen und speichern, auf die du Zugriff hast. Lass in Claude bei den GridCraft-Werkzeugen **`save_workbook`**, **`open_workbook`** und **`execute_command`** auf **„Immer fragen“** und lies vor dem Bestätigen den Dateipfad. +- **Nenne Claude die Datei genau** („öffne `Dokumente\Angebote\A-2026-112.xlsx`“). Claude speichert Änderungen immer unter neuem Namen; das Original bleibt unberührt. +- **Ergebnis in Word/Excel ansehen**, bevor es an Kunden geht. WordCraft und GridCraft sind Nachbauten; das allermeiste klappt, aber nicht alles. +- Kundendaten nur in dem Umfang verwenden, den unsere Datenschutzregeln erlauben. + +--- + +## Probleme? + +| Problem | Lösung | +|---|---| +| Claude sagt, die Werkzeuge fehlen | Einstellungen → Erweiterungen: Ist die Erweiterung eingeschaltet? Dann Claude komplett beenden (auch Taskleiste) und neu starten. | +| WordCraft speichert nicht („path rejected“) | Claude wollte außerhalb des Schreib-Ordners speichern. Ordner prüfen: Einstellungen → Erweiterungen → WordCraft für Claude → Einstellungen. | +| 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 €`. | +| Doppelklick auf `.mcpb` tut nichts | Über Einstellungen → Erweiterungen → Erweiterte Einstellungen → „Erweiterung installieren…“ gehen. | + +## 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. + +## Entfernen + +Einstellungen → Erweiterungen → Erweiterung entfernen; Skills in der Skill-Liste löschen. diff --git a/docs/windows-mcp-einrichtung.md b/docs/windows-mcp-einrichtung.md index 7a68cd6..d854004 100644 --- a/docs/windows-mcp-einrichtung.md +++ b/docs/windows-mcp-einrichtung.md @@ -2,6 +2,8 @@ [Alle Skills](../README.md) +**Standardweg:** [INSTALLATION.md](INSTALLATION.md) (Erweiterung `.mcpb` + Skill-ZIP). Diese Seite gilt nur für die manuelle Einrichtung ohne Erweiterung. + Gilt für Skills, die einen lokalen MCP-Server in Claude Desktop eintragen: [wordcraft-mcp](../skills/wordcraft-mcp/README.md), [gridcraft-mcp](../skills/gridcraft-mcp/README.md). Der Pfad zur jeweiligen Programmdatei und die Argumente stehen in der README des Skills. ## Ort der Config diff --git a/scripts/fetch-cli.ps1 b/scripts/fetch-cli.ps1 new file mode 100644 index 0000000..09cdb45 --- /dev/null +++ b/scripts/fetch-cli.ps1 @@ -0,0 +1,90 @@ +# Copies the ArtCraft-Launcher CLI into skills\\extension\server\ +# and writes upstream.json plus LICENSES from the matching upstream tag. +# No GitHub binary download. Requires WordCraft/GridCraft installed via ArtCraft Launcher. +# Usage: scripts\fetch-cli.ps1 -Name [-CliPath ] +param( + [Parameter(Mandatory = $true)][string]$Name, + [string]$CliPath +) +. (Join-Path $PSScriptRoot 'lib.ps1') + +$dir = Join-Path $SkillsDir $Name +$ext = Join-Path $dir 'extension' +if (-not (Test-Path (Join-Path $ext 'manifest.json'))) { + Write-Host "skills/$Name/extension/manifest.json fehlt." + exit 1 +} + +$defaults = @{ + 'wordcraft-mcp' = @{ + ExeName = 'wordcraft-cli.exe' + Default = 'C:\Program Files\WordCraft\wordcraft-cli.exe' + Repo = 'https://github.com/storytold/wordcraft' + RepoSlug = 'storytold/wordcraft' + } + 'gridcraft-mcp' = @{ + ExeName = 'gridcraft-cli.exe' + Default = 'C:\Program Files\GridCraft\gridcraft-cli.exe' + Repo = 'https://github.com/storytold/gridcraft' + RepoSlug = 'storytold/gridcraft' + } +} + +if (-not $defaults.ContainsKey($Name)) { + Write-Host "Kein CLI-Mapping fuer Skill '$Name'." + exit 1 +} +$meta = $defaults[$Name] +$src = if ($CliPath) { $CliPath } else { $meta.Default } +if (-not (Test-Path -LiteralPath $src)) { + Write-Host "CLI fehlt: $src" + Write-Host "Bitte WordCraft/GridCraft ueber den ArtCraft-Launcher installieren, oder -CliPath angeben." + exit 1 +} + +$serverDir = Join-Path $ext 'server' +New-Item -ItemType Directory -Force -Path $serverDir | Out-Null +$dest = Join-Path $serverDir $meta.ExeName +Copy-Item -LiteralPath $src -Destination $dest -Force + +$verOut = & $dest --version 2>&1 | Out-String +if ($LASTEXITCODE -ne 0 -and $Name -eq 'gridcraft-mcp') { + $verOut = & $dest version 2>&1 | Out-String +} +$ver = '' +if ($verOut -match '(\d+\.\d+\.\d+)') { $ver = $Matches[1] } +if (-not $ver) { + Write-Host "Version der CLI nicht lesbar: $verOut" + exit 1 +} + +$hash = (Get-FileHash -LiteralPath $dest -Algorithm SHA256).Hash.ToLowerInvariant() +$upstream = @{ + source = 'ArtCraft-Launcher' + path = $src + exe = $meta.ExeName + version = $ver + sha256 = $hash + repository = $meta.Repo + tag = "v$ver" +} | ConvertTo-Json -Compress +Write-Text (Join-Path $ext 'upstream.json') ($upstream + "`n") + +$licDir = Join-Path $ext 'LICENSES' +New-Item -ItemType Directory -Force -Path $licDir | Out-Null +$tag = "v$ver" +foreach ($f in @('LICENSE-MIT', 'LICENSE-APACHE', 'NOTICE')) { + $url = "https://raw.githubusercontent.com/$($meta.RepoSlug)/$tag/$f" + $out = Join-Path $licDir $f + try { + Invoke-WebRequest -Uri $url -OutFile $out -UseBasicParsing + } + catch { + Write-Host "Lizenzdatei fehlgeschlagen: $url" + Write-Host $_ + exit 1 + } +} + +Write-Host "OK $Name $ver $hash" +Write-Host " $dest" diff --git a/scripts/fetch-cli.sh b/scripts/fetch-cli.sh new file mode 100644 index 0000000..0d2f2ed --- /dev/null +++ b/scripts/fetch-cli.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# Copies the ArtCraft-Launcher CLI into skills//extension/server/ +# and writes upstream.json plus LICENSES from the matching upstream tag. +# No GitHub binary download. Requires WordCraft/GridCraft via ArtCraft Launcher. +# Usage: scripts/fetch-cli.sh [cli-path] +set -euo pipefail +source "$(dirname "$0")/lib.sh" + +name="${1:-}" +cli_path="${2:-}" +if [[ -z "$name" ]]; then + echo "Aufruf: scripts/fetch-cli.sh [cli-path]" >&2 + exit 1 +fi + +ext="$SKILLS_DIR/$name/extension" +if [[ ! -f "$ext/manifest.json" ]]; then + echo "skills/$name/extension/manifest.json fehlt." >&2 + exit 1 +fi + +case "$name" in + wordcraft-mcp) + exe_name=wordcraft-cli.exe + default='/mnt/c/Program Files/WordCraft/wordcraft-cli.exe' + [[ -f "$default" ]] || default='C:/Program Files/WordCraft/wordcraft-cli.exe' + repo='https://github.com/storytold/wordcraft' + repo_slug='storytold/wordcraft' + ;; + gridcraft-mcp) + exe_name=gridcraft-cli.exe + default='/mnt/c/Program Files/GridCraft/gridcraft-cli.exe' + [[ -f "$default" ]] || default='C:/Program Files/GridCraft/gridcraft-cli.exe' + repo='https://github.com/storytold/gridcraft' + repo_slug='storytold/gridcraft' + ;; + *) + echo "Kein CLI-Mapping fuer Skill '$name'." >&2 + exit 1 + ;; +esac + +src="${cli_path:-$default}" +if [[ ! -f "$src" ]]; then + echo "CLI fehlt: $src" >&2 + echo "Bitte WordCraft/GridCraft ueber den ArtCraft-Launcher installieren, oder Pfad als Argument angeben." >&2 + exit 1 +fi + +mkdir -p "$ext/server" +dest="$ext/server/$exe_name" +cp -f "$src" "$dest" +chmod +x "$dest" 2>/dev/null || true + +ver_out="$("$dest" --version 2>&1 || true)" +if [[ ! "$ver_out" =~ [0-9]+\.[0-9]+\.[0-9]+ ]] && [[ "$name" == gridcraft-mcp ]]; then + ver_out="$("$dest" version 2>&1 || true)" +fi +if [[ ! "$ver_out" =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then + echo "Version der CLI nicht lesbar: $ver_out" >&2 + exit 1 +fi +ver="${BASH_REMATCH[1]}" + +if command -v sha256sum >/dev/null 2>&1; then + hash="$(sha256sum "$dest" | awk '{print $1}')" +elif command -v shasum >/dev/null 2>&1; then + hash="$(shasum -a 256 "$dest" | awk '{print $1}')" +else + hash="$(python3 -c "import hashlib,sys; print(hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest())" "$dest")" +fi + +python3 -c " +import json, sys +print(json.dumps({ + 'source': 'ArtCraft-Launcher', + 'path': sys.argv[1], + 'exe': sys.argv[2], + 'version': sys.argv[3], + 'sha256': sys.argv[4], + 'repository': sys.argv[5], + 'tag': 'v' + sys.argv[3], +}, separators=(',', ':'))) +" "$src" "$exe_name" "$ver" "$hash" "$repo" > "$ext/upstream.json" +printf '\n' >> "$ext/upstream.json" || true + +mkdir -p "$ext/LICENSES" +tag="v$ver" +for f in LICENSE-MIT LICENSE-APACHE NOTICE; do + url="https://raw.githubusercontent.com/$repo_slug/$tag/$f" + if ! curl -fsSL "$url" -o "$ext/LICENSES/$f"; then + echo "Lizenzdatei fehlgeschlagen: $url" >&2 + exit 1 + fi +done + +echo "OK $name $ver $hash" +echo " $dest" diff --git a/scripts/package-all.ps1 b/scripts/package-all.ps1 new file mode 100644 index 0000000..9879bb1 --- /dev/null +++ b/scripts/package-all.ps1 @@ -0,0 +1,14 @@ +# Builds ZIP for every skill and .mcpb when skills\\extension\ exists. +# Usage: scripts\package-all.ps1 +. (Join-Path $PSScriptRoot 'lib.ps1') + +& (Join-Path $PSScriptRoot 'package.ps1') +if ($LASTEXITCODE -ne 0) { exit 1 } + +foreach ($n in (Get-SkillNames)) { + $ext = Join-Path (Join-Path $SkillsDir $n) 'extension\manifest.json' + if (Test-Path $ext) { + & (Join-Path $PSScriptRoot 'package-mcpb.ps1') -Name $n + if ($LASTEXITCODE -ne 0) { exit 1 } + } +} diff --git a/scripts/package-all.sh b/scripts/package-all.sh new file mode 100644 index 0000000..32e9552 --- /dev/null +++ b/scripts/package-all.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Builds ZIP for every skill and .mcpb when skills//extension/ exists. +# Usage: scripts/package-all.sh +set -euo pipefail +source "$(dirname "$0")/lib.sh" + +bash "$(dirname "$0")/package.sh" + +while IFS= read -r name; do + [[ -z "$name" ]] && continue + if [[ -f "$SKILLS_DIR/$name/extension/manifest.json" ]]; then + bash "$(dirname "$0")/package-mcpb.sh" "$name" + fi +done < <(skill_names) diff --git a/scripts/package-mcpb.ps1 b/scripts/package-mcpb.ps1 new file mode 100644 index 0000000..16a1389 --- /dev/null +++ b/scripts/package-mcpb.ps1 @@ -0,0 +1,57 @@ +# Builds dist\-v.mcpb from skills\\extension\ +# Steps: fetch-cli, mcpb validate, mcpb pack. Unsigned (no cert). +# Usage: scripts\package-mcpb.ps1 -Name [-CliPath ] +param( + [Parameter(Mandatory = $true)][string]$Name, + [string]$CliPath +) +. (Join-Path $PSScriptRoot 'lib.ps1') + +$dir = Join-Path $SkillsDir $Name +$ext = Join-Path $dir 'extension' +if (-not (Test-Path (Join-Path $ext 'manifest.json'))) { + Write-Host "skills/$Name/extension/ fehlt." + exit 1 +} + +$ver = Get-SkillVersion $dir +if (-not $ver) { + Write-Host "CHANGELOG von $Name hat keine Version." + exit 1 +} + +$fetchArgs = @{ Name = $Name } +if ($CliPath) { $fetchArgs.CliPath = $CliPath } +& (Join-Path $PSScriptRoot 'fetch-cli.ps1') @fetchArgs +if ($LASTEXITCODE -ne 0) { exit 1 } + +$manPath = Join-Path $ext 'manifest.json' +$man = Read-Text $manPath | ConvertFrom-Json +if ($man.version -cne $ver) { + Write-Host "manifest.json version '$($man.version)' != CHANGELOG '$ver'." + exit 1 +} + +New-Item -ItemType Directory -Force -Path $DistDir | Out-Null +$out = Join-Path $DistDir "$Name-v$ver.mcpb" +if (Test-Path $out) { Remove-Item $out -Force } + +Push-Location $ext +try { + npx --yes @anthropic-ai/mcpb validate . + if ($LASTEXITCODE -ne 0) { exit 1 } + npx --yes @anthropic-ai/mcpb pack . $out + if ($LASTEXITCODE -ne 0) { exit 1 } +} +finally { Pop-Location } + +Write-Host '' +Write-Host "dist/$Name-v$ver.mcpb" +Add-Type -AssemblyName System.IO.Compression.FileSystem +$zip = [IO.Compression.ZipFile]::OpenRead($out) +try { + foreach ($e in $zip.Entries) { + Write-Host ('{0,12} {1}' -f $e.Length, $e.FullName) + } +} +finally { $zip.Dispose() } diff --git a/scripts/package-mcpb.sh b/scripts/package-mcpb.sh new file mode 100644 index 0000000..b02a7f4 --- /dev/null +++ b/scripts/package-mcpb.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# Builds dist/-v.mcpb from skills//extension/ +# Steps: fetch-cli, mcpb validate, mcpb pack. Unsigned (no cert). +# Usage: scripts/package-mcpb.sh [cli-path] +set -euo pipefail +source "$(dirname "$0")/lib.sh" + +name="${1:-}" +cli_path="${2:-}" +if [[ -z "$name" ]]; then + echo "Aufruf: scripts/package-mcpb.sh [cli-path]" >&2 + exit 1 +fi + +dir="$SKILLS_DIR/$name" +ext="$dir/extension" +[[ -f "$ext/manifest.json" ]] || { echo "skills/$name/extension/ fehlt." >&2; exit 1; } + +ver="$(skill_version "$dir")" +[[ -n "$ver" ]] || { echo "CHANGELOG von $name hat keine Version." >&2; exit 1; } + +if [[ -n "$cli_path" ]]; then + bash "$(dirname "$0")/fetch-cli.sh" "$name" "$cli_path" +else + bash "$(dirname "$0")/fetch-cli.sh" "$name" +fi + +man_ver="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1],encoding="utf-8"))["version"])' "$ext/manifest.json")" +if [[ "$man_ver" != "$ver" ]]; then + echo "manifest.json version '$man_ver' != CHANGELOG '$ver'." >&2 + exit 1 +fi + +mkdir -p "$DIST_DIR" +out="$DIST_DIR/$name-v$ver.mcpb" +rm -f "$out" + +( + cd "$ext" + npx --yes @anthropic-ai/mcpb validate . + npx --yes @anthropic-ai/mcpb pack . "$out" +) + +echo +echo "dist/$name-v$ver.mcpb" +unzip -l "$out" diff --git a/scripts/package.ps1 b/scripts/package.ps1 index 1e2bab1..00eadd0 100644 --- a/scripts/package.ps1 +++ b/scripts/package.ps1 @@ -23,8 +23,12 @@ foreach ($n in $names) { $zipPath = Join-Path $DistDir "$n-v$version.zip" if (Test-Path $zipPath) { Remove-Item $zipPath } + $extPrefix = (Join-Path $src 'extension') + [IO.Path]::DirectorySeparatorChar $files = @(Get-ChildItem -Path $src -Recurse -File -Force | - Where-Object { $exclude -notcontains $_.Name } | + Where-Object { + $exclude -notcontains $_.Name -and + (-not $_.FullName.StartsWith($extPrefix, [StringComparison]::OrdinalIgnoreCase)) + } | ForEach-Object { $_.FullName }) [Array]::Sort($files, [StringComparer]::Ordinal) diff --git a/scripts/package.sh b/scripts/package.sh index 4943f05..32bb0e0 100755 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -23,7 +23,7 @@ for name in "${names[@]}"; do tmp="$(mktemp -d)" mkdir "$tmp/$name" - (cd "$SKILLS_DIR/$name" && tar cf - --exclude=CHANGELOG.md --exclude=README.md --exclude=.DS_Store --exclude=Thumbs.db .) \ + (cd "$SKILLS_DIR/$name" && tar cf - --exclude=CHANGELOG.md --exclude=README.md --exclude=.DS_Store --exclude=Thumbs.db --exclude=extension .) \ | (cd "$tmp/$name" && tar xf -) (cd "$tmp" && zip -qrX "$zip_path" "$name") rm -rf "$tmp" diff --git a/scripts/release.ps1 b/scripts/release.ps1 index 89cda02..88f3519 100644 --- a/scripts/release.ps1 +++ b/scripts/release.ps1 @@ -104,6 +104,21 @@ catch { $assetUrl = "$api/releases/$($created.id)/assets?name=$([Uri]::EscapeDataString($zipName))" $asset = Invoke-Gitea 'POST' $assetUrl ([IO.File]::ReadAllBytes($zipPath)) 'application/octet-stream' | ConvertFrom-Json +$mcpbName = "$Name-v$ver.mcpb" +$mcpbPath = Join-Path $DistDir $mcpbName +$mcpbAsset = $null +if (Test-Path (Join-Path (Join-Path $dir 'extension') 'manifest.json')) { + if (-not (Test-Path $mcpbPath)) { + & (Join-Path $PSScriptRoot 'package-mcpb.ps1') -Name $Name + if ($LASTEXITCODE -ne 0) { exit 1 } + } + if (Test-Path $mcpbPath) { + $mcpbUrl = "$api/releases/$($created.id)/assets?name=$([Uri]::EscapeDataString($mcpbName))" + $mcpbAsset = Invoke-Gitea 'POST' $mcpbUrl ([IO.File]::ReadAllBytes($mcpbPath)) 'application/octet-stream' | ConvertFrom-Json + } +} + if ($created.html_url) { Write-Host $created.html_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 } Write-Host "Release $tag angelegt." diff --git a/scripts/release.sh b/scripts/release.sh index b68022c..a54f490 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -73,21 +73,38 @@ rm -f "$resp" rel_id="$(CREATED="$created" python3 -c 'import json,os; print(json.loads(os.environ["CREATED"])["id"])')" html="$(CREATED="$created" python3 -c 'import json,os; print(json.loads(os.environ["CREATED"]).get("html_url",""))')" -asset_resp="$(mktemp)" -code="$(curl -sS -o "$asset_resp" -w '%{http_code}' -X POST "$api/releases/$rel_id/assets?name=$zip_name" \ - -H "Authorization: token $GITEA_TOKEN" \ - -H "Content-Type: application/octet-stream" \ - --data-binary @"$zip_path")" -if [[ "$code" != "201" ]]; then - echo "API $code" >&2 - cat "$asset_resp" >&2 +upload_asset() { + local file_path="$1" file_name="$2" + local asset_resp code asset download + asset_resp="$(mktemp)" + code="$(curl -sS -o "$asset_resp" -w '%{http_code}' -X POST "$api/releases/$rel_id/assets?name=$file_name" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @"$file_path")" + if [[ "$code" != "201" ]]; then + echo "API $code" >&2 + cat "$asset_resp" >&2 + rm -f "$asset_resp" + exit 1 + fi + asset="$(cat "$asset_resp")" rm -f "$asset_resp" - exit 1 + download="$(ASSET="$asset" python3 -c 'import json,os; print(json.loads(os.environ["ASSET"]).get("browser_download_url",""))')" + [[ -n "$download" ]] && echo "$download" +} + +upload_asset "$zip_path" "$zip_name" + +mcpb_name="$name-v$version.mcpb" +mcpb_path="$DIST_DIR/$mcpb_name" +if [[ -f "$dir/extension/manifest.json" ]]; then + if [[ ! -f "$mcpb_path" ]]; then + bash "$(dirname "$0")/package-mcpb.sh" "$name" + fi + if [[ -f "$mcpb_path" ]]; then + upload_asset "$mcpb_path" "$mcpb_name" + fi fi -asset="$(cat "$asset_resp")" -rm -f "$asset_resp" -download="$(ASSET="$asset" python3 -c 'import json,os; print(json.loads(os.environ["ASSET"]).get("browser_download_url",""))')" [[ -n "$html" ]] && echo "$html" -[[ -n "$download" ]] && echo "$download" echo "Release $tag angelegt." diff --git a/scripts/update-index.ps1 b/scripts/update-index.ps1 index b5ba061..c0f4fdb 100644 --- a/scripts/update-index.ps1 +++ b/scripts/update-index.ps1 @@ -15,7 +15,7 @@ if ($start -lt 0 -or $end -lt $start) { exit 1 } -$table = @('| Skill | Kurzbeschreibung | Version | Doku | Download |', '|---|---|---|---|---|') +$table = @('| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) |', '|---|---|---|---|---|---|') foreach ($n in (Get-SkillNames)) { $dir = Join-Path $SkillsDir $n $desc = '' @@ -29,7 +29,13 @@ foreach ($n in (Get-SkillNames)) { } $desc = $desc.Replace('|', '\|') $ver = Get-SkillVersion $dir - $table += ('| [{0}](skills/{0}/) | {1} | {2} | [README](skills/{0}/README.md) | [{0}-v{2}.zip]({3}/releases/tag/{0}/v{2}) |' -f $n, $desc, $ver, $RepoWeb) + $tagEnc = [Uri]::EscapeDataString("$n/v$ver") + $zipLink = "[{0}-v{1}.zip]({2}/releases/download/{3}/{0}-v{1}.zip)" -f $n, $ver, $RepoWeb, $tagEnc + $mcpb = '' + if (Test-Path (Join-Path $dir 'extension\manifest.json')) { + $mcpb = "[{0}-v{1}.mcpb]({2}/releases/download/{3}/{0}-v{1}.mcpb)" -f $n, $ver, $RepoWeb, $tagEnc + } + $table += ('| [{0}](skills/{0}/) | {1} | {2} | [README](skills/{0}/README.md) | {3} | {4} |' -f $n, $desc, $ver, $zipLink, $mcpb) } $newLines = @() diff --git a/scripts/update-index.sh b/scripts/update-index.sh index e6536a6..a08a581 100755 --- a/scripts/update-index.sh +++ b/scripts/update-index.sh @@ -18,8 +18,8 @@ fi table="$(mktemp)" trap 'rm -f "$table"' EXIT { - echo "| Skill | Kurzbeschreibung | Version | Doku | Download |" - echo "|---|---|---|---|---|" + echo "| Skill | Kurzbeschreibung | Version | Doku | Download | Erweiterung (.mcpb) |" + echo "|---|---|---|---|---|---|" while IFS= read -r name; do [[ -z "$name" ]] && continue desc="" @@ -28,8 +28,14 @@ trap 'rm -f "$table"' EXIT desc="$(fm_value "$fm" description || true)" fi desc="${desc//|/\\|}" - printf '| [%s](skills/%s/) | %s | %s | [README](skills/%s/README.md) | [%s-v%s.zip](%s/releases/tag/%s/v%s) |\n' \ - "$name" "$name" "$desc" "$ver" "$name" "$name" "$ver" "$REPO_WEB" "$name" "$ver" + 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 + mcpb="[${name}-v${ver}.mcpb](${REPO_WEB}/releases/download/${tag_enc}/${name}-v${ver}.mcpb)" + fi + printf '| [%s](skills/%s/) | %s | %s | [README](skills/%s/README.md) | %s | %s |\n' \ + "$name" "$name" "$desc" "$ver" "$name" "$zip_link" "$mcpb" done < <(skill_names) } > "$table" diff --git a/skills/gridcraft-mcp/CHANGELOG.md b/skills/gridcraft-mcp/CHANGELOG.md index 59a6f1d..f0e1bc0 100644 --- a/skills/gridcraft-mcp/CHANGELOG.md +++ b/skills/gridcraft-mcp/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog – gridcraft-mcp +## 0.2.0 (2026-10-19) + +- Auslieferung als Claude-Desktop-Erweiterung (`.mcpb`) zusätzlich zum Skill-ZIP. +- Installation und Doku auf Erweiterung + ZIP umgestellt; manuelle Config nur noch als Entwickler-Alternative. +- Voraussetzung nennt die Erweiterung als Standardweg. +- Neue Falle: Text, der mit `=` beginnt, wird als Formel gelesen; Apostroph voranstellen. + ## 0.1.0 (2026-10-19) - Erstveröffentlichung, getestet mit GridCraft 0.8.0. diff --git a/skills/gridcraft-mcp/README.md b/skills/gridcraft-mcp/README.md index fd8e16c..a2febf4 100644 --- a/skills/gridcraft-mcp/README.md +++ b/skills/gridcraft-mcp/README.md @@ -8,61 +8,25 @@ Erstellt und bearbeitet Excel-Arbeitsmappen (`.xlsx`, `.csv`) über den MCP-Serv ## Voraussetzungen -- GridCraft inklusive `gridcraft-cli.exe` ist installiert. Der ArtCraft-Launcher legt die Dateien nach `C:\Program Files\GridCraft\` und trägt nichts in den PATH ein. -- Claude Desktop ist installiert. -- Der MCP-Server ist in der `claude_desktop_config.json` eingetragen. +- Claude Desktop (die App) +- Die Erweiterung `gridcraft-mcp-….mcpb` und dieses Skill-ZIP (siehe [Installation](#installation)) -**Keine Ordnerbeschränkung.** Anders als WordCraft kennt GridCraft keine `--automation-read-root` und `--automation-write-root`. 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. Der Skill weist Claude an, nie über ein Original zu speichern, sondern immer unter einem neuen Namen. +**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. ## Installation -Git ist nicht nötig. +Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz: -1. Das ZIP [gridcraft-mcp-v0.1.0.zip](https://git.gundel.dev/dg/claude-skills/releases/tag/gridcraft-mcp/v0.1.0) aus dem Release laden. -2. In Claude **„+“ → „Skill erstellen“ → „Skill hochladen“** wählen und das ZIP hochladen. +1. `gridcraft-mcp-v….mcpb` und `gridcraft-mcp-v….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. +2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren). +3. Skill-ZIP in Claude hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**. +4. Claude komplett beenden (auch Taskleiste) und neu starten. -## Einrichtung +**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. -In der bestehenden `claude_desktop_config.json` nur einen Eintrag innerhalb von `mcpServers` ergänzen. Bestehende Einträge, zum Beispiel `wordcraft`, bleiben unverändert. +## Enthaltene Software -```json -"gridcraft": { - "command": "C:\\Program Files\\GridCraft\\gridcraft-cli.exe", - "args": ["mcp"] -} -``` - -So sieht `mcpServers` aus, wenn WordCraft schon eingetragen ist. Den vorhandenen `wordcraft`-Block nicht durch dieses Beispiel ersetzen, nur `gridcraft` daneben setzen: - -```json -{ - "mcpServers": { - "wordcraft": { - "command": "C:\\Program Files\\WordCraft\\wordcraft-cli.exe", - "args": [ - "mcp", - "--author", "Claude", - "--automation-read-root", "C:\\Pfad\\zu\\Dokumente", - "--automation-write-root", "C:\\Pfad\\zu\\Dokumente\\claude_out" - ] - }, - "gridcraft": { - "command": "C:\\Program Files\\GridCraft\\gridcraft-cli.exe", - "args": ["mcp"] - } - } -} -``` - -## Einrichtung unter Windows – Stolpersteine - -Gemeinsame Punkte (Ort der Config, nur `mcpServers` ergänzen, App überschreibt die Datei): [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). - -- Der ArtCraft-Launcher installiert nach `C:\Program Files\GridCraft\` (`gridcraft.exe` und `gridcraft-cli.exe`) und trägt nichts in den PATH ein. `Get-Command gridcraft-cli` findet die Datei daher nicht; in die Config den vollen Pfad schreiben. Auffinden mit: - - ```powershell - Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "gridcraft-cli.exe" -ErrorAction SilentlyContinue - ``` +Die Erweiterung enthält `gridcraft-cli.exe` aus [GridCraft](https://github.com/storytold/gridcraft) 0.8.0 (MIT oder Apache-2.0). Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. ## Im Test geprüft @@ -80,15 +44,46 @@ Kurzfassung, die Einzelheiten stehen in [SKILL.md](SKILL.md): ## Test -Neuen Chat öffnen und fragen: „Sind die GridCraft-Tools verfügbar? Lies A1:E10 aus .“ +Neuen Chat öffnen und fragen: „Sind die GridCraft-Tools verfügbar? Lies A1:E10 aus \.“ -Fehlen die Tools, zuerst den Eintrag in der Config prüfen. Nicht auf ein anderes Programm ausweichen. +Fehlen die Tools: Einstellungen → Erweiterungen – ist die Erweiterung eingeschaltet? Dann Claude komplett neu starten. + +## Stolpersteine + +- Erweiterungen sind nicht signiert; bei Defender-Warnung an Dominic wenden. +- Formeln mit deutschen Namen ergeben `#NAME?` – englische Funktionsnamen verlangen. ## Deinstallation/Update -Deinstallation: In Claude den Skill aus der Liste entfernen. Den Block `gridcraft` unter `mcpServers` nur löschen, wenn GridCraft nicht mehr benutzt wird. Andere Einträge in der Config nicht anfassen. +Deinstallation: Einstellungen → Erweiterungen → entfernen; Skill in der Skill-Liste löschen. -Update: das ZIP der neuen Version aus dem Release laden und wie bei der Installation hochladen. Liegt die alte Fassung noch in Claude, diese vorher entfernen. +Update: neue `.mcpb` und Skill-ZIP installieren, bestehende Version ersetzen lassen, Claude neu starten. + +## 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). + +- Claude-Installer: `%APPDATA%\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 +{ + "mcpServers": { + "gridcraft": { + "command": "C:\\Program Files\\GridCraft\\gridcraft-cli.exe", + "args": ["mcp"] + } + } +} +``` + +Auffinden der EXE: + +```powershell +Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "gridcraft-cli.exe" -ErrorAction SilentlyContinue +``` ## Änderungen diff --git a/skills/gridcraft-mcp/SKILL.md b/skills/gridcraft-mcp/SKILL.md index 89d4b4a..2ef4394 100644 --- a/skills/gridcraft-mcp/SKILL.md +++ b/skills/gridcraft-mcp/SKILL.md @@ -9,7 +9,11 @@ GridCraft ist eine Open-Source-Tabellenkalkulation (Rust), die Excel-Parität an ## Voraussetzung -Der MCP-Server muss verbunden sein (Tools wie `write_range`, `read_range`, `execute_command`). Je nach Client heißen sie mit Präfix, z. B. `mcp__…__gridcraft__write_range`; sind sie zurückgestellt, erst per ToolSearch laden. Fehlen sie, dem Nutzer sagen, dass der Server nicht läuft (Claude-App komplett neu starten, Eintrag in `claude_desktop_config.json` prüfen – die App kann ihn beim Speichern eigener Einstellungen überschreiben), statt auf etwas anderes auszuweichen. +Der MCP-Server muss verbunden sein (Tools wie `write_range`, `read_range`, `execute_command`). Je nach Client heißen sie mit Präfix, z. B. `mcp__…__gridcraft__write_range`; sind sie zurückgestellt, erst per ToolSearch laden. Fehlen sie, dem Nutzer sagen, dass der Server nicht läuft, statt auf etwas anderes auszuweichen. + +**Standardweg:** die Claude-Desktop-Erweiterung „GridCraft für Claude“ ist installiert und eingeschaltet (siehe `docs/INSTALLATION.md`). Fehlen die Tools: Einstellungen → Erweiterungen prüfen, Claude komplett beenden (auch Taskleiste) und neu starten. + +**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. @@ -53,6 +57,7 @@ Bereiche mit Blatt: `"Kalkulation!A3:E8"`. - **Datumswerte als ISO** (`"2026-10-19"`) oder `=DATE(2026,10,19)`. `"19.10.2026"` wird zu Text. Danach Zahlenformat setzen: `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“. - **Neue Mappe = US-Letter, Blatt heißt `Sheet1`:** für deutsche Dokumente `pageLayout.size {paper: "A4"}` und `sheet.rename {sheet: "Sheet1", name: "…"}`. +- **Text, der mit `=` beginnt, wird als Formel gelesen.** Beschriftungen wie `= Materialkosten` ergeben `#NAME?`. Wie in Excel einen Apostroph voranstellen: `"'= Materialkosten"` – gespeichert wird reiner Text. ## Weitere Fallen diff --git a/skills/gridcraft-mcp/extension/LICENSES/LICENSE-APACHE b/skills/gridcraft-mcp/extension/LICENSES/LICENSE-APACHE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/skills/gridcraft-mcp/extension/LICENSES/LICENSE-APACHE @@ -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 diff --git a/skills/gridcraft-mcp/extension/LICENSES/LICENSE-MIT b/skills/gridcraft-mcp/extension/LICENSES/LICENSE-MIT new file mode 100644 index 0000000..eba4152 --- /dev/null +++ b/skills/gridcraft-mcp/extension/LICENSES/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ArtCraft Team and the GridCraft 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. diff --git a/skills/gridcraft-mcp/extension/LICENSES/NOTICE b/skills/gridcraft-mcp/extension/LICENSES/NOTICE new file mode 100644 index 0000000..1e3668b --- /dev/null +++ b/skills/gridcraft-mcp/extension/LICENSES/NOTICE @@ -0,0 +1,16 @@ +GridCraft +Copyright (c) 2026 ArtCraft Team and the GridCraft 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. + +None: every bundled asset is original to GridCraft. Builds made with craft-fonts +(CRAFT_FONTS_DIR) embed the fonts listed in ATTRIBUTION.md under the SIL Open Font License 1.1. diff --git a/skills/gridcraft-mcp/extension/icon.png b/skills/gridcraft-mcp/extension/icon.png new file mode 100644 index 0000000..3ac5a0c Binary files /dev/null and b/skills/gridcraft-mcp/extension/icon.png differ diff --git a/skills/gridcraft-mcp/extension/manifest.json b/skills/gridcraft-mcp/extension/manifest.json new file mode 100644 index 0000000..b88eb18 --- /dev/null +++ b/skills/gridcraft-mcp/extension/manifest.json @@ -0,0 +1,118 @@ +{ + "manifest_version": "0.3", + "name": "gridcraft-mcp", + "display_name": "GridCraft für Claude", + "version": "0.2.0", + "description": "Excel-Arbeitsmappen (.xlsx, .csv) erstellen und bearbeiten. Getestet mit GridCraft 0.8.0. Ohne Ordnersperre – GridCraft kann alle Dateien lesen und schreiben, auf die der Benutzer Zugriff hat.", + "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/gridcraft-cli.exe", + "mcp_config": { + "command": "${__dirname}/server/gridcraft-cli.exe", + "args": [ + "mcp" + ] + } + }, + "tools": [ + { + "name": "execute_command", + "description": "Run ANY GridCraft command by id with JSON params — every ribbon/menu action is a command. Find ids and parameter docs with list_commands. Examples: {\"command\":\"cell.set\",\"params\":{\"cell\":\"B2\",\"input\":\"=SUM(A1:A9)\"}}; {" + }, + { + "name": "list_commands", + "description": "List GridCraft commands: id, label, ribbon path, shortcut, a parameter description (`params`) and whether it can run right now. Use it to discover what execute_command can do (e.g. search \"sort\", \"border\", \"chart\", \"shee" + }, + { + "name": "inspect_workbook", + "description": "Summary of the active workbook: title, path, dirty flag, sheets (name, used range, cell count, tables, charts, merges, filters, freeze panes), defined names, current selection and active cell, calculation mode and undo/r" + }, + { + "name": "read_range", + "description": "Read cell values from a range as rows (2-D array). Numbers/booleans/strings are returned as JSON values, empty cells as null, errors as {\"error\":\"#DIV/0!\"}. Without `range`, reads the sheet's used range. formulas:true re" + }, + { + "name": "write_range", + "description": "Write a 2-D array of values starting at the top-left cell of `range` (rows of cells). Numbers, booleans, null (clears) and strings are accepted; strings starting with = are formulas (\"=SUM(B2:B4)\"), other strings are par" + }, + { + "name": "set_cell", + "description": "Enter one cell exactly as if typed: a number, text, or a formula starting with = (\"=AVERAGE(B2:B9)\"). Dependent cells recalculate. Returns the command result; use get_cell to read the computed value." + }, + { + "name": "get_cell", + "description": "Details of one cell: computed value and type, formula, display text, raw input, spill range, style, merge, comment and hyperlink." + }, + { + "name": "evaluate_formula", + "description": "Evaluate a formula against the active sheet WITHOUT changing any cell, e.g. \"=SUM(B2:B10)/COUNT(B2:B10)\" or \"=VLOOKUP(\\\"x\\\",A:B,2,FALSE)\". `cell` sets the formula's position for relative references and ROW()/COLUMN()." + }, + { + "name": "select", + "description": "Set the selection (what commands without a `range` param act on). Multiple areas with commas: \"A1:B2,D4\". A \"Sheet2!A1\" prefix switches sheets." + }, + { + "name": "format_range", + "description": "Apply several formats to a range in one call: bold, italic, underline, font name/size, font color, fill color, number format, horizontal alignment, wrap, borders. Colors are \"#RRGGBB\" (fontColor also \"auto\", fillColor al" + }, + { + "name": "insert_chart", + "description": "Insert a chart from a data range (first row/column used as series names and categories, like Excel). Returns the chart id." + }, + { + "name": "create_table", + "description": "Format a range as an Excel table (structured references, banded rows, filter buttons). The first row is the header by default." + }, + { + "name": "sort_range", + "description": "Sort a range by one or more columns. keys: [{\"column\":\"B\",\"order\":\"desc\"}, …] or just [\"B\"]. Without `range` the current region around the selection is sorted; header detection follows Excel unless `header` is given." + }, + { + "name": "filter", + "description": "Filter rows by a column (turns on AutoFilter on the current region, or `range`, when needed). Give `values` (keep rows whose cell text is one of them), `custom` ({op:\">\", value:\"10\", op2?, value2?, and?}), `top` ({count," + }, + { + "name": "open_workbook", + "description": "Open a workbook file (.xlsx, .xlsm, .xls, .xlsb, .ods, .csv, .tsv, .txt, .json) and make it active. Excel 97-2003 .xls imports values, formulas and number formats; XLSB and ODS import worksheet data and cached formula va" + }, + { + "name": "save_workbook", + "description": "Save the active workbook. The format follows the extension (.xlsx default; .csv/.tsv save the active sheet; .json; .html). Without `path` saves to the workbook's current file." + }, + { + "name": "new_workbook", + "description": "Create a new workbook and make it active: blank, or a built-in sample (\"budget\", \"sales\", \"grades\")." + }, + { + "name": "undo", + "description": "Undo the last change(s) to the active workbook." + }, + { + "name": "redo", + "description": "Redo the last undone change(s)." + }, + { + "name": "screenshot", + "description": "Save a PNG screenshot of the GridCraft window to `path`. Desktop app only (`gridcraft-cli mcp --connect 7979`)." + }, + { + "name": "list_functions", + "description": "List worksheet functions: name, category, signature and description. Filter with `search` (name or description) or `category`." + } + ] +} diff --git a/skills/gridcraft-mcp/extension/upstream.json b/skills/gridcraft-mcp/extension/upstream.json new file mode 100644 index 0000000..9043280 --- /dev/null +++ b/skills/gridcraft-mcp/extension/upstream.json @@ -0,0 +1,9 @@ +{ + "sha256": "2eafa6b8d08357fb44610e030ebe54491b5abc1329da3d748878228a868d779a", + "version": "0.8.0", + "source": "ArtCraft-Launcher", + "repository": "https://github.com/storytold/gridcraft", + "exe": "gridcraft-cli.exe", + "path": "C:\\Program Files\\GridCraft\\gridcraft-cli.exe", + "tag": "v0.8.0" +} diff --git a/skills/wordcraft-mcp/CHANGELOG.md b/skills/wordcraft-mcp/CHANGELOG.md index b3938ac..fab57fd 100644 --- a/skills/wordcraft-mcp/CHANGELOG.md +++ b/skills/wordcraft-mcp/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog – wordcraft-mcp +## 0.2.0 (2026-10-19) + +- Auslieferung als Claude-Desktop-Erweiterung (`.mcpb`) zusätzlich zum Skill-ZIP. +- Installation und Doku auf Erweiterung + ZIP umgestellt; manuelle Config nur noch als Entwickler-Alternative. +- `description` ohne Verweis auf `wordcraft-dokumente`; Voraussetzung nennt die Erweiterung als Standardweg. + ## 0.1.1 (2026-10-19) - Doku: eigene README mit Windows-Stolpersteinen; ZIP über Release. diff --git a/skills/wordcraft-mcp/README.md b/skills/wordcraft-mcp/README.md index bdcbb60..37a7add 100644 --- a/skills/wordcraft-mcp/README.md +++ b/skills/wordcraft-mcp/README.md @@ -8,27 +8,57 @@ Erstellt, bearbeitet und prüft Word-Dokumente über den MCP-Server von WordCraf ## Voraussetzungen -- WordCraft mit `wordcraft-cli` ist installiert. -- Der MCP-Server ist in der `claude_desktop_config.json` eingetragen und über `--automation-read-root` und `--automation-write-root` auf Ordner beschränkt. -- Der Ordner aus `--automation-write-root` existiert bereits. -- Falls der Plugin-Skill `wordcraft-dokumente` installiert ist: deaktivieren, damit Claude `wordcraft-mcp` verwendet. +- Claude Desktop (die App) +- Die Erweiterung `wordcraft-mcp-….mcpb` und dieses Skill-ZIP (siehe [Installation](#installation)) + +Falls der Plugin-Skill `wordcraft-dokumente` installiert ist: deaktivieren, damit Claude `wordcraft-mcp` verwendet. ## Installation -Git ist nicht nötig. +Schritt-für-Schritt: [docs/INSTALLATION.md](../../docs/INSTALLATION.md). Kurz: -1. Das ZIP [wordcraft-mcp-v0.1.1.zip](https://git.gundel.dev/dg/claude-skills/releases/tag/wordcraft-mcp/v0.1.1) aus dem Release laden. -2. In Claude **„+“ → „Skill erstellen“ → „Skill hochladen“** wählen und das ZIP hochladen. +1. `wordcraft-mcp-v….mcpb` und `wordcraft-mcp-v….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. +2. Die `.mcpb` doppelklicken (oder über Einstellungen → Erweiterungen installieren). Lese- und Schreib-Ordner setzen; Schreibordner vorher anlegen und nicht gleich dem Leseordner wählen. +3. Skill-ZIP in Claude hochladen: **„+“ → „Skill erstellen“ → „Skill hochladen“**. +4. Claude komplett beenden (auch Taskleiste) und neu starten. -## Einrichtung +**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. -In die bestehende `claude_desktop_config.json` nur den Block `mcpServers` einfügen. Platzhalter durch die eigenen Pfade ersetzen. Beispiel für den vollen Pfad nach der Installation durch den ArtCraft-Launcher: `C:\\Program Files\\WordCraft\\wordcraft-cli.exe`. +## Enthaltene Software + +Die Erweiterung enthält `wordcraft-cli.exe` aus [WordCraft](https://github.com/storytold/wordcraft) 0.8.0 (MIT oder Apache-2.0). Lizenztexte liegen in der `.mcpb` unter `LICENSES/`. + +## Test + +Neuen Chat öffnen und fragen: „Sind die WordCraft-Tools verfügbar?“ + +Fehlen die Tools: Einstellungen → Erweiterungen – ist die Erweiterung eingeschaltet? Dann Claude komplett neu starten. + +## Stolpersteine + +- Speichern mit „path rejected“: Ziel lag außerhalb des Schreib-Ordners. Einstellungen → Erweiterungen → WordCraft für Claude → Einstellungen prüfen. +- Erweiterungen sind nicht signiert; bei Defender-Warnung an Dominic wenden. + +## Deinstallation/Update + +Deinstallation: Einstellungen → Erweiterungen → entfernen; Skill in der Skill-Liste löschen. + +Update: neue `.mcpb` und Skill-ZIP installieren, bestehende Version ersetzen lassen, Claude neu starten. + +## 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). + +- 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) + +WordCraft muss über den ArtCraft-Launcher installiert sein (`C:\Program Files\WordCraft\wordcraft-cli.exe`). Der Schreibordner muss vorher existieren. ```json { "mcpServers": { "wordcraft": { - "command": "C:\\Pfad\\zu\\WordCraft\\wordcraft-cli.exe", + "command": "C:\\Program Files\\WordCraft\\wordcraft-cli.exe", "args": [ "mcp", "--author", "Claude", @@ -40,29 +70,11 @@ In die bestehende `claude_desktop_config.json` nur den Block `mcpServers` einfü } ``` -## Einrichtung unter Windows – Stolpersteine +Auffinden der EXE: -Gemeinsame Punkte (Ort der Config, nur `mcpServers` ergänzen, App überschreibt die Datei): [MCP unter Windows einrichten](../../docs/windows-mcp-einrichtung.md). - -- Der ArtCraft-Launcher installiert nach `C:\Program Files\WordCraft\` (`wordcraft.exe` und `wordcraft-cli.exe`) und trägt nichts in den PATH ein. `Get-Command wordcraft-cli` findet die Datei daher nicht; in die Config den vollen Pfad schreiben. Auffinden mit: - - ```powershell - Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "wordcraft-cli.exe" -ErrorAction SilentlyContinue - ``` - -- Der Ordner aus `--automation-write-root` muss vorher existieren, sonst startet der Server nicht. - -## Test - -Neuen Chat öffnen und fragen: „Sind die WordCraft-Tools verfügbar?“ - -Fehlen die Tools, zuerst den Eintrag in der Config prüfen. Nicht auf ein anderes Programm ausweichen. - -## Deinstallation/Update - -Deinstallation: In Claude den Skill aus der Liste entfernen. Den Block `wordcraft` unter `mcpServers` nur löschen, wenn WordCraft nicht mehr benutzt wird. Andere Einträge in der Config nicht anfassen. - -Update: das ZIP der neuen Version aus dem Release laden und wie bei der Installation hochladen. Liegt die alte Fassung noch in Claude, diese vorher entfernen. +```powershell +Get-ChildItem "$env:ProgramFiles","$env:LOCALAPPDATA" -Recurse -Filter "wordcraft-cli.exe" -ErrorAction SilentlyContinue +``` ## Änderungen diff --git a/skills/wordcraft-mcp/SKILL.md b/skills/wordcraft-mcp/SKILL.md index 95d6d28..bcc3a1e 100644 --- a/skills/wordcraft-mcp/SKILL.md +++ b/skills/wordcraft-mcp/SKILL.md @@ -1,6 +1,6 @@ --- name: wordcraft-mcp -description: Word-Dokumente (.docx, .odt, .md, PDF) über den WordCraft-MCP-Server erstellen, bearbeiten und prüfen, inkl. Nachverfolgung – mit erprobten Fallen aus WordCraft 0.8.0; statt wordcraft-dokumente verwenden. +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. --- # Dokumente mit WordCraft (MCP) @@ -11,10 +11,9 @@ WordCraft ist ein Open-Source-Textverarbeitungsprogramm (Rust), das Word-Paritä Der MCP-Server muss verbunden sein (Tools wie `execute`, `list_commands`, `render_page`). In claude.ai heißen sie `mcp__claude-device__lcl-wordcraft-*` und sind oft **deferred**: zuerst per ToolSearch laden (`select:mcp__claude-device__lcl-wordcraft-list_commands,...`, alle benötigten in einem Aufruf). Fehlen sie auch dann, dem Nutzer den Grund nennen statt auszuweichen. -Einrichtung (Windows, Store-App): Eintrag "wordcraft" in `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`: -`wordcraft-cli.exe mcp --author Claude --automation-read-root --automation-write-root \claude_out` +**Standardweg:** die Claude-Desktop-Erweiterung „WordCraft für Claude“ ist installiert und eingeschaltet (siehe `docs/INSTALLATION.md`). Fehlen die Tools: Einstellungen → Erweiterungen prüfen, Claude komplett beenden (auch Taskleiste) und neu starten – nicht auf ein anderes Programm ausweichen. -**Achtung:** Die Claude-App überschreibt diese Datei, wenn sie im laufenden Betrieb Einstellungen speichert. Fehlt der Eintrag, neu eintragen und die App sofort neu starten. +**Alternative (Entwickler):** Eintrag `wordcraft` in `claude_desktop_config.json` mit `wordcraft-cli.exe mcp --author Claude --automation-read-root --automation-write-root \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`. diff --git a/skills/wordcraft-mcp/extension/LICENSES/LICENSE-APACHE b/skills/wordcraft-mcp/extension/LICENSES/LICENSE-APACHE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/skills/wordcraft-mcp/extension/LICENSES/LICENSE-APACHE @@ -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 diff --git a/skills/wordcraft-mcp/extension/LICENSES/LICENSE-MIT b/skills/wordcraft-mcp/extension/LICENSES/LICENSE-MIT new file mode 100644 index 0000000..c2c4a1c --- /dev/null +++ b/skills/wordcraft-mcp/extension/LICENSES/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ArtCraft Team and the WordCraft 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. diff --git a/skills/wordcraft-mcp/extension/LICENSES/NOTICE b/skills/wordcraft-mcp/extension/LICENSES/NOTICE new file mode 100644 index 0000000..3cd8077 --- /dev/null +++ b/skills/wordcraft-mcp/extension/LICENSES/NOTICE @@ -0,0 +1,86 @@ +WordCraft +Copyright (c) 2026 ArtCraft Team and the WordCraft 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. + +- 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. +- Japanese fonts (craft-fonts): builds made with craft-fonts (CRAFT_FONTS_DIR; all official + releases) embed the fonts listed in + https://github.com/storytold/craft-fonts/blob/main/ATTRIBUTION.md (BIZ UDPGothic, BIZ UDMincho, + Shippori Mincho), under the SIL Open Font License 1.1. Their licence texts ship with the + packages as OFL-.txt. Builds without CRAFT_FONTS_DIR do not include them. +- English word list (assets/hyphenation/en-us.dic) — derived from the Moby Hyphenator II list by + Grady Ward, public domain (Project Gutenberg eBook #3204). The hyphenation patterns + (assets/hyphenation/en-us.pat) were trained from it and are released as CC0-1.0. +- Polish hyphenation patterns (assets/hyphenation/pl.pat) — hyph-pl.tex from the hyph-utf8 + package, Copyright (C) 1987-1995 Hanna Kołodziejska, Bogusław Jackowski, Marek Ryćko, bundled + unmodified and used under the MIT License; the copyright and permission notice is in the file. +- Portuguese hyphenation patterns (assets/hyphenation/pt.pat) — hyph-pt.tex from the hyph-utf8 + package, bundled unmodified and used under the BSD 3-Clause License: + + Copyright (C) 1987, 1994, 1996, 2015 Pedro J. de Rezende, 1996, 2015 J. Joao Dias Almeida, + 2024 Leonardo Araujo and Aline Benevides + + 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 the University of Campinas, of the University of Minho 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 PEDRO + J. DE REZENDE OR J.JOAO DIAS ALMEIDA 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. +- Italian hyphenation patterns (assets/hyphenation/it.pat) — hyph-it.tex from the hyph-utf8 + package, Copyright (C) 2008-2011 Claudio Beccari, bundled unmodified and used under the MIT + License (offered under LPPL 1.3+ or MIT); the copyright and permission notice is in the file: + + Copyright (C) 2008-2011 Claudio Beccari + + 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. +- All UI icons are drawn in code (crates/ui-egui/src/icons.rs) and are original work, MIT OR Apache-2.0. + +Rust dependencies (egui, eframe, vello_cpu, skrifa, harfrust, krilla, quick-xml, zip, image, …) +are permissively licensed (MIT/Apache-2.0/BSD/ISC/Zlib) and fetched through crates.io or pinned Git sources. +The craft-pdf writer and Krilla 0.8.2 backend are pinned to storytold/craft-libs revision +c3487320b2d1de657b860b3c8abb44e1f2b32bd8. The backend retains its MIT OR Apache-2.0 licensing +and upstream bundled material; see that revision's licenses/pdf-writer/ and ATTRIBUTION.md. +The backend patch prevents finalization during an unwind and rejects a writer after failed +cleanup. WordCraft enables only writing; PDF import and its image decoders are not enabled. + +No Microsoft, Adobe, Avid or Autodesk icons, images, templates or artwork are included. diff --git a/skills/wordcraft-mcp/extension/icon.png b/skills/wordcraft-mcp/extension/icon.png new file mode 100644 index 0000000..4f77a30 Binary files /dev/null and b/skills/wordcraft-mcp/extension/icon.png differ diff --git a/skills/wordcraft-mcp/extension/manifest.json b/skills/wordcraft-mcp/extension/manifest.json new file mode 100644 index 0000000..2cba1c5 --- /dev/null +++ b/skills/wordcraft-mcp/extension/manifest.json @@ -0,0 +1,126 @@ +{ + "manifest_version": "0.3", + "name": "wordcraft-mcp", + "display_name": "WordCraft für Claude", + "version": "0.2.0", + "description": "Word-Dokumente (.docx, .odt, .md, PDF) erstellen und bearbeiten. Getestet mit WordCraft 0.8.0.", + "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/wordcraft-cli.exe", + "mcp_config": { + "command": "${__dirname}/server/wordcraft-cli.exe", + "args": [ + "mcp", + "--author", + "${user_config.author}", + "--automation-read-root", + "${user_config.read_root}", + "--automation-write-root", + "${user_config.write_root}" + ] + } + }, + "tools": [ + { + "name": "list_commands", + "description": "Every WordCraft command: id, label, ribbon location, shortcut and params. Filter with `query`." + }, + { + "name": "execute", + "description": "Run one command by id with params, e.g. {command:\"format.bold\"} or {command:\"insert.table\", params:{rows:3, cols:4}}." + }, + { + "name": "batch", + "description": "Run commands in order; stops at the first error unless keepGoing." + }, + { + "name": "new_document", + "description": "Start a document: blank, sample, letter, resume or report." + }, + { + "name": "open_document", + "description": "Open a .docx, .doc, .odt, .rtf, .md, .tex, .html, .txt or .json file, or any other text file (.m3u, .log, .ini…) as plain text." + }, + { + "name": "save_document", + "description": "Save (format from the extension: docx, pdf, odt, rtf, html, md, tex, txt, png)." + }, + { + "name": "type_text", + "description": "Type at the caret (replacing the selection). Use \\n... for line breaks inside text; use execute text.newParagraph for new paragraphs, or `paragraphs: true` to split lines into paragraphs." + }, + { + "name": "select_text", + "description": "Select the n-th occurrence of some text." + }, + { + "name": "get_text", + "description": "Body text with tracked deletions omitted." + }, + { + "name": "inspect_document", + "description": "Structure: blocks with text, styles, formatting runs, lists, tables, sections, parts, selection, pages." + }, + { + "name": "render_page", + "description": "Render a page to PNG to look at the result." + }, + { + "name": "parity", + "description": "WordCraft's command coverage of the word-processor feature catalog." + }, + { + "name": "screenshot", + "description": "Screenshot of the whole WordCraft window (desktop app only)." + }, + { + "name": "click", + "description": "Click at window coordinates (desktop app only)." + }, + { + "name": "key", + "description": "Press a key with modifiers (desktop app only), e.g. {key:\"B\", cmd:true}." + }, + { + "name": "ui_inspect", + "description": "UI state: tab, panes, dialog, page rectangles on screen, caret (desktop app only)." + } + ], + "user_config": { + "read_root": { + "type": "directory", + "title": "Lese-Ordner", + "description": "Hier darf Claude Dokumente lesen.", + "required": true, + "default": "${HOME}/Documents" + }, + "write_root": { + "type": "directory", + "title": "Schreib-Ordner", + "description": "Nur hier darf Claude speichern. Eigenen Ordner wählen, z. B. Dokumente\\Claude-Ausgabe – nicht den Lese-Ordner.", + "required": true + }, + "author": { + "type": "string", + "title": "Autorname für Änderungen", + "description": "Name für nachverfolgte Änderungen und Kommentare.", + "required": false, + "default": "Claude" + } + } +} diff --git a/skills/wordcraft-mcp/extension/upstream.json b/skills/wordcraft-mcp/extension/upstream.json new file mode 100644 index 0000000..444381f --- /dev/null +++ b/skills/wordcraft-mcp/extension/upstream.json @@ -0,0 +1,9 @@ +{ + "sha256": "58716716647575ab68d1638f0b0a5b37b62f05cb4ed896614e7e98da5801221a", + "version": "0.8.0", + "source": "ArtCraft-Launcher", + "repository": "https://github.com/storytold/wordcraft", + "exe": "wordcraft-cli.exe", + "path": "C:\\Program Files\\WordCraft\\wordcraft-cli.exe", + "tag": "v0.8.0" +} diff --git a/templates/skill/README.md b/templates/skill/README.md index 12f3b09..4ca7609 100644 --- a/templates/skill/README.md +++ b/templates/skill/README.md @@ -17,6 +17,8 @@ Git ist nicht nötig. 1. Das ZIP aus dem Release in der [Übersicht](../../README.md) laden. 2. In Claude **„+“ → „Skill erstellen“ → „Skill hochladen“** wählen und das ZIP hochladen. +Hat der Skill einen Ordner `extension/`, zusätzlich die `.mcpb` aus demselben Release installieren und auf [docs/INSTALLATION.md](../../docs/INSTALLATION.md) verweisen. Die manuelle Config gehört dann ans Ende unter „Alternative: manuell (für Entwickler)“. + ## Einrichtung Welche Config, Umgebungsvariablen oder Ordner nötig sind. Konkrete Pfade und Beispiele, keine allgemeinen Ratschläge.