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; }