import type { OhMyOpenCodeConfig } from "../config"; import { loadMcpConfigs } from "../features/claude-code-mcp-loader"; import { createBuiltinMcps } from "../mcp"; import type { PluginComponents } from "./plugin-components-loader"; type McpEntry = Record; function captureUserDisabledMcps( userMcp: Record | undefined ): Set { const disabled = new Set(); if (!userMcp) return disabled; for (const [name, value] of Object.entries(userMcp)) { if ( value && typeof value === "object" && "enabled" in value && (value as McpEntry).enabled === false ) { disabled.add(name); } } return disabled; } export async function applyMcpConfig(params: { config: Record; pluginConfig: OhMyOpenCodeConfig; pluginComponents: PluginComponents; }): Promise { const disabledMcps = params.pluginConfig.disabled_mcps ?? []; const userMcp = params.config.mcp as Record | undefined; const userDisabledMcps = captureUserDisabledMcps(userMcp); const mcpResult = params.pluginConfig.claude_code?.mcp ?? true ? await loadMcpConfigs(disabledMcps) : { servers: {} }; const merged = { ...createBuiltinMcps(disabledMcps, params.pluginConfig), ...(userMcp ?? {}), ...mcpResult.servers, ...params.pluginComponents.mcpServers, } as Record; for (const name of userDisabledMcps) { if (merged[name]) { merged[name] = { ...merged[name], enabled: false }; } } const disabledSet = new Set(disabledMcps); for (const name of disabledSet) { delete merged[name]; } params.config.mcp = merged; }