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.
| Weg | Für wen | Schalter | Vorgabe |
|---|---|---|---|
Adresse kachelwerk://… | Shell-Skripte, andere Programme | remote_control | an |
| Raycast-Paket | Raycast | remote_control | an |
| MCP-Server | KI-Assistenten wie Claude | mcp_server | aus |
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.
| Schalter | Anmelden, Werkzeuge nennen | Werkzeuge aufrufen | Fenstertitel in der Statusdatei |
|---|---|---|---|
| aus (Vorgabe) | ✅ | ❌ alle sechs – auch die lesenden | nein |
| 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
| Werkzeug | Art | Was es tut |
|---|---|---|
kachelwerk_status | lesend | Layout, aktive und belegte Arbeitsflächen, Bildschirme, letzter Befehl |
kachelwerk_list_windows | lesend | Fenster mit Programm, Titel, Arbeitsfläche, Bildschirm, Rahmen und Rollen |
kachelwerk_list_commands | lesend | Die Befehle, die kachelwerk_dispatch annimmt |
kachelwerk_set_layout | ändernd | Layout umschalten |
kachelwerk_workspace | ändernd | Arbeitsfläche wechseln oder das fokussierte Fenster verschieben |
kachelwerk_dispatch | ändernd | Jeder 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
| Gesperrt | Warum |
|---|---|
exec | Der Server ordnet Fenster an, er startet keine Programme |
exit | Kachelwerk lässt sich nur am Rechner selbst beenden |
killactive | Ein 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.