From 4d29b094886f4cf11cdea6aa76537d833dc6a292 Mon Sep 17 00:00:00 2001 From: Meleki Date: Fri, 3 Jul 2026 19:11:34 +0200 Subject: [PATCH] =?UTF-8?q?MCP-Server:=20URL=20optional=20=E2=80=93=20URL-?= =?UTF-8?q?lose=20Eintr=C3=A4ge=20als=20reine=20Allowlist-Freigabe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Entkoppelt "Server erzeugen" von "Server erlauben": Ein MCP-Eintrag ohne URL erzeugt keinen eigenen (kollidierenden) HTTP-Server mehr, steuert aber weiterhin die Allowlist-Freigabe mcp____* bei. Gedacht für extern (z.B. stdio via ~/.claude.json) laufende Server, die gott nur erlauben, aber nicht selbst starten soll – sonst kollidiert gotts URL-Server mit dem gleichnamigen externen und der Server verschwindet ganz. - ParseMcpServers: Url optional (null erlaubt), nur Name+leer wird verworfen - Frontend: Name genügt, URL-Placeholder + Hinweistext angepasst Co-Authored-By: Claude Opus 4.8 --- Services/ClaudeCliService.cs | 12 ++++++++---- wwwroot/index.html | 4 ++-- wwwroot/js/mcp-servers-ui.js | 6 +++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Services/ClaudeCliService.cs b/Services/ClaudeCliService.cs index 922e5c9..3f7f3f1 100644 --- a/Services/ClaudeCliService.cs +++ b/Services/ClaudeCliService.cs @@ -259,8 +259,12 @@ public class ClaudeCliService /// /// Parst die in der Session hinterlegte MCP-Server-Liste (JSON-Array von {name,url,token}). - /// Säubert die Namen (glob-/config-tauglich), filtert reservierte Namen, Duplikate und - /// Einträge ohne URL. Wirft nie – ungültige Eingaben ergeben eine leere Liste. + /// Säubert die Namen (glob-/config-tauglich), filtert reservierte Namen und Duplikate. + /// Einträge OHNE URL sind erlaubt (Url = null): sie erzeugen KEINEN eigenen Server, + /// steuern aber die Allowlist-Freigabe mcp__<name>__* bei – gedacht für Server, die + /// bereits extern (z.B. stdio via ~/.claude.json) laufen und die gott nur erlauben, aber + /// nicht selbst starten soll (sonst kollidiert gotts URL-Server mit dem externen gleichen + /// Namens). Nur Name+leer wird verworfen. Wirft nie – ungültige Eingaben ergeben leere Liste. /// public static List ParseMcpServers(string json) { @@ -278,10 +282,10 @@ public class ClaudeCliService var url = el.TryGetProperty("url", out var u) && u.ValueKind == JsonValueKind.String ? u.GetString() : null; var token = el.TryGetProperty("token", out var t) && t.ValueKind == JsonValueKind.String ? t.GetString() : null; var name = SanitizeMcpName(rawName); - if (string.IsNullOrEmpty(name) || string.IsNullOrWhiteSpace(url)) continue; + if (string.IsNullOrEmpty(name)) continue; // URL optional: ohne URL = reiner Allowlist-Eintrag if (_reservedMcpNames.Contains(name)) continue; if (!seen.Add(name)) continue; // doppelter Name → ignorieren - result.Add(new McpServerDef { Name = name, Url = url.Trim(), Token = string.IsNullOrWhiteSpace(token) ? null : token.Trim() }); + result.Add(new McpServerDef { Name = name, Url = string.IsNullOrWhiteSpace(url) ? null : url.Trim(), Token = string.IsNullOrWhiteSpace(token) ? null : token.Trim() }); } } catch { /* ungültiges JSON → leere Liste */ } diff --git a/wwwroot/index.html b/wwwroot/index.html index c86aa30..0432d31 100644 --- a/wwwroot/index.html +++ b/wwwroot/index.html @@ -172,10 +172,10 @@
- +
- Pro Eintrag: Name, URL (http/sse) und optionaler Token. Der Name muss exakt dem Tool-Präfix entsprechen (z.B. UnityMCP, nicht Unity). Tools werden headless als mcp__<name>__* freigegeben. + Pro Eintrag: Name, optionale URL (http/sse) und optionaler Token. Der Name muss exakt dem Tool-Präfix entsprechen (z.B. UnityMCP, nicht Unity); Tools werden headless als mcp__<name>__* freigegeben. URL leer lassen, wenn der Server bereits extern läuft (z.B. stdio via ~/.claude.json) – dann gibt gott ihn nur frei und erzeugt keinen eigenen, kollidierenden Server.
Kein Bot zugewiesen
diff --git a/wwwroot/js/mcp-servers-ui.js b/wwwroot/js/mcp-servers-ui.js index faa32ee..1944de4 100644 --- a/wwwroot/js/mcp-servers-ui.js +++ b/wwwroot/js/mcp-servers-ui.js @@ -12,7 +12,7 @@ function createMcpServerRow(container, name, url, token) { item.innerHTML = `
- +
@@ -29,8 +29,8 @@ function getMcpServersFromUI(container) { var name = item.querySelector('.mcp-name').value.trim(); var url = item.querySelector('.mcp-url').value.trim(); var token = item.querySelector('.mcp-token').value.trim(); - // Nur vollständige Einträge (Name + URL) übernehmen. - if (name && url) servers.push({ name: name, url: url, token: token || null }); + // Name genügt. Ohne URL = reiner Freigabe-Eintrag (kein eigener Server, nur Allowlist). + if (name) servers.push({ name: name, url: url || null, token: token || null }); } return servers.length > 0 ? servers : null; }