| 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<string, unknown>).name; | |
| const url = (entry as Record<string, unknown>).url; | |
| if (typeof name !== "string" || !name.trim()) return undefined; | |
| if (typeof url !== "string" || !url.trim()) return undefined; | |
| const headersRaw = (entry as Record<string, unknown>).headers; | |
| let headers: Record<string, string> | undefined; | |
| if (headersRaw && typeof headersRaw === "object" && !Array.isArray(headersRaw)) { | |
| const headerEntries = Object.entries(headersRaw as Record<string, unknown>).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; | |
| } | |