#!/bin/sh # Barry MCP — Einrichtung in einem Befehl. # # ⛔ Diese Datei verhindert genau die Fehler, in die wir beim ersten Versuch # selbst gelaufen sind: # # - das Programm lag in /tmp und war nach dem Neustart weg # - es war nicht im PATH, und Claude Code meldete «command not found» # - macOS haelt heruntergeladene Programme in Quarantaene # - der Geltungsbereich war das Projekt statt der Benutzer # - der Neustart wurde vergessen # # Jeder dieser Punkte hat uns Minuten gekostet. Ein Kunde haette aufgegeben. set -eu BASIS="${BARRY_MCP_BASIS:-https://mcp.barry.build}" ZIEL="${BARRY_MCP_ZIEL:-$HOME/.local/bin}" sagen() { printf '%s\n' "$*"; } abbruch() { printf '\n✗ %s\n' "$*" >&2; exit 1; } # --- 1. Plattform erkennen ------------------------------------------------- # ⛔ Unbekannt heisst ABBRUCH, nicht «wir nehmen mal amd64». Ein Programm fuer # die falsche Architektur scheitert mit «cannot execute binary file», und das # sucht niemand beim Installationsprogramm. os="$(uname -s)" arch="$(uname -m)" case "$os" in Darwin) os=darwin ;; Linux) os=linux ;; *) abbruch "Barry MCP gibt es für Linux und macOS. Auf Windows lade die Datei barry-mcp-windows-amd64.exe von $BASIS und leg sie in deinen PATH." ;; esac case "$arch" in arm64|aarch64) arch=arm64 ;; x86_64|amd64) arch=amd64 ;; *) abbruch "Diese Architektur ($arch) kennt Barry nicht. Melde dich bei uns." ;; esac datei="barry-mcp-$os-$arch" sagen "Plattform: $os/$arch" # --- 2. Herunterladen ------------------------------------------------------ # In ein temporaeres Verzeichnis, das AUFGERAEUMT wird -- auch beim Abbruch. # Ein halb heruntergeladenes Programm im Zielverzeichnis waere schlimmer als # keines: es liegt im PATH und tut nicht, was es soll. tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT INT TERM if command -v curl >/dev/null 2>&1; then hol() { curl -fsSL "$1" -o "$2"; } elif command -v wget >/dev/null 2>&1; then hol() { wget -qO "$2" "$1"; } else abbruch "Es braucht curl oder wget." fi sagen "Lade $datei …" hol "$BASIS/dl/$datei" "$tmp/$datei" || abbruch "Der Download ist gescheitert. Ist $BASIS erreichbar?" hol "$BASIS/checksums.txt" "$tmp/checksums.txt" || abbruch "Die Prüfsummen sind nicht erreichbar." # --- 3. Pruefsumme -- VOR dem Installieren --------------------------------- # ⛔ Ohne diese Pruefung waere das hier ein Rohr in eine Shell, das ein # ungepruefetes Programm ablegt. Sie faengt den abgebrochenen Download und die # beschaedigte Zwischenspeicherung -- und sie gibt uns eine Stelle, an der ein # vertauschtes Programm auffaellt. soll="$(grep " $datei\$" "$tmp/checksums.txt" | awk '{print $1}' || true)" [ -n "$soll" ] || abbruch "Für $datei gibt es keine Prüfsumme. Das ist ein Fehler bei uns." if command -v sha256sum >/dev/null 2>&1; then ist="$(sha256sum "$tmp/$datei" | awk '{print $1}')" elif command -v shasum >/dev/null 2>&1; then ist="$(shasum -a 256 "$tmp/$datei" | awk '{print $1}')" else abbruch "Es braucht sha256sum oder shasum, um die Datei zu prüfen." fi [ "$ist" = "$soll" ] || abbruch "Die Prüfsumme passt nicht. erwartet: $soll bekommen: $ist Lade nicht weiter — melde dich bei uns." sagen "Prüfsumme stimmt." # --- 4. Installieren ------------------------------------------------------- mkdir -p "$ZIEL" # ⛔ Diese Pruefung war ein Nichts: sie rief `--version` auf, und die Option # GAB ES NICHT -- der Aufruf schlug also immer fehl, der Zweig war immer wahr # und tat nichts. Jetzt sagt sie, WAS ersetzt wird. Wer nach einem Update # nachsehen will, ob es gewirkt hat, braucht die alte Fassung im Vergleich. if [ -e "$ZIEL/barry-mcp" ]; then # ⛔⛔ `/dev/null || true)" case "$alt" in ""|*[!0-9a-zA-Z.\-]*) alt="ohne Fassungsangabe" ;; esac sagen "Vorhanden: $alt — wird ersetzt." fi mv "$tmp/$datei" "$ZIEL/barry-mcp" chmod +x "$ZIEL/barry-mcp" # ⛔ macOS haelt Heruntergeladenes in Quarantaene. Ohne diesen Schritt meldet # Gatekeeper «kann nicht geoeffnet werden, weil der Entwickler nicht # verifiziert werden kann» -- und zwar erst, wenn Claude Code den Server # startet, also weit weg von hier. if [ "$os" = darwin ] && command -v xattr >/dev/null 2>&1; then xattr -d com.apple.quarantine "$ZIEL/barry-mcp" 2>/dev/null || true fi # ⚠️ Auch hier `/dev/null || echo unbekannt))" # --- 5. Nachweisen, dass es LAEUFT ----------------------------------------- # ⛔ Nicht «Datei liegt da», sondern «Programm antwortet». Ein Handschlag # ueber stdio, und die Antwort muss ihn enthalten. Alles andere ist eine # Behauptung. antwort="$(printf '%s\n' \ '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' \ | "$ZIEL/barry-mcp" 2>/dev/null || true)" case "$antwort" in *'"name":"barry"'*) sagen "Das Programm antwortet." ;; *) abbruch "Das Programm läuft nicht auf dieser Maschine. Melde dich bei uns und nenne: $os/$arch." ;; esac # --- 6. PATH --------------------------------------------------------------- # ⚠️ GEPRUEFT, nicht angenommen. ~/.local/bin ist auf vielen Systemen NICHT im # PATH, und dann meldet Claude Code «command not found» -- der Fehler # erscheint beim Start des Agenten, Stunden spaeter. if ! command -v barry-mcp >/dev/null 2>&1; then sagen "" sagen "⚠ $ZIEL ist nicht in deinem PATH. Füge diese Zeile hinzu:" sagen "" sagen " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ~/.zshrc && exec zsh" sagen "" fi # --- 7. Was jetzt zu tun ist ----------------------------------------------- sagen "" sagen "Fertig. Zwei Schritte noch:" sagen "" sagen "1) Schlüssel holen auf https://console.barry.build/mcp" sagen " und Barry anmelden:" sagen "" sagen " claude mcp add --scope user barry \\" sagen " --env BARRY_TOKEN=bry_DEIN_SCHLUESSEL \\" sagen " -- barry-mcp" sagen "" sagen " --scope user, damit Barry in JEDEM Projekt da ist. Ohne das gilt es" sagen " nur im Verzeichnis, in dem du den Befehl ausführst." sagen "" sagen "2) Claude Code EINMAL neu starten. MCP-Server werden beim Start" sagen " verbunden — ohne Neustart ist Barry nicht da." sagen "" sagen "Danach: «welche Apps habe ich bei Barry?»"