import { config } from "$lib/server/config"; import { logger } from "$lib/server/logger"; import type { McpServerConfig } from "./httpClient"; import { resetMcpToolsCache } from "./tools"; let cachedRaw: string | null = null; let cachedServers: McpServerConfig[] = []; function parseServers(raw: string): McpServerConfig[] { if (!raw) return []; try { const parsed = JSON.parse(raw); if (!Array.isArray(parsed)) return []; return parsed .map((entry) => { if (!entry || typeof entry !== "object") return undefined; const name = (entry as Record).name; const url = (entry as Record).url; if (typeof name !== "string" || !name.trim()) return undefined; if (typeof url !== "string" || !url.trim()) return undefined; const headersRaw = (entry as Record).headers; let headers: Record | undefined; if (headersRaw && typeof headersRaw === "object" && !Array.isArray(headersRaw)) { const headerEntries = Object.entries(headersRaw as Record).filter( (entry): entry is [string, string] => typeof entry[1] === "string" ); headers = Object.fromEntries(headerEntries); } return headers ? { name, url, headers } : { name, url }; }) .filter((server): server is McpServerConfig => Boolean(server)); } catch (error) { logger.warn({ err: error }, "[mcp] failed to parse MCP_SERVERS env"); return []; } } function setServers(raw: string) { cachedServers = parseServers(raw); cachedRaw = raw; resetMcpToolsCache(); logger.debug({ count: cachedServers.length }, "[mcp] loaded server configuration"); console.log( `[MCP] Loaded ${cachedServers.length} server(s):`, cachedServers.map((s) => s.name).join(", ") || "none" ); } export function loadMcpServersOnStartup(): McpServerConfig[] { const raw = config.MCP_SERVERS || "[]"; setServers(raw); return cachedServers; } export function refreshMcpServersIfChanged(): void { const currentRaw = config.MCP_SERVERS || "[]"; if (cachedRaw === null) { setServers(currentRaw); return; } if (currentRaw !== cachedRaw) { setServers(currentRaw); } } export function getMcpServers(): McpServerConfig[] { if (cachedRaw === null) { loadMcpServersOnStartup(); } return cachedServers; }