- AnthropicService.cs (337 Zeilen): Felder, Konstruktor, Setters, Utilities - AnthropicService.Streaming.cs (750 Zeilen): StreamChat, ProcessStream, SSE-Parsing - AnthropicService.Agents.cs (680 Zeilen): RunAgentChat, ChatNonStreaming, Review/Preparer/Finalizer - AnthropicService.Cli.cs (530 Zeilen): StreamChatViaCli, MCP-Config, CLI-Helpers - AddToolsToPayload: 12 Bool-Parameter → ToolPayloadOptions Record - RunAgentChat + ChatNonStreaming → gemeinsame RunNonStreamingToolLoop-Methode Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
Plan: MCP-Server für remote_execute in der CLI
Übersicht
Ein eigener MCP-Server (Model Context Protocol, stdio-basiert) der remote_execute als Tool für die Claude Code CLI exposed. Die CLI erkennt MCP-Tools nativ und kann sie wie Built-in-Tools verwenden.
Architektur
Claude CLI ←→ MCP-Server (stdio) ←→ gott HTTP-API ←→ RemoteEndpoint → SSH/Exec
Komponenten
1. MCP-Server: scripts/mcp-server (oder Services/McpServer.cs)
Variante A: Standalone Script (Python/Node/Bash+jq)
- Leichtgewichtig, unabhängig von .NET Runtime
- Kommuniziert über stdin/stdout (JSON-RPC 2.0)
- Ruft gott's interne HTTP-API auf
Variante B: .NET Console App
- Kann ToolService/RemoteService direkt referenzieren
- Gleiche Codebase, keine API-Zwischenschicht nötig
- Aber: Eigener Prozess, muss separat gebaut werden
Empfehlung: Variante A – ein einfaches Script das die gott-API aufruft. Minimaler Overhead, keine Build-Abhängigkeit.
2. Interner API-Endpoint
POST /api/internal/remote-execute
Authorization: (interner Token oder localhost-only)
Content-Type: application/json
{
"command": "docker ps",
"sessionId": "abc123", // für Zuordnung zur Chat-Session
"serverId": "optional" // falls mehrere Server
}
Response:
{
"exitCode": 0,
"stdout": "CONTAINER ID IMAGE ...",
"stderr": "",
"durationMs": 234
}
3. MCP-Server Konfiguration
In .claude/settings.json oder per --mcp-config:
{
"mcpServers": {
"gott-remote": {
"command": "/app/gott/scripts/mcp-remote-execute",
"type": "stdio",
"env": {
"GOTT_API_URL": "http://localhost:5000",
"GOTT_SESSION_ID": "${SESSION_ID}"
}
}
}
}
4. MCP-Protokoll (stdio, JSON-RPC 2.0)
Tool-Definition (tools/list Response):
{
"name": "remote_execute",
"description": "Führt einen Befehl auf dem Remote-Server aus (via SSH oder lokal)",
"inputSchema": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "Der auszuführende Befehl"
}
},
"required": ["command"]
}
}
Tool-Call (tools/call):
- MCP-Server empfängt JSON-RPC Request
- Ruft
POST /api/internal/remote-executeauf - Gibt stdout/stderr als Text-Content zurück
5. Integration in ClaudeCliService
- MCP-Server-Config wird beim CLI-Start übergeben
--mcp-config /tmp/gott-mcp-{sessionId}.jsonoder globale Config- SessionId/ServerId werden als Environment-Variablen an den MCP-Server übergeben
6. AnthropicService: CLI-Aufruf anpassen
In StreamChatViaCli den MCP-Config-Pfad generieren und an ChatStreamingAsync übergeben:
var mcpConfig = GenerateMcpConfig(sessionId, serverId);
var mcpConfigPath = WriteTempMcpConfig(mcpConfig);
// CLI-Aufruf mit --mcp-config mcpConfigPath
Dateien
| Datei | Aktion | Beschreibung |
|---|---|---|
scripts/mcp-remote-execute |
NEU | MCP-Server Script (stdio) |
Endpoints/InternalEndpoint.cs |
NEU | Interner API-Endpoint für remote-execute |
Services/ClaudeCliService.cs |
EDIT | MCP-Config übergeben |
Services/AnthropicService.cs |
EDIT | MCP-Config generieren |
.claude/settings.json |
EDIT | MCP-Server registrieren (oder dynamisch per --mcp-config) |
Offene Fragen
- Script-Sprache: Python (weit verbreitet), Node (npm-Ökosystem), oder Shell+curl+jq (keine Runtime-Abhängigkeit)?
- Auth für internen Endpoint: Nur localhost erlauben? Oder interner Token?
- Server-Auswahl: Wenn mehrere Remote-Server konfiguriert sind – soll der MCP-Server alle als separate Tools exposen oder einen Default verwenden?
- Tool-Ergebnis-Mapping: Wie sollen remote_execute-Results in der gott-UI angezeigt werden? Als normales Tool-Result oder speziell formatiert?