From a6a13b701c810e11fb7f0ea8b3e3359faf34d4b7 Mon Sep 17 00:00:00 2001 From: Gabrielsv01 Date: Mon, 4 May 2026 22:57:54 -0300 Subject: [PATCH] Validate duplicate MCP server names before save --- .../src/components/config/config-page.tsx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/web/frontend/src/components/config/config-page.tsx b/web/frontend/src/components/config/config-page.tsx index 6fabcb814..93261aa17 100644 --- a/web/frontend/src/components/config/config-page.tsx +++ b/web/frontend/src/components/config/config-page.tsx @@ -217,6 +217,17 @@ export function ConfigPage() { throw new Error("Session scope is required.") } + if ( + form.mcpEnabled && + form.mcpDiscoveryEnabled && + !form.mcpDiscoveryUseBM25 && + !form.mcpDiscoveryUseRegex + ) { + throw new Error( + "MCP discovery requires at least one search method (BM25 or regex).", + ) + } + const maxTokens = parseIntField(form.maxTokens, "Max tokens", { min: 1, }) @@ -282,6 +293,25 @@ export function ConfigPage() { })) .filter((server) => server.name !== "") + const serverNameCounts = new Map() + for (const server of normalizedServers) { + serverNameCounts.set( + server.name, + (serverNameCounts.get(server.name) ?? 0) + 1, + ) + } + + const duplicateNames = Array.from(serverNameCounts.entries()) + .filter(([, count]) => count > 1) + .map(([name]) => name) + .sort((a, b) => a.localeCompare(b)) + + if (duplicateNames.length > 0) { + throw new Error( + `MCP server names must be unique. Duplicates: ${duplicateNames.join(", ")}.`, + ) + } + const currentServerNames = new Set( normalizedServers.map((server) => server.name), )