MCP-Server: URL optional – URL-lose Einträge als reine Allowlist-Freigabe

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__<name>__* 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 <noreply@anthropic.com>
This commit is contained in:
MelekiandClaude Opus 4.8 committed 2026-07-03 19:11:34 +02:00
1 parent 9d21138e62
commit 4d29b09488
3 files changed
+13 -9

No files matched your search

+8 -4
View File
@@ -259,8 +259,12 @@ public class ClaudeCliService
/// <summary>
/// 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__&lt;name&gt;__* 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.
/// </summary>
public static List<McpServerDef> 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 */ }