ClawdDotNet als MCP-Server: durch dieselben Pruefstellen (#713)

Eine fremde Laufzeit oder der eigene Claude Code des Menschen spricht per MCP
mit der Instanz. Der Server bietet genau die Werkzeuge des Agenten hinter dem
Token an; jeder Aufruf laeuft durch die Engine wie ein Aufruf des eigenen
Modells (Rechtetor, Vorpruefung, Werkzeugrechte, Staging, Audit mit Quelle
mcp, Rahmung), und der Aufrufer gilt als Leser fremder Inhalte (#715).

Eigener Socket mcp.sock statt manager.sock: ueber den Instanz-Socket antwortet
die Verwaltung ohne Token, ueber mcp.sock gibt es nur /mcp und nur mit
MCP-Token. Lauf-Tokens nur im Speicher, enden mit dem Lauf; persoenliche Tokens
(hoechstens 90 Tage, widerrufbar, nur als SHA-256) in der Agentenansicht.
Transporte: HTTP auf mcp.sock, Weboberflaeche und Manager (/mcp/{instanz}),
stdio ueber ClawdDotNet --mcp-bridge (Token nur aus Umgebung oder 0600-Datei).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-25 17:28:47 +02:00
co-authored by Claude Opus 5.5
parent b5f65b8cf7
commit cb46289bb6
25 changed files with 1672 additions and 12 deletions
+27
View File
@@ -782,6 +782,33 @@ vier Regeln:
an den Rechten vorbei. Das Token gilt einen Lauf lang und wird nie in der
Befehlszeile übergeben.
*Der MCP-Server ist gebaut (2026-09-25, #713).* So umgesetzt, mit einer Abweichung vom Plan:
- **Eigener Socket statt des Instanz-Sockets.** Das Konzept sah HTTP über den
Unix-Socket der Instanz vor. Über `manager.sock` antwortet aber die ganze Verwaltung
ohne Token, weil dort das Dateisystem die Grenze ist. Eine fremde Laufzeit darf ihn
deshalb nie bekommen. Der Server hat einen eigenen Socket `mcp.sock` (0600; unter
Windows eine eigene Named Pipe). Über ihn gibt es nur `/mcp`, jeder andere Pfad
antwortet 404, und `/mcp` öffnet nur ein MCP-Token. Diesen einen Socket bindet später
die Sandbox (#654) ein.
- **Ein Weg für alle Aufrufe:** `AgentEngine.ExecuteExternalToolCallAsync` führt jeden
Aufruf durch dieselbe Kette wie einen Aufruf des eigenen Modells: Rechtetor,
Vorprüfung, Werkzeugrechte, Staging, Audit (Quelle `mcp`), Rahmung. Der Aufrufer gilt
als Leser fremder Inhalte (#715, Quelle `external-runtime`): Eine fremde Laufzeit
schreibt keine Prosa in den Kontext ihrer Leitung.
- **Tokens:** Das Lauf-Token (`McpGrants.OpenRun`) lebt nur im Speicher. Es endet mit dem
Handle des Laufs und spätestens nach vier Stunden. Persönliche Tokens für den eigenen
Claude Code des Menschen (Agentenansicht, „Externer Zugang“) sind höchstens 90 Tage
gültig, jederzeit widerrufbar und nur als SHA-256 gespeichert. Ein Token nennt den
Agenten, als der gearbeitet wird; das WebUI-Token öffnet `/mcp` nicht.
- **Transporte:** HTTP (`POST /mcp`, JSON-Antworten, keine Sitzungen, kein Ereignisstrom;
Anfragen mit `Origin` werden abgewiesen) auf `mcp.sock` und auf dem Port der
Weboberfläche. Über den Manager ist der Server unter `POST /mcp/{instanz}` erreichbar;
der Manager reicht nur weiter, zum MCP-Socket und nie zum Instanz-Socket. Für lokal
gestartete Laufzeiten gibt es stdio über `ClawdDotNet --mcp-bridge --instance <dir>`.
Das Token kommt aus `CLAWD_MCP_TOKEN` oder aus einer Datei in `CLAWD_MCP_TOKEN_FILE`;
die Brücke lehnt die Datei ab, wenn andere sie lesen dürfen.
### Kosten, die nichts kosten
Mit einem Abo kostet ein Lauf 0 $ und verbraucht trotzdem etwas: Kontingent. Die