Fernsteuerung & MCP-Server

Befehle von außen: per Adresse, aus Raycast – oder von einem KI-Assistenten

Kachelwerk nimmt Befehle nicht nur über Tastenkürzel entgegen. Drei Wege führen von außen hinein, und sie teilen sich denselben Befehlsvorrat wie eine bind-Zeile in der Konfiguration.

WegFür wenSchalterVorgabe
Adresse kachelwerk://…Shell-Skripte, andere Programmeremote_controlan
Raycast-PaketRaycastremote_controlan
MCP-ServerKI-Assistenten wie Claudemcp_serveraus
   Raycast, Shell-Skript                KI-Assistent (MCP-Client)
          │                                      │
          │                                      ▼
          │                             ┌──────────────────┐
          │                             │  kachelwerk-mcp  │──── liest ───► status.json
          │                             └────────┬─────────┘                    ▲
          ▼                                      ▼                              │
   kachelwerk://dispatch/…             kachelwerk://dispatch/…?via=mcp          │
          │                                      │                              │
          ▼                                      ▼                              │
   remote_control = true ?              mcp_server = true ?                     │
          │                                      │                              │
          └───────────────┬──────────────────────┘                              │
                          ▼                                                     │
                  ┌───────────────┐                                             │
                  │  Kachelwerk   │──── schreibt nach jeder Änderung ───────────┘
                  └───────────────┘

Befehle per Adresse

kachelwerk://dispatch/<dispatcher>?arg=<argument>

Ein Beispiel für jede Bauform:

open -g "kachelwerk://dispatch/togglefloating"
open -g "kachelwerk://dispatch/movefocus?arg=l"
open -g "kachelwerk://dispatch/workspace?arg=3"
open -g "kachelwerk://dispatch?command=layoutmsg,mfact%200.6"

-g hält Kachelwerk im Hintergrund. Ohne den Schalter holt macOS die App nach vorn, und das Fenster, auf das sich der Befehl bezieht, verliert den Fokus.

Ausnahme: Befehle, die ein Kachelwerk-Fenster öffnen – opensettings und showkeybindings – ruft man ohne -g auf, damit das Fenster die Tastatur bekommt.

Alle Dispatcher stehen unter Tastenkürzel.

Der Schalter

general {
    remote_control = true
}

Derselbe Schalter steht unter Einstellungen → Allgemein → Fernsteuerung. Abgeschaltet verwirft Kachelwerk jede eintreffende Adresse.

Die Statusdatei

Eine Adresse kann nichts zurückgeben. Damit ein fremdes Programm trotzdem weiß, was Kachelwerk gerade verwaltet, schreibt Kachelwerk nach jeder Änderung

~/Library/Application Support/Kachelwerk/status.json

– Layout, aktive Arbeitsfläche, letzter Befehl und die Liste aller verwalteten Fenster mit ihren Rollen.


Das Raycast-Paket

Im Projekt liegt unter raycast/kachelwerk/ eine fertige Raycast-Erweiterung.

cd raycast/kachelwerk
npm install
npm run dev        # baut und meldet die Erweiterung bei Raycast an

Sobald Raycast die Befehle anzeigt, darf npm run dev beendet werden; die Erweiterung bleibt installiert. Alle Befehle heißen dort Kachelwerk: …. Zwei davon sind Ansichten: Kachelwerk: Status zeigt die Statusdatei, Kachelwerk: Alle Befehle ist die durchsuchbare Liste aller Dispatcher.


MCP-Server: ein KI-Assistent ordnet Fenster

Kachelwerk bringt einen Server für das Model Context Protocol mit: das Programm kachelwerk-mcp. Ein MCP-Client – Claude Code, Claude Desktop oder ein anderer – kann damit die Fensteranordnung lesen und Fenster anordnen. „Was liegt auf Arbeitsfläche 3?" oder „Lege Mail und Terminal nebeneinander" werden zu einem Werkzeugaufruf.

Ab Werk aus

general {
    mcp_server = false     # true schaltet den MCP-Server ein
}

Derselbe Schalter steht unter Einstellungen → Allgemein → MCP-Server. Er ist von der Fernsteuerung unabhängig: Wer Raycast erlaubt, hat damit noch keinem KI-Assistenten etwas erlaubt.

SchalterAnmelden, Werkzeuge nennenWerkzeuge aufrufenFenstertitel in der Statusdatei
aus (Vorgabe)✅❌ alle sechs – auch die lesendennein
an✅✅ja

Auch das Lesen ist abgeschaltet, weil Fenstertitel verraten, woran jemand gerade arbeitet. Umschalten wirkt beim nächsten Aufruf – der Client muss nicht neu gestartet werden.

Einrichten

./Scripts/build-app.sh --install legt den Server neben die App:

/Applications/Kachelwerk.app/Contents/MacOS/kachelwerk-mcp

In Claude Code:

claude mcp add kachelwerk /Applications/Kachelwerk.app/Contents/MacOS/kachelwerk-mcp

In einer mcpServers-Konfiguration:

{
  "mcpServers": {
    "kachelwerk": {
      "command": "/Applications/Kachelwerk.app/Contents/MacOS/kachelwerk-mcp"
    }
  }
}

Die sechs Werkzeuge

WerkzeugArtWas es tut
kachelwerk_statuslesendLayout, aktive und belegte Arbeitsflächen, Bildschirme, letzter Befehl
kachelwerk_list_windowslesendFenster mit Programm, Titel, Arbeitsfläche, Bildschirm, Rahmen und Rollen
kachelwerk_list_commandslesendDie Befehle, die kachelwerk_dispatch annimmt
kachelwerk_set_layoutänderndLayout umschalten
kachelwerk_workspaceänderndArbeitsfläche wechseln oder das fokussierte Fenster verschieben
kachelwerk_dispatchänderndJeder andere Dispatcher, etwa movefocus l oder swapwindow r

Befehle wirken auf das fokussierte Fenster. Um ein bestimmtes Fenster zu bewegen, setzt der Assistent vorher den Fokus mit movefocus oder cyclenext. Kachelwerk bestätigt einen Befehl nicht – der Assistent liest den Zustand danach neu.

Was der Server nicht darf

GesperrtWarum
execDer Server ordnet Fenster an, er startet keine Programme
exitKachelwerk lässt sich nur am Rechner selbst beenden
killactiveEin geschlossenes Fenster lässt sich nicht zurückholen

Die Liste ist bewusst enger als bei der Fernsteuerung. Die bedient ein Mensch; den MCP-Server bedient ein Sprachmodell, und ein Sprachmodell liest unterwegs fremde Texte, in denen Anweisungen stehen können. Was ein solcher Text im schlimmsten Fall auslöst, soll ein verschobenes Fenster sein und kein gestartetes Programm. Die Sperre wird zweimal geprüft: im Server und noch einmal in der App.

Wie es gebaut ist

Der Server ist ein eigenes kleines Programm im App-Bundle und hat keinen eigenen Kanal zur App: Er liest die Statusdatei und schreibt Adressen – dieselben zwei Wege wie das Raycast-Paket. Kein Port, kein Socket, kein zweites Protokoll. In der Historie von Kachelwerk erscheinen seine Befehle unter dem Kanal MCP-Server.