# Kuonen.PDFTools MCP-Server - Installer fuer Claude Desktop. # Einzeiler: irm http://pdftools.kuonen.org/install-mcp.ps1 | iex $ErrorActionPreference = 'Stop' $base = 'http://pdftools.kuonen.org' Write-Host 'Kuonen.PDFTools MCP-Server wird installiert...' # 0) Laeuft Claude Desktop? Dann merken (fuer den automatischen Neustart) und die AppUserModelID # ermitteln. Claude Desktop laedt MCP-Server NUR beim Start; damit du nicht von Hand neu starten # musst, beenden wir es gleich sauber, schreiben die Config und starten es am Ende wieder. $claudeRunning = @(Get-Process -Name 'claude' -ErrorAction SilentlyContinue).Count -gt 0 $aumid = $null try { $aumid = (Get-StartApps | Where-Object { $_.Name -like '*Claude*' } | Select-Object -First 1 -ExpandProperty AppID) } catch { } # 1) Programm-Ordner. Das trainierte OCR-Modell liegt DANEBEN (mcp-ocr-model.json) und wird NICHT angetastet. $root = Join-Path $env:LOCALAPPDATA 'Kuonen.PDFTools' $dir = Join-Path $root 'mcp' $exe = Join-Path $dir 'Kuonen.PDFTools.Mcp.exe' New-Item -ItemType Directory -Force -Path $dir | Out-Null # 2) Claude Desktop BEENDEN, bevor Config UND EXE geschrieben werden (die laufende App wuerde sonst # die Config wieder ueberschreiben und die EXE sperren). if ($claudeRunning) { Write-Host ' Beende Claude Desktop (wird am Ende automatisch neu gestartet)...' Get-Process -Name 'claude' -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue for ($i = 0; $i -lt 40 -and (Get-Process -Name 'claude' -ErrorAction SilentlyContinue); $i++) { Start-Sleep -Milliseconds 250 } Start-Sleep -Milliseconds 500 } # 3) Die self-contained EXE laden (kein .NET-SDK noetig). Ueberschreibt nur das PROGRAMM. Write-Host " Lade Server von $base/download/mcp ..." Invoke-WebRequest -Uri "$base/download/mcp" -OutFile $exe -UseBasicParsing try { Unblock-File $exe } catch { } # 3b) Auto-Update AKTIVIEREN: die mcp-update.json neben die EXE legen. Beim naechsten Start prueft der # Server best-effort DENSELBEN Server, von dem installiert wurde (latest.json), auf eine neuere # Version und legt sie fuer den uebernaechsten Start bereit; offline wird still uebersprungen. # (Beim Neuinstallieren bewusst wieder AN — so ist immer die neueste Version aktiv.) $updatePath = Join-Path $dir 'mcp-update.json' "{ ""enabled"": true, ""manifestUrl"": ""$base/downloads/latest.json"" }" | Set-Content -Path $updatePath -Encoding UTF8 # 4) Arbeitsordner (relative Pfade loesen sich dagegen auf; jederzeit per 'set_workdir' aenderbar). # Ein bereits gesetzter Arbeitsordner (mcp-workdir.txt) hat Vorrang und bleibt unangetastet. $workdir = Join-Path ([Environment]::GetFolderPath('MyDocuments')) 'PDFTools' New-Item -ItemType Directory -Force -Path $workdir | Out-Null # 5) Claude-Desktop-Konfiguration BEHUTSAM ergaenzen: Backup zuerst, nur der eine Server-Eintrag, # alle uebrigen Einstellungen und Server bleiben erhalten. $cfgPath = Join-Path $env:APPDATA 'Claude\claude_desktop_config.json' if (Test-Path $cfgPath) { Copy-Item $cfgPath ($cfgPath + '.bak-' + (Get-Date -Format 'yyyyMMdd-HHmmss')) $cfg = Get-Content $cfgPath -Raw | ConvertFrom-Json } else { New-Item -ItemType Directory -Force -Path (Split-Path $cfgPath) | Out-Null $cfg = [pscustomobject]@{} } if (-not $cfg.PSObject.Properties['mcpServers']) { $cfg | Add-Member -NotePropertyName 'mcpServers' -NotePropertyValue ([pscustomobject]@{}) -Force } $entry = [pscustomobject]@{ command = $exe args = @() env = [pscustomobject]@{ KUONEN_MCP_WORKDIR = $workdir } } $cfg.mcpServers | Add-Member -NotePropertyName 'kuonen-pdftools' -NotePropertyValue $entry -Force ($cfg | ConvertTo-Json -Depth 32) | Set-Content -Path $cfgPath -Encoding UTF8 # 6) Claude Desktop wieder starten (nur wenn es vorher lief) - ueber die AppUserModelID, weil es eine # Store/MSIX-App ist (der EXE-Pfad aendert sich bei Updates). $restarted = $false if ($claudeRunning) { if ($aumid) { Write-Host ' Starte Claude Desktop neu...' try { Start-Process "shell:AppsFolder\$aumid"; $restarted = $true } catch { } } } Write-Host '' Write-Host 'Fertig.' Write-Host " Server: $exe" Write-Host " Arbeitsordner: $workdir" Write-Host '' if ($restarted) { Write-Host 'Claude Desktop wurde automatisch neu gestartet - der Server ist gleich verfuegbar.' } else { Write-Host 'Starte Claude Desktop, damit der Server geladen wird.' } Write-Host 'Hinweis: ocr_folder/refine brauchen Tesseract (separat installieren); alles andere laeuft ohne.'