{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/constants.ts","../src/server-name.ts","../src/builders/BaseConfigBuilder.ts","../src/builders/GenericConfigBuilder.ts","../src/builders/GooseConfigBuilder.ts","../src/builders/VSCodeConfigBuilder.ts","../src/builders/CursorConfigBuilder.ts","../src/builders/ClaudeCodeConfigBuilder.ts","../src/builders/CodexConfigBuilder.ts","../configs/chatgpt.json","../configs/claude-code.json","../configs/claude-desktop.json","../configs/claude-teams-enterprise.json","../configs/codex.json","../configs/cursor.json","../configs/goose.json","../configs/vscode.json","../configs/windsurf.json","../configs/junie.json","../configs/jetbrains.json","../src/registry.ts","../src/builder.ts"],"sourcesContent":["export * from './types.js';\nexport * from './constants.js';\nexport * from './server-name.js';\n\nexport { MCPConfigRegistry } from './registry.js';\nexport { BaseConfigBuilder } from './builders/BaseConfigBuilder.js';\nexport { GenericConfigBuilder } from './builders/GenericConfigBuilder.js';\nexport { VSCodeConfigBuilder } from './builders/VSCodeConfigBuilder.js';\nexport { GooseConfigBuilder } from './builders/GooseConfigBuilder.js';\nexport { CursorConfigBuilder } from './builders/CursorConfigBuilder.js';\nexport { ClaudeCodeConfigBuilder } from './builders/ClaudeCodeConfigBuilder.js';\nexport { CodexConfigBuilder } from './builders/CodexConfigBuilder.js';\nexport {\n  buildConfiguration,\n  buildConfigurationString,\n  buildOneClickUrl,\n  buildCommand,\n  clientNeedsMcpRemote,\n  clientSupportsHttpNatively,\n  clientSupportsStdio,\n} from './builder.js';\n","import { z } from 'zod';\nexport const PlatformSchema = z.enum(['darwin', 'linux', 'win32']);\nexport const ClientIdSchema = z.enum([\n  'claude-code',\n  'vscode',\n  'claude-desktop',\n  'claude-teams-enterprise',\n  'cursor',\n  'goose',\n  'windsurf',\n  'chatgpt',\n  'codex',\n  'junie',\n  'jetbrains',\n]);\n\nexport const ServerTypeSchema = z.enum(['http', 'stdio']);\n\nexport const TransportSchema = z.enum(['stdio', 'http']);\nexport const SupportedTransportsSchema = z.array(TransportSchema).min(1);\nexport const HttpConfigStructureSchema = z.object({\n  typeProperty: z.string().optional(),\n  urlProperty: z.string(),\n  headersProperty: z.string().optional(),\n});\n\nexport const StdioConfigStructureSchema = z.object({\n  typeProperty: z.string().optional(),\n  commandProperty: z.string(),\n  argsProperty: z.string(),\n  envProperty: z.string().optional(),\n});\n\nexport const ConfigStructureSchema = z.object({\n  serversPropertyName: z.string(),\n  httpPropertyMapping: HttpConfigStructureSchema.optional(),\n  stdioPropertyMapping: StdioConfigStructureSchema.optional(),\n});\n\nexport const PlatformPathsSchema = z.object({\n  darwin: z.string().optional(),\n  linux: z.string().optional(),\n  win32: z.string().optional(),\n});\n\nexport const MCPClientConfigSchema = z.object({\n  id: ClientIdSchema,\n  name: z.string(),\n  displayName: z.string(),\n  description: z.string(),\n  userConfigurable: z.boolean(),\n  localConfigNotes: z.string().optional(),\n  documentationUrl: z.string().url().optional(),\n  transports: SupportedTransportsSchema,\n  supportedPlatforms: z.array(PlatformSchema),\n  configFormat: z.enum(['json', 'yaml', 'toml']),\n  configPath: PlatformPathsSchema,\n  protocolHandler: z\n    .object({\n      protocol: z.string(),\n      urlTemplate: z.string(),\n      configFormat: z.enum(['base64-json', 'url-encoded-json']),\n    })\n    .optional(),\n  configStructure: ConfigStructureSchema,\n  securityNotes: z.string().optional(),\n});\n\nexport const BuildOptionsSchema = z.object({\n  includeRootObject: z.boolean().optional(),\n  mcpRemoteVersion: z.string().optional(),\n  configureMcpServerVersion: z.string().optional(),\n});\n\nexport const MCPServerConfigSchema = z\n  .object({\n    transport: TransportSchema,\n    serverUrl: z.string().optional(), // Accept any string, not just valid URLs\n    serverName: z.string().optional(),\n    instance: z.string().optional(),\n    apiToken: z.string().optional(),\n    productName: z.string().optional(), // For white-label support, defaults to 'glean'\n  })\n  .merge(BuildOptionsSchema);\n\nexport function validateClientConfig(data: unknown) {\n  return MCPClientConfigSchema.parse(data);\n}\n\nexport function validateServerConfig(data: unknown) {\n  return MCPServerConfigSchema.parse(data);\n}\n\nexport function safeValidateClientConfig(data: unknown) {\n  return MCPClientConfigSchema.safeParse(data);\n}\n\nexport function safeValidateServerConfig(data: unknown) {\n  return MCPServerConfigSchema.safeParse(data);\n}\n\nexport const HttpServerConfigSchema = z.object({\n  type: z.literal('http'),\n  url: z.string().url(),\n});\n\nexport const HttpServerConfigAltSchema = z.object({\n  serverUrl: z.string().url(), // Windsurf uses 'serverUrl' instead of 'url'\n});\n\nexport const StdioServerConfigSchema = z.object({\n  type: z.literal('stdio').optional(), // Some clients don't include type property\n  command: z.string(),\n  args: z.array(z.string()),\n  env: z.record(z.string(), z.string()).optional(),\n});\n\nexport const StdioServerConfigAltSchema = z.object({\n  type: z.literal('stdio').optional(),\n  cmd: z.string(), // Goose uses 'cmd' instead of 'command'\n  args: z.array(z.string()),\n  env: z.record(z.string(), z.string()).optional(),\n});\n\nexport const ServerConfigSchema = z.union([\n  HttpServerConfigSchema,\n  HttpServerConfigAltSchema,\n  StdioServerConfigSchema,\n  StdioServerConfigAltSchema,\n]);\n\nexport const McpServersConfigSchema = z.object({\n  mcpServers: z.record(z.string(), ServerConfigSchema),\n});\n\nexport const VsCodeConfigSchema = z.object({\n  servers: z.record(z.string(), ServerConfigSchema),\n});\n\nconst GooseStdioServerConfigSchema = z.object({\n  name: z.string(),\n  cmd: z.string(),\n  args: z.array(z.union([z.string(), z.number()])),\n  type: z.literal('stdio'),\n  timeout: z.number(),\n  enabled: z.boolean(),\n  bundled: z.null(),\n  description: z.null(),\n  env_keys: z.array(z.string()),\n  envs: z.record(z.string(), z.string()),\n});\n\nconst GooseHttpServerConfigSchema = z.object({\n  enabled: z.boolean(),\n  type: z.literal('streamable_http'),\n  name: z.string(),\n  uri: z.string(),\n  envs: z.record(z.string(), z.string()),\n  env_keys: z.array(z.string()),\n  headers: z.record(z.string(), z.string()),\n  description: z.string(),\n  timeout: z.number(),\n  bundled: z.null(),\n  available_tools: z.array(z.string()),\n});\n\nexport const GooseServerConfigSchema = z.union([\n  GooseStdioServerConfigSchema,\n  GooseHttpServerConfigSchema,\n]);\n\nexport const GooseConfigSchema = z.object({\n  extensions: z.record(z.string(), GooseServerConfigSchema),\n});\n\nconst CodexStdioServerConfigSchema = z.object({\n  command: z.string(),\n  args: z.array(z.string()),\n  env: z.record(z.string(), z.string()).optional(),\n});\n\nconst CodexHttpServerConfigSchema = z.object({\n  url: z.string(),\n  http_headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const CodexServerConfigSchema = z.union([\n  CodexStdioServerConfigSchema,\n  CodexHttpServerConfigSchema,\n]);\n\nexport const CodexConfigSchema = z.object({\n  mcp_servers: z.record(z.string(), CodexServerConfigSchema),\n});\n\nexport function validateGeneratedConfig(\n  config: unknown,\n  clientId: string\n): { success: boolean; data?: unknown; error?: z.ZodError } {\n  let schema: z.ZodSchema;\n\n  switch (clientId) {\n    case 'vscode':\n      schema = VsCodeConfigSchema;\n      break;\n    case 'goose':\n      schema = GooseConfigSchema;\n      break;\n    case 'codex':\n      schema = CodexConfigSchema;\n      break;\n    case 'claude-code':\n    case 'claude-desktop':\n    case 'cursor':\n    case 'windsurf':\n    case 'junie':\n    case 'jetbrains':\n      schema = McpServersConfigSchema;\n      break;\n    default:\n      return {\n        success: false,\n        error: new z.ZodError([\n          {\n            code: 'custom',\n            message: `Unknown client ID: ${clientId}`,\n            path: [],\n          },\n        ]),\n      };\n  }\n\n  const result = schema.safeParse(config);\n  if (result.success) {\n    return { success: true, data: result.data };\n  } else {\n    return { success: false, error: result.error };\n  }\n}\n\nexport const validateMcpServersConfig = McpServersConfigSchema.parse;\nexport const validateVsCodeConfig = VsCodeConfigSchema.parse;\nexport const validateGooseConfig = GooseConfigSchema.parse;\nexport const validateCodexConfig = CodexConfigSchema.parse;\nexport const safeValidateMcpServersConfig = McpServersConfigSchema.safeParse;\nexport const safeValidateVsCodeConfig = VsCodeConfigSchema.safeParse;\nexport const safeValidateGooseConfig = GooseConfigSchema.safeParse;\nexport const safeValidateCodexConfig = CodexConfigSchema.safeParse;\n","/**\n * Canonical client IDs for MCP clients\n */\nexport const CLIENT = {\n  CLAUDE_CODE: 'claude-code',\n  CLAUDE_DESKTOP: 'claude-desktop',\n  CLAUDE_TEAMS_ENTERPRISE: 'claude-teams-enterprise',\n  CODEX: 'codex',\n  CURSOR: 'cursor',\n  VSCODE: 'vscode',\n  WINDSURF: 'windsurf',\n  GOOSE: 'goose',\n  CHATGPT: 'chatgpt',\n  JUNIE: 'junie',\n  JETBRAINS: 'jetbrains',\n} as const;\n\n/**\n * Display names for MCP clients\n */\nexport const CLIENT_DISPLAY_NAME = {\n  CLAUDE_CODE: 'Claude Code',\n  CLAUDE_DESKTOP: 'Claude for Desktop',\n  CLAUDE_TEAMS_ENTERPRISE: 'Claude for Teams/Enterprise',\n  CODEX: 'Codex',\n  CURSOR: 'Cursor',\n  VSCODE: 'VS Code',\n  WINDSURF: 'Windsurf',\n  GOOSE: 'Goose',\n  CHATGPT: 'ChatGPT',\n  JUNIE: 'Junie (JetBrains)',\n  JETBRAINS: 'JetBrains AI Assistant',\n} as const;\n\n/**\n * Type-safe client ID type derived from the constants\n */\nexport type ClientIdConstant = (typeof CLIENT)[keyof typeof CLIENT];\n\n/**\n * Type-safe display name type derived from the constants\n */\nexport type ClientDisplayName = (typeof CLIENT_DISPLAY_NAME)[keyof typeof CLIENT_DISPLAY_NAME];\n\n/**\n * Helper to get display name from client ID\n */\nexport function getDisplayName(clientId: ClientIdConstant): ClientDisplayName {\n  const mapping: Record<ClientIdConstant, ClientDisplayName> = {\n    [CLIENT.CLAUDE_CODE]: CLIENT_DISPLAY_NAME.CLAUDE_CODE,\n    [CLIENT.CLAUDE_DESKTOP]: CLIENT_DISPLAY_NAME.CLAUDE_DESKTOP,\n    [CLIENT.CLAUDE_TEAMS_ENTERPRISE]: CLIENT_DISPLAY_NAME.CLAUDE_TEAMS_ENTERPRISE,\n    [CLIENT.CODEX]: CLIENT_DISPLAY_NAME.CODEX,\n    [CLIENT.CURSOR]: CLIENT_DISPLAY_NAME.CURSOR,\n    [CLIENT.VSCODE]: CLIENT_DISPLAY_NAME.VSCODE,\n    [CLIENT.WINDSURF]: CLIENT_DISPLAY_NAME.WINDSURF,\n    [CLIENT.GOOSE]: CLIENT_DISPLAY_NAME.GOOSE,\n    [CLIENT.CHATGPT]: CLIENT_DISPLAY_NAME.CHATGPT,\n    [CLIENT.JUNIE]: CLIENT_DISPLAY_NAME.JUNIE,\n    [CLIENT.JETBRAINS]: CLIENT_DISPLAY_NAME.JETBRAINS,\n  };\n  return mapping[clientId];\n}\n","/**\n * Centralized server name logic for MCP configurations\n */\n\n/**\n * Normalizes a product name to be safe for use in server identifiers\n * - Converts to lowercase\n * - Replaces spaces and special characters with underscores\n * - Removes consecutive underscores\n * - Trims underscores from start/end\n *\n * Examples:\n * - \"Glean\" -> \"glean\"\n * - \"Acme Platform\" -> \"acme_platform\"\n * - \"My Product Name\" -> \"my_product_name\"\n */\nexport function normalizeProductName(productName: string): string {\n  if (!productName) {\n    return 'glean';\n  }\n\n  const normalized = productName\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '_') // Replace non-alphanumeric with underscore\n    .replace(/_+/g, '_') // Replace multiple underscores with single\n    .replace(/^_|_$/g, ''); // Trim underscores from start/end\n\n  // If the result is empty (e.g., from whitespace-only input), return default\n  return normalized || 'glean';\n}\n\n/**\n * Extracts the server name from a full MCP URL\n * e.g., https://my-be.glean.com/mcp/analytics -> analytics\n */\nexport function extractServerNameFromUrl(url: string): string | null {\n  const match = url.match(/\\/mcp\\/([^/]+)(?:\\/|$)/);\n  return match ? match[1] : null;\n}\n\n/**\n * Builds a consistent server name for MCP configurations\n *\n * Rules:\n * - stdio transport (local): '<productName>_local'\n * - Agents mode: '<productName>_agents'\n * - http transport with URL ending in /mcp/default: '<productName>_default' (for consistency)\n * - http transport with other URLs: '<productName>_<extracted-name>'\n * - Fallback: '<productName>'\n */\nexport function buildMcpServerName(options: {\n  transport?: 'stdio' | 'http';\n  serverUrl?: string;\n  serverName?: string;\n  agents?: boolean;\n  productName?: string;\n}): string {\n  const productName = normalizeProductName(options.productName || 'glean');\n\n  // If explicit server name is provided, use it with prefix\n  if (options.serverName) {\n    // If it already starts with productName or productName_, don't double-prefix\n    if (options.serverName === productName || options.serverName.startsWith(`${productName}_`)) {\n      return options.serverName;\n    }\n    return `${productName}_${options.serverName}`;\n  }\n\n  // stdio transport (local)\n  if (options.transport === 'stdio') {\n    return `${productName}_local`;\n  }\n\n  // Agents mode\n  if (options.agents) {\n    return `${productName}_agents`;\n  }\n\n  // http transport with URL\n  if (options.transport === 'http' && options.serverUrl) {\n    const extracted = extractServerNameFromUrl(options.serverUrl);\n    if (extracted) {\n      // Consistent behavior: always prefix with productName_\n      return `${productName}_${extracted}`;\n    }\n  }\n\n  // Default fallback\n  return productName;\n}\n\n/**\n * Normalizes a server name to ensure consistency\n * This is useful when accepting user input that might not follow conventions\n */\nexport function normalizeServerName(name: string, productName: string = 'glean'): string {\n  const normalizedProductName = normalizeProductName(productName);\n\n  // Create a regex pattern that matches the product name with optional underscore\n  // Escape special regex characters in the product name\n  const escapedProductName = normalizedProductName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n  const prefixPattern = new RegExp(`^${escapedProductName}_?`, 'i');\n\n  // Remove any existing product prefix to avoid duplication\n  const withoutPrefix = name.replace(prefixPattern, '');\n\n  // If it's empty after removing prefix, return normalized product name\n  if (!withoutPrefix) {\n    return normalizedProductName;\n  }\n\n  // Apply consistent formatting\n  return `${normalizedProductName}_${withoutPrefix.toLowerCase()}`;\n}\n","import { MCPClientConfig, MCPServerConfig, Platform, validateServerConfig } from '../types.js';\nimport * as yaml from 'js-yaml';\nimport * as TOML from 'smol-toml';\n\nconst DEFAULT_PLACEHOLDER_URL = 'https://[instance]-be.glean.com/mcp/[endpoint]';\nconst DEFAULT_PLACEHOLDER_INSTANCE = '[instance]';\nconst CONFIGURE_MCP_SERVER_PACKAGE = '@gleanwork/configure-mcp-server';\nconst LOCAL_MCP_SERVER_PACKAGE = '@gleanwork/local-mcp-server';\n\nfunction isNodeEnvironment(): boolean {\n  return (\n    typeof process !== 'undefined' &&\n    typeof process.versions !== 'undefined' &&\n    typeof process.versions.node !== 'undefined'\n  );\n}\n\nexport abstract class BaseConfigBuilder {\n  protected platform: Platform;\n\n  constructor(protected config: MCPClientConfig) {\n    this.platform = this.detectPlatform();\n  }\n\n  protected detectPlatform(): Platform {\n    if (isNodeEnvironment()) {\n      try {\n        return process.platform as Platform;\n      } catch {\n        // Ignore error and fall through to browser detection\n      }\n    }\n    if (typeof globalThis !== 'undefined' && 'navigator' in globalThis) {\n      const nav = (globalThis as Record<string, unknown>).navigator as { userAgent?: string };\n      if (nav && nav.userAgent) {\n        const ua = nav.userAgent.toLowerCase();\n\n        if (ua.includes('mac')) {\n          return 'darwin';\n        }\n        if (ua.includes('win')) {\n          return 'win32';\n        }\n\n        return 'linux';\n      }\n    }\n    return 'darwin';\n  }\n\n  buildConfiguration(serverData: MCPServerConfig): Record<string, unknown> {\n    if (!this.config.userConfigurable) {\n      throw new Error(\n        `${this.config.displayName} does not support local configuration. ` +\n          `${this.config.localConfigNotes || 'Configuration must be done through other means.'}`\n      );\n    }\n\n    const validatedConfig = validateServerConfig(serverData);\n    const includeRootObject = validatedConfig.includeRootObject !== false;\n\n    let configObj: Record<string, unknown> = {};\n\n    if (validatedConfig.transport === 'stdio') {\n      configObj = this.buildLocalConfig(validatedConfig, includeRootObject);\n    } else if (validatedConfig.transport === 'http') {\n      configObj = this.buildRemoteConfig(validatedConfig, includeRootObject);\n    } else {\n      throw new Error(`Invalid transport: ${validatedConfig.transport}`);\n    }\n\n    return configObj;\n  }\n\n  toString(config: Record<string, unknown>): string {\n    if (this.config.configFormat === 'json') {\n      return JSON.stringify(config, null, 2);\n    } else if (this.config.configFormat === 'yaml') {\n      return yaml.dump(config);\n    } else if (this.config.configFormat === 'toml') {\n      return TOML.stringify(config);\n    }\n\n    throw new Error(`Unsupported config format: ${this.config.configFormat}`);\n  }\n\n  protected abstract buildLocalConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean\n  ): Record<string, unknown>;\n\n  protected abstract buildRemoteConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean\n  ): Record<string, unknown>;\n\n  buildOneClickUrl?(serverData: MCPServerConfig): string;\n\n  buildCommand(serverData: MCPServerConfig): string | null {\n    try {\n      const validatedConfig = validateServerConfig(serverData);\n\n      if (validatedConfig.transport === 'http') {\n        return this.buildRemoteCommand(validatedConfig);\n      } else {\n        return this.buildLocalCommand(validatedConfig);\n      }\n    } catch (error) {\n      return null;\n    }\n  }\n\n  protected abstract buildRemoteCommand(serverData: MCPServerConfig): string | null;\n  protected abstract buildLocalCommand(serverData: MCPServerConfig): string | null;\n\n  /**\n   * Helper to get the configure-mcp-server package name with optional version\n   */\n  protected getConfigureMcpServerPackage(serverData: MCPServerConfig): string {\n    return serverData.configureMcpServerVersion\n      ? `${CONFIGURE_MCP_SERVER_PACKAGE}@${serverData.configureMcpServerVersion}`\n      : CONFIGURE_MCP_SERVER_PACKAGE;\n  }\n\n  /**\n   * Helper to get the server URL with fallback to placeholder\n   */\n  protected getServerUrl(serverData: MCPServerConfig): string {\n    return serverData.serverUrl || DEFAULT_PLACEHOLDER_URL;\n  }\n\n  /**\n   * Helper to get the instance with fallback to placeholder\n   */\n  protected getInstanceOrPlaceholder(serverData: MCPServerConfig): string {\n    return serverData.instance || DEFAULT_PLACEHOLDER_INSTANCE;\n  }\n\n  /**\n   * Helper to determine if a string is a URL\n   */\n  protected isUrl(str: string): boolean {\n    return str.startsWith('http://') || str.startsWith('https://');\n  }\n\n  /**\n   * Get the local MCP server package name\n   */\n  protected getLocalMcpServerPackage(): string {\n    return LOCAL_MCP_SERVER_PACKAGE;\n  }\n\n  /**\n   * Encodes a string to base64 in a way that works in both Node.js and browsers.\n   * Handles Unicode characters properly.\n   */\n  protected toBase64(str: string): string {\n    if (typeof Buffer !== 'undefined') {\n      return Buffer.from(str).toString('base64');\n    } else if (typeof btoa !== 'undefined') {\n      const bytes = new TextEncoder().encode(str);\n      const binary = String.fromCharCode(...bytes);\n\n      return btoa(binary);\n    } else {\n      throw new Error('No base64 encoding method available');\n    }\n  }\n\n  abstract getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown>;\n\n  getConfigPath(): string {\n    if (typeof process === 'undefined' || !process.platform) {\n      throw new Error('getConfigPath() is only available in Node.js environment');\n    }\n\n    if (!this.config.userConfigurable) {\n      throw new Error(\n        `${this.config.displayName} does not support local configuration. ` +\n          `${this.config.localConfigNotes || 'Configuration must be done through other means.'}`\n      );\n    }\n\n    const platformPath = this.config.configPath[this.platform];\n    if (!platformPath) {\n      throw new Error(`Platform ${this.platform} not supported for ${this.config.displayName}`);\n    }\n\n    return this.expandPath(platformPath);\n  }\n\n  private expandPath(filepath: string): string {\n    const homedir = process.env.HOME || process.env.USERPROFILE || '';\n\n    return filepath\n      .replace('$HOME', homedir)\n      .replace('%USERPROFILE%', homedir)\n      .replace('%APPDATA%', process.env.APPDATA || '')\n      .replace(/\\\\/g, '/');\n  }\n}\n","import { BaseConfigBuilder } from './BaseConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\nimport { CLIENT } from '../constants.js';\n\n// Clients that can use configure-mcp-server\nconst CONFIGURE_MCP_SUPPORTED_CLIENTS: readonly string[] = [\n  CLIENT.CLAUDE_DESKTOP,\n  CLIENT.WINDSURF,\n  CLIENT.GOOSE,\n  CLIENT.CLAUDE_CODE,\n  CLIENT.CLAUDE_TEAMS_ENTERPRISE,\n  CLIENT.CHATGPT,\n  CLIENT.JUNIE,\n];\n\nexport class GenericConfigBuilder extends BaseConfigBuilder {\n  protected buildLocalConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    const { serversPropertyName, stdioPropertyMapping } = this.config.configStructure;\n\n    if (!stdioPropertyMapping) {\n      throw new Error(`Client ${this.config.id} doesn't support local server configuration`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n    const serverConfig: Record<string, unknown> = {};\n\n    serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n    serverConfig[stdioPropertyMapping.argsProperty] = ['-y', '@gleanwork/local-mcp-server'];\n\n    if (stdioPropertyMapping.typeProperty) {\n      serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n    }\n\n    if (stdioPropertyMapping.envProperty) {\n      const env: Record<string, string> = {};\n\n      if (serverData.instance) {\n        if (\n          serverData.instance.startsWith('http://') ||\n          serverData.instance.startsWith('https://')\n        ) {\n          env.GLEAN_URL = serverData.instance;\n        } else {\n          env.GLEAN_INSTANCE = serverData.instance;\n        }\n      }\n\n      if (serverData.apiToken) {\n        env.GLEAN_API_TOKEN = serverData.apiToken;\n      }\n\n      if (Object.keys(env).length > 0) {\n        serverConfig[stdioPropertyMapping.envProperty] = env;\n      }\n    }\n\n    if (!includeRootObject) {\n      return {\n        [serverName]: serverConfig,\n      };\n    }\n\n    return {\n      [serversPropertyName]: {\n        [serverName]: serverConfig,\n      },\n    };\n  }\n\n  protected buildRemoteConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    if (!serverData.serverUrl) {\n      throw new Error('Remote configuration requires serverUrl');\n    }\n\n    const { serversPropertyName, httpPropertyMapping, stdioPropertyMapping } =\n      this.config.configStructure;\n\n    const serverName = buildMcpServerName({\n      transport: 'http',\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    if (httpPropertyMapping && this.config.transports.includes('http')) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (httpPropertyMapping.typeProperty) {\n        serverConfig[httpPropertyMapping.typeProperty] = 'http';\n      }\n\n      serverConfig[httpPropertyMapping.urlProperty] = serverData.serverUrl;\n\n      // Add headers for authentication if API token is provided\n      if (httpPropertyMapping.headersProperty && serverData.apiToken) {\n        serverConfig[httpPropertyMapping.headersProperty] = {\n          Authorization: `Bearer ${serverData.apiToken}`,\n        };\n      }\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else if (stdioPropertyMapping) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (stdioPropertyMapping.typeProperty) {\n        serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n      }\n\n      serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n      const mcpRemotePackage = serverData.mcpRemoteVersion\n        ? `mcp-remote@${serverData.mcpRemoteVersion}`\n        : 'mcp-remote';\n      const args = ['-y', mcpRemotePackage, serverData.serverUrl];\n\n      if (serverData.apiToken) {\n        args.push('--header', `Authorization: Bearer ${serverData.apiToken}`);\n      }\n\n      serverConfig[stdioPropertyMapping.argsProperty] = args;\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else {\n      throw new Error(`Client ${this.config.id} doesn't support remote server configuration`);\n    }\n  }\n\n  buildOneClickUrl?(_serverData: MCPServerConfig): string {\n    if (!this.config.protocolHandler) {\n      throw new Error(`${this.config.displayName} does not support one-click installation`);\n    }\n\n    throw new Error(`One-click URL generation not implemented for ${this.config.displayName}`);\n  }\n\n  protected buildRemoteCommand(serverData: MCPServerConfig): string | null {\n    if (!CONFIGURE_MCP_SUPPORTED_CLIENTS.includes(this.config.id)) {\n      return null;\n    }\n\n    const serverUrl = this.getServerUrl(serverData);\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    let command = `npx -y ${packageName} remote`;\n    command += ` --url ${serverUrl}`;\n    command += ` --client ${this.config.id}`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string | null {\n    if (!CONFIGURE_MCP_SUPPORTED_CLIENTS.includes(this.config.id)) {\n      return null;\n    }\n\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    let command = `npx -y ${packageName} local`;\n\n    if (serverData.instance) {\n      if (this.isUrl(serverData.instance)) {\n        command += ` --url ${serverData.instance}`;\n      } else {\n        command += ` --instance ${serverData.instance}`;\n      }\n    } else {\n      command += ` --instance ${this.getInstanceOrPlaceholder(serverData)}`;\n    }\n\n    command += ` --client ${this.config.id}`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown> {\n    const { serversPropertyName } = this.config.configStructure;\n\n    if (config[serversPropertyName]) {\n      return config[serversPropertyName] as Record<string, unknown>;\n    }\n\n    const firstKey = Object.keys(config)[0];\n    if (firstKey && typeof config[firstKey] === 'object') {\n      return config;\n    }\n\n    return {};\n  }\n}\n","import { BaseConfigBuilder } from './BaseConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\n\nexport class GooseConfigBuilder extends BaseConfigBuilder {\n  protected buildLocalConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    const { stdioPropertyMapping } = this.config.configStructure;\n\n    if (!stdioPropertyMapping) {\n      throw new Error(`Client ${this.config.id} doesn't support local server configuration`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    const serverConfig: Record<string, unknown> = {};\n\n    serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n    serverConfig[stdioPropertyMapping.argsProperty] = ['-y', '@gleanwork/local-mcp-server'];\n\n    if (stdioPropertyMapping.typeProperty) {\n      serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n    }\n\n    // Goose uses 'envs' property directly, not through stdioPropertyMapping.envProperty\n    const envs: Record<string, string> = {};\n\n    if (serverData.instance) {\n      if (serverData.instance.startsWith('http://') || serverData.instance.startsWith('https://')) {\n        envs.GLEAN_URL = serverData.instance;\n      } else {\n        envs.GLEAN_INSTANCE = serverData.instance;\n      }\n    }\n\n    if (serverData.apiToken) {\n      envs.GLEAN_API_TOKEN = serverData.apiToken;\n    }\n\n    const gooseServerConfig = {\n      name: serverName,\n      ...serverConfig,\n      type: 'stdio',\n      timeout: 300,\n      enabled: true,\n      bundled: null,\n      description: null,\n      env_keys: [],\n      envs: envs,\n    };\n\n    if (!includeRootObject) {\n      return {\n        [serverName]: gooseServerConfig,\n      };\n    }\n\n    return {\n      extensions: {\n        [serverName]: gooseServerConfig,\n      },\n    };\n  }\n\n  protected buildRemoteConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    if (!serverData.serverUrl) {\n      throw new Error('Remote configuration requires serverUrl');\n    }\n\n    const { serversPropertyName, httpPropertyMapping, stdioPropertyMapping } =\n      this.config.configStructure;\n\n    const serverName = buildMcpServerName({\n      transport: 'http',\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    if (httpPropertyMapping && this.config.transports.includes('http')) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (httpPropertyMapping.typeProperty) {\n        // Goose uses 'streamable_http' instead of 'http'\n        serverConfig[httpPropertyMapping.typeProperty] = 'streamable_http';\n      }\n\n      serverConfig[httpPropertyMapping.urlProperty] = serverData.serverUrl;\n\n      // Goose doesn't use httpPropertyMapping.headersProperty, it has its own headers property\n      const headers: Record<string, string> = {};\n      if (serverData.apiToken) {\n        headers['Authorization'] = `Bearer ${serverData.apiToken}`;\n      }\n\n      const gooseServerConfig = {\n        enabled: true,\n        name: serverName,\n        ...serverConfig,\n        envs: {},\n        env_keys: [],\n        headers: headers,\n        description: '',\n        timeout: 300,\n        bundled: null,\n        available_tools: [],\n      };\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: gooseServerConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: gooseServerConfig,\n        },\n      };\n    } else if (stdioPropertyMapping) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (stdioPropertyMapping.typeProperty) {\n        serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n      }\n\n      serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n      const mcpRemotePackage = serverData.mcpRemoteVersion\n        ? `mcp-remote@${serverData.mcpRemoteVersion}`\n        : 'mcp-remote';\n      const args = ['-y', mcpRemotePackage, serverData.serverUrl];\n\n      // Add bearer token as header for mcp-remote\n      if (serverData.apiToken) {\n        args.push('--header', `Authorization: Bearer ${serverData.apiToken}`);\n      }\n\n      serverConfig[stdioPropertyMapping.argsProperty] = args;\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else {\n      throw new Error(`Client ${this.config.id} doesn't support remote server configuration`);\n    }\n  }\n\n  protected buildRemoteCommand(serverData: MCPServerConfig): string {\n    const serverUrl = this.getServerUrl(serverData);\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    // Goose is supported by configure-mcp-server\n    let command = `npx -y ${packageName} remote`;\n    command += ` --url ${serverUrl}`;\n    command += ` --client goose`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string {\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    let command = `npx -y ${packageName} local`;\n\n    if (serverData.instance) {\n      // Handle instance URL vs instance name\n      if (this.isUrl(serverData.instance)) {\n        command += ` --url ${serverData.instance}`;\n      } else {\n        command += ` --instance ${serverData.instance}`;\n      }\n    } else {\n      command += ` --instance ${this.getInstanceOrPlaceholder(serverData)}`;\n    }\n\n    command += ` --client goose`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown> {\n    // Goose uses extensions wrapper\n    if (config['extensions']) {\n      const extensions = config['extensions'] as Record<string, Record<string, unknown>>;\n      const normalized: Record<string, unknown> = {};\n\n      for (const [name, gooseConfig] of Object.entries(extensions)) {\n        normalized[name] = {\n          type: gooseConfig.type === 'streamable_http' ? 'http' : gooseConfig.type,\n          command: gooseConfig.cmd,\n          args: gooseConfig.args,\n          env: gooseConfig.envs,\n          url: gooseConfig.uri,\n          headers: gooseConfig.headers,\n        };\n      }\n\n      return normalized;\n    }\n\n    // Check if it's already flat (no wrapper)\n    const normalized: Record<string, unknown> = {};\n    for (const [name, gooseConfig] of Object.entries(config)) {\n      if (typeof gooseConfig === 'object' && gooseConfig !== null) {\n        const gc = gooseConfig as Record<string, unknown>;\n        normalized[name] = {\n          type: gc.type === 'streamable_http' ? 'http' : gc.type,\n          command: gc.cmd,\n          args: gc.args,\n          env: gc.envs,\n          url: gc.uri,\n          headers: gc.headers,\n        };\n      }\n    }\n\n    return normalized;\n  }\n}\n","import { BaseConfigBuilder } from './BaseConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\n\nexport class VSCodeConfigBuilder extends BaseConfigBuilder {\n  protected buildLocalConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    const { serversPropertyName, stdioPropertyMapping } = this.config.configStructure;\n\n    if (!stdioPropertyMapping) {\n      throw new Error(`Client ${this.config.id} doesn't support local server configuration`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n    const serverConfig: Record<string, unknown> = {};\n\n    serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n    serverConfig[stdioPropertyMapping.argsProperty] = ['-y', '@gleanwork/local-mcp-server'];\n\n    if (stdioPropertyMapping.typeProperty) {\n      serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n    }\n\n    if (stdioPropertyMapping.envProperty) {\n      const env: Record<string, string> = {};\n\n      if (serverData.instance) {\n        if (\n          serverData.instance.startsWith('http://') ||\n          serverData.instance.startsWith('https://')\n        ) {\n          env.GLEAN_URL = serverData.instance;\n        } else {\n          env.GLEAN_INSTANCE = serverData.instance;\n        }\n      }\n\n      if (serverData.apiToken) {\n        env.GLEAN_API_TOKEN = serverData.apiToken;\n      }\n\n      if (Object.keys(env).length > 0) {\n        serverConfig[stdioPropertyMapping.envProperty] = env;\n      }\n    }\n\n    if (!includeRootObject) {\n      return {\n        [serverName]: serverConfig,\n      };\n    }\n\n    return {\n      [serversPropertyName]: {\n        [serverName]: serverConfig,\n      },\n    };\n  }\n\n  protected buildRemoteConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    if (!serverData.serverUrl) {\n      throw new Error('Remote configuration requires serverUrl');\n    }\n\n    const { serversPropertyName, httpPropertyMapping, stdioPropertyMapping } =\n      this.config.configStructure;\n\n    const serverName = buildMcpServerName({\n      transport: 'http',\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    if (httpPropertyMapping && this.config.transports.includes('http')) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (httpPropertyMapping.typeProperty) {\n        serverConfig[httpPropertyMapping.typeProperty] = 'http';\n      }\n\n      serverConfig[httpPropertyMapping.urlProperty] = serverData.serverUrl;\n\n      // Add headers for authentication if API token is provided\n      if (httpPropertyMapping.headersProperty && serverData.apiToken) {\n        serverConfig[httpPropertyMapping.headersProperty] = {\n          Authorization: `Bearer ${serverData.apiToken}`,\n        };\n      }\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else if (stdioPropertyMapping) {\n      const serverConfig: Record<string, unknown> = {};\n\n      if (stdioPropertyMapping.typeProperty) {\n        serverConfig[stdioPropertyMapping.typeProperty] = 'stdio';\n      }\n\n      serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n      const mcpRemotePackage = serverData.mcpRemoteVersion\n        ? `mcp-remote@${serverData.mcpRemoteVersion}`\n        : 'mcp-remote';\n      const args = ['-y', mcpRemotePackage, serverData.serverUrl];\n\n      // Add bearer token as header for mcp-remote\n      if (serverData.apiToken) {\n        args.push('--header', `Authorization: Bearer ${serverData.apiToken}`);\n      }\n\n      serverConfig[stdioPropertyMapping.argsProperty] = args;\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      return {\n        [serversPropertyName]: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else {\n      throw new Error(`Client ${this.config.id} doesn't support remote server configuration`);\n    }\n  }\n\n  buildOneClickUrl(serverData: MCPServerConfig): string {\n    if (!this.config.protocolHandler) {\n      throw new Error(`${this.config.displayName} does not support one-click installation`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: serverData.transport,\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    // Build the appropriate config based on the client's capabilities\n    // Special handling for VSCode - it includes the name in the config object\n    const config: Record<string, unknown> = {\n      name: serverName,\n    };\n\n    if (serverData.transport === 'http') {\n      config['type'] = 'http';\n      config['url'] = serverData.serverUrl;\n\n      // Add headers for authentication if API token is provided\n      if (serverData.apiToken) {\n        config['headers'] = {\n          Authorization: `Bearer ${serverData.apiToken}`,\n        };\n      }\n    } else {\n      config['type'] = 'stdio';\n      config['command'] = 'npx';\n      config['args'] = ['-y', '@gleanwork/local-mcp-server'];\n      if (serverData.instance || serverData.apiToken) {\n        config['env'] = {};\n        if (serverData.instance) {\n          (config['env'] as Record<string, string>)['GLEAN_INSTANCE'] = serverData.instance;\n        }\n        if (serverData.apiToken) {\n          (config['env'] as Record<string, string>)['GLEAN_API_TOKEN'] = serverData.apiToken;\n        }\n      }\n    }\n\n    // VSCode uses url-encoded-json format and puts the entire config as a query parameter\n    const encodedConfig = encodeURIComponent(JSON.stringify(config));\n\n    // VSCode uses urlTemplate with {{config}} placeholder\n    return this.config.protocolHandler.urlTemplate.replace('{{config}}', encodedConfig);\n  }\n\n  protected buildRemoteCommand(serverData: MCPServerConfig): string {\n    // VS Code has native support for HTTP servers via --add-mcp\n    const serverUrl = this.getServerUrl(serverData);\n\n    const serverName = buildMcpServerName({\n      transport: serverData.transport,\n      serverUrl: serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    const config: Record<string, unknown> = {\n      name: serverName,\n      type: 'http',\n      url: serverUrl,\n    };\n\n    if (serverData.apiToken) {\n      config.headers = {\n        Authorization: `Bearer ${serverData.apiToken}`,\n      };\n    }\n\n    // VS Code expects a JSON object as a single argument\n    const jsonConfig = JSON.stringify(config);\n    // Escape single quotes for shell\n    const escapedConfig = jsonConfig.replace(/'/g, \"'\\\\''\");\n    return `code --add-mcp '${escapedConfig}'`;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string {\n    // VS Code also supports stdio servers via --add-mcp\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    const config: Record<string, unknown> = {\n      name: serverName,\n      type: 'stdio',\n      command: 'npx',\n      args: ['-y', this.getLocalMcpServerPackage()],\n    };\n\n    const env: Record<string, string> = {};\n\n    if (serverData.instance) {\n      if (this.isUrl(serverData.instance)) {\n        env.GLEAN_URL = serverData.instance;\n      } else {\n        env.GLEAN_INSTANCE = serverData.instance;\n      }\n    } else {\n      // Use placeholder if no instance\n      env.GLEAN_INSTANCE = this.getInstanceOrPlaceholder(serverData);\n    }\n\n    if (serverData.apiToken) {\n      env.GLEAN_API_TOKEN = serverData.apiToken;\n    }\n\n    // Only add env to config if it has properties\n    if (Object.keys(env).length > 0) {\n      config.env = env;\n    }\n\n    const jsonConfig = JSON.stringify(config);\n    const escapedConfig = jsonConfig.replace(/'/g, \"'\\\\''\");\n    return `code --add-mcp '${escapedConfig}'`;\n  }\n\n  getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown> {\n    const { serversPropertyName } = this.config.configStructure;\n\n    // Check for different wrapper structures\n    if (config[serversPropertyName]) {\n      return config[serversPropertyName] as Record<string, unknown>;\n    }\n\n    // Check if it's already flat (no wrapper)\n    const firstKey = Object.keys(config)[0];\n    if (firstKey && typeof config[firstKey] === 'object') {\n      // Assume it's a flat server config\n      return config;\n    }\n\n    return {};\n  }\n}\n","import { GenericConfigBuilder } from './GenericConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\n\nexport class CursorConfigBuilder extends GenericConfigBuilder {\n  buildOneClickUrl(serverData: MCPServerConfig): string {\n    if (!this.config.protocolHandler) {\n      throw new Error(`${this.config.displayName} does not support one-click installation`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: serverData.transport,\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    let config: Record<string, unknown>;\n\n    if (serverData.transport === 'http') {\n      config = {\n        type: 'http',\n        url: serverData.serverUrl,\n      };\n\n      if (serverData.apiToken) {\n        config['headers'] = {\n          Authorization: `Bearer ${serverData.apiToken}`,\n        };\n      }\n    } else {\n      config = {\n        type: 'stdio',\n        command: 'npx',\n        args: ['-y', '@gleanwork/local-mcp-server'],\n      };\n\n      if (serverData.instance || serverData.apiToken) {\n        config['env'] = {};\n        if (serverData.instance) {\n          (config['env'] as Record<string, string>)['GLEAN_INSTANCE'] = serverData.instance;\n        }\n        if (serverData.apiToken) {\n          (config['env'] as Record<string, string>)['GLEAN_API_TOKEN'] = serverData.apiToken;\n        }\n      }\n    }\n\n    const encodedConfig = this.toBase64(JSON.stringify(config));\n\n    return this.config.protocolHandler.urlTemplate\n      .replace('{{name}}', encodeURIComponent(serverName))\n      .replace('{{config}}', encodedConfig);\n  }\n\n  protected buildRemoteCommand(serverData: MCPServerConfig): string {\n    const serverUrl = this.getServerUrl(serverData);\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    let command = `npx -y ${packageName} remote`;\n    command += ` --url ${serverUrl}`;\n    command += ` --client cursor`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string {\n    const packageName = this.getConfigureMcpServerPackage(serverData);\n\n    let command = `npx -y ${packageName} local`;\n\n    if (serverData.instance) {\n      if (this.isUrl(serverData.instance)) {\n        command += ` --url ${serverData.instance}`;\n      } else {\n        command += ` --instance ${serverData.instance}`;\n      }\n    } else {\n      command += ` --instance ${this.getInstanceOrPlaceholder(serverData)}`;\n    }\n\n    command += ` --client cursor`;\n\n    if (serverData.apiToken) {\n      command += ` --token ${serverData.apiToken}`;\n    }\n\n    return command;\n  }\n\n  getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown> {\n    const { serversPropertyName } = this.config.configStructure;\n\n    if (config[serversPropertyName]) {\n      return config[serversPropertyName] as Record<string, unknown>;\n    }\n\n    const firstKey = Object.keys(config)[0];\n    if (firstKey && typeof config[firstKey] === 'object') {\n      return config;\n    }\n\n    return {};\n  }\n}\n","import { GenericConfigBuilder } from './GenericConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\n\nexport class ClaudeCodeConfigBuilder extends GenericConfigBuilder {\n  protected buildRemoteCommand(serverData: MCPServerConfig): string {\n    const serverUrl = this.getServerUrl(serverData);\n\n    const serverName = buildMcpServerName({\n      transport: serverData.transport,\n      serverUrl: serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    let command = `claude mcp add ${serverName} ${serverUrl} --transport http --scope user`;\n\n    if (serverData.apiToken) {\n      command += ` --header \"Authorization: Bearer ${serverData.apiToken}\"`;\n    }\n\n    return command;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string {\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    let command = `claude mcp add ${serverName} --scope user`;\n\n    if (serverData.instance) {\n      if (this.isUrl(serverData.instance)) {\n        command += ` --env GLEAN_URL=${serverData.instance}`;\n      } else {\n        command += ` --env GLEAN_INSTANCE=${serverData.instance}`;\n      }\n    }\n    if (serverData.apiToken) {\n      command += ` --env GLEAN_API_TOKEN=${serverData.apiToken}`;\n    }\n\n    command += ` -- npx -y ${this.getLocalMcpServerPackage()}`;\n\n    return command;\n  }\n}\n","import { BaseConfigBuilder } from './BaseConfigBuilder.js';\nimport { MCPServerConfig } from '../types.js';\nimport { buildMcpServerName } from '../server-name.js';\n\nexport class CodexConfigBuilder extends BaseConfigBuilder {\n  protected buildLocalConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    const { stdioPropertyMapping } = this.config.configStructure;\n\n    if (!stdioPropertyMapping) {\n      throw new Error(`Client ${this.config.id} doesn't support local server configuration`);\n    }\n\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    const serverConfig: Record<string, unknown> = {};\n\n    serverConfig[stdioPropertyMapping.commandProperty] = 'npx';\n    serverConfig[stdioPropertyMapping.argsProperty] = ['-y', '@gleanwork/local-mcp-server'];\n\n    // Add environment variables if present\n    if (stdioPropertyMapping.envProperty) {\n      const env: Record<string, string> = {};\n\n      if (serverData.instance) {\n        if (\n          serverData.instance.startsWith('http://') ||\n          serverData.instance.startsWith('https://')\n        ) {\n          env.GLEAN_URL = serverData.instance;\n        } else {\n          env.GLEAN_INSTANCE = serverData.instance;\n        }\n      }\n\n      if (serverData.apiToken) {\n        env.GLEAN_API_TOKEN = serverData.apiToken;\n      }\n\n      if (Object.keys(env).length > 0) {\n        serverConfig[stdioPropertyMapping.envProperty] = env;\n      }\n    }\n\n    if (!includeRootObject) {\n      return {\n        [serverName]: serverConfig,\n      };\n    }\n\n    // Codex uses TOML table structure: [mcp_servers.<name>]\n    return {\n      mcp_servers: {\n        [serverName]: serverConfig,\n      },\n    };\n  }\n\n  protected buildRemoteConfig(\n    serverData: MCPServerConfig,\n    includeRootObject: boolean = true\n  ): Record<string, unknown> {\n    if (!serverData.serverUrl) {\n      throw new Error('Remote configuration requires serverUrl');\n    }\n\n    const { httpPropertyMapping } = this.config.configStructure;\n\n    const serverName = buildMcpServerName({\n      transport: 'http',\n      serverUrl: serverData.serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    if (httpPropertyMapping && this.config.transports.includes('http')) {\n      const serverConfig: Record<string, unknown> = {};\n\n      serverConfig[httpPropertyMapping.urlProperty] = serverData.serverUrl;\n\n      // Add bearer token via http_headers if apiToken is provided\n      if (serverData.apiToken && httpPropertyMapping.headersProperty) {\n        serverConfig[httpPropertyMapping.headersProperty] = {\n          Authorization: `Bearer ${serverData.apiToken}`,\n        };\n      }\n\n      if (!includeRootObject) {\n        return {\n          [serverName]: serverConfig,\n        };\n      }\n\n      // Codex uses TOML table structure: [mcp_servers.<name>]\n      return {\n        mcp_servers: {\n          [serverName]: serverConfig,\n        },\n      };\n    } else {\n      throw new Error(`Client ${this.config.id} doesn't support remote server configuration`);\n    }\n  }\n\n  protected buildRemoteCommand(serverData: MCPServerConfig): string {\n    const serverUrl = this.getServerUrl(serverData);\n    const serverName = buildMcpServerName({\n      transport: 'http',\n      serverUrl: serverUrl,\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    let command = `codex mcp add --url ${serverUrl}`;\n\n    if (serverData.apiToken) {\n      // For Codex, we pass the bearer token via an environment variable\n      // The user would need to set this env var before running the command\n      // Using a standard name like GLEAN_API_TOKEN\n      command += ` --bearer-token-env-var GLEAN_API_TOKEN`;\n    }\n\n    command += ` ${serverName}`;\n\n    return command;\n  }\n\n  protected buildLocalCommand(serverData: MCPServerConfig): string {\n    const serverName = buildMcpServerName({\n      transport: 'stdio',\n      serverName: serverData.serverName,\n      productName: serverData.productName,\n    });\n\n    // Format: codex mcp add <server-name> --env VAR1=VALUE1 --env VAR2=VALUE2 -- <stdio server-command>\n    let command = `codex mcp add ${serverName}`;\n\n    if (serverData.instance) {\n      if (this.isUrl(serverData.instance)) {\n        command += ` --env GLEAN_URL=${serverData.instance}`;\n      } else {\n        command += ` --env GLEAN_INSTANCE=${serverData.instance}`;\n      }\n    }\n\n    if (serverData.apiToken) {\n      command += ` --env GLEAN_API_TOKEN=${serverData.apiToken}`;\n    }\n\n    command += ` -- npx -y ${this.getLocalMcpServerPackage()}`;\n\n    return command;\n  }\n\n  getNormalizedServersConfig(config: Record<string, unknown>): Record<string, unknown> {\n    // Codex uses mcp_servers wrapper\n    if (config['mcp_servers']) {\n      const mcpServers = config['mcp_servers'] as Record<string, Record<string, unknown>>;\n      const normalized: Record<string, unknown> = {};\n\n      for (const [name, codexConfig] of Object.entries(mcpServers)) {\n        normalized[name] = {\n          command: codexConfig.command,\n          args: codexConfig.args,\n          env: codexConfig.env,\n          url: codexConfig.url,\n          headers: codexConfig.http_headers,\n        };\n      }\n\n      return normalized;\n    }\n\n    // Check if it's already flat (no wrapper)\n    const normalized: Record<string, unknown> = {};\n    for (const [name, codexConfig] of Object.entries(config)) {\n      if (typeof codexConfig === 'object' && codexConfig !== null) {\n        const cc = codexConfig as Record<string, unknown>;\n        normalized[name] = {\n          command: cc.command,\n          args: cc.args,\n          env: cc.env,\n          url: cc.url,\n          headers: cc.http_headers,\n        };\n      }\n    }\n\n    return normalized;\n  }\n}\n","{\n  \"id\": \"chatgpt\",\n  \"name\": \"chatgpt\",\n  \"displayName\": \"ChatGPT\",\n  \"description\": \"ChatGPT web interface - requires GPT configuration through web UI\",\n  \"userConfigurable\": false,\n  \"localConfigNotes\": \"ChatGPT is web-based and requires creating custom GPTs through their web UI. No local configuration file support.\",\n  \"transports\": [\"http\"],\n  \"supportedPlatforms\": [],\n  \"configFormat\": \"json\",\n  \"configPath\": {},\n  \"documentationUrl\": \"https://platform.openai.com/docs/mcp#test-and-connect-your-mcp-server\",\n  \"configStructure\": {\n    \"serversPropertyName\": \"\"\n  }\n}\n","{\n  \"id\": \"claude-code\",\n  \"name\": \"claude-code\",\n  \"displayName\": \"Claude Code\",\n  \"description\": \"Claude Code with native HTTP support\",\n  \"userConfigurable\": true,\n  \"documentationUrl\": \"https://docs.claude.com/en/docs/claude-code/mcp\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.claude.json\",\n    \"linux\": \"$HOME/.claude.json\",\n    \"win32\": \"%USERPROFILE%\\\\.claude.json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"httpPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"urlProperty\": \"url\",\n      \"headersProperty\": \"headers\"\n    },\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"claude-desktop\",\n  \"name\": \"claude-desktop\",\n  \"displayName\": \"Claude for Desktop\",\n  \"description\": \"Claude Desktop only supports stdio, requires mcp-remote for HTTP servers\",\n  \"userConfigurable\": true,\n  \"localConfigNotes\": \"Requires mcp-remote for remote servers\",\n  \"documentationUrl\": \"https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp\",\n  \"transports\": [\"stdio\"],\n  \"supportedPlatforms\": [\"darwin\", \"win32\", \"linux\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/Library/Application Support/Claude/claude_desktop_config.json\",\n    \"win32\": \"%APPDATA%\\\\Claude\\\\claude_desktop_config.json\",\n    \"linux\": \"$HOME/.config/Claude/claude_desktop_config.json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"claude-teams-enterprise\",\n  \"name\": \"claude-teams-enterprise\",\n  \"displayName\": \"Claude for Teams/Enterprise\",\n  \"description\": \"Claude for Teams and Enterprise\",\n  \"userConfigurable\": false,\n  \"localConfigNotes\": \"MCP servers are centrally managed by admins. No local configuration support - servers must be configured at the organization level.\",\n  \"transports\": [\"http\"],\n  \"supportedPlatforms\": [],\n  \"configFormat\": \"json\",\n  \"configPath\": {},\n  \"documentationUrl\": \"https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp\",\n  \"configStructure\": {\n    \"serversPropertyName\": \"\"\n  }\n}\n","{\n  \"id\": \"codex\",\n  \"name\": \"codex\",\n  \"displayName\": \"Codex\",\n  \"description\": \"OpenAI Codex with native HTTP and stdio support\",\n  \"userConfigurable\": true,\n  \"documentationUrl\": \"https://developers.openai.com/codex/mcp\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"toml\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.codex/config.toml\",\n    \"linux\": \"$HOME/.codex/config.toml\",\n    \"win32\": \"%USERPROFILE%\\\\.codex\\\\config.toml\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcp_servers\",\n    \"httpPropertyMapping\": {\n      \"urlProperty\": \"url\",\n      \"headersProperty\": \"http_headers\"\n    },\n    \"stdioPropertyMapping\": {\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"cursor\",\n  \"name\": \"cursor\",\n  \"displayName\": \"Cursor\",\n  \"description\": \"Cursor with native HTTP support\",\n  \"userConfigurable\": true,\n  \"documentationUrl\": \"https://docs.cursor.com/context/model-context-protocol\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.cursor/mcp.json\",\n    \"linux\": \"$HOME/.cursor/mcp.json\",\n    \"win32\": \"%USERPROFILE%\\\\.cursor\\\\mcp.json\"\n  },\n  \"protocolHandler\": {\n    \"protocol\": \"cursor://\",\n    \"urlTemplate\": \"cursor://anysphere.cursor-deeplink/mcp/install?name={{name}}&config={{config}}\",\n    \"configFormat\": \"base64-json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"httpPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"urlProperty\": \"url\",\n      \"headersProperty\": \"headers\"\n    },\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"goose\",\n  \"name\": \"goose\",\n  \"displayName\": \"Goose\",\n  \"description\": \"Goose with native HTTP support\",\n  \"userConfigurable\": true,\n  \"documentationUrl\": \"https://github.com/block/goose\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"yaml\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.config/goose/config.yaml\",\n    \"linux\": \"$HOME/.config/goose/config.yaml\",\n    \"win32\": \"%USERPROFILE%\\\\.config\\\\goose\\\\config.yaml\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"extensions\",\n    \"httpPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"urlProperty\": \"uri\"\n    },\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"cmd\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"envs\"\n    }\n  }\n}\n","{\n  \"id\": \"vscode\",\n  \"name\": \"vscode\",\n  \"displayName\": \"Visual Studio Code\",\n  \"description\": \"VS Code with native HTTP support\",\n  \"userConfigurable\": true,\n  \"documentationUrl\": \"https://code.visualstudio.com/docs/copilot/customization/mcp-servers\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/Library/Application Support/Code/User/mcp.json\",\n    \"linux\": \"$HOME/.config/Code/User/mcp.json\",\n    \"win32\": \"%APPDATA%\\\\Code\\\\User\\\\mcp.json\"\n  },\n  \"protocolHandler\": {\n    \"protocol\": \"vscode:\",\n    \"urlTemplate\": \"vscode:mcp/install?{{config}}\",\n    \"configFormat\": \"url-encoded-json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"servers\",\n    \"httpPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"urlProperty\": \"url\",\n      \"headersProperty\": \"headers\"\n    },\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"windsurf\",\n  \"name\": \"windsurf\",\n  \"displayName\": \"Windsurf\",\n  \"description\": \"Windsurf supports both stdio and native HTTP connections\",\n  \"userConfigurable\": true,\n  \"localConfigNotes\": \"Supports both stdio and native HTTP connections\",\n  \"documentationUrl\": \"https://docs.windsurf.com/windsurf/cascade/mcp#model-context-protocol-mcp\",\n  \"transports\": [\"stdio\", \"http\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.codeium/windsurf/mcp_config.json\",\n    \"linux\": \"$HOME/.codeium/windsurf/mcp_config.json\",\n    \"win32\": \"%USERPROFILE%\\\\.codeium\\\\windsurf\\\\mcp_config.json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"httpPropertyMapping\": {\n      \"urlProperty\": \"serverUrl\"\n    },\n    \"stdioPropertyMapping\": {\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"junie\",\n  \"name\": \"junie\",\n  \"displayName\": \"Junie (JetBrains)\",\n  \"description\": \"JetBrains Junie AI agent - stdio only, requires mcp-remote for HTTP\",\n  \"userConfigurable\": true,\n  \"localConfigNotes\": \"Requires mcp-remote for remote servers\",\n  \"documentationUrl\": \"https://www.jetbrains.com/help/junie/model-context-protocol-mcp.html\",\n  \"transports\": [\"stdio\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {\n    \"darwin\": \"$HOME/.junie/mcp.json\",\n    \"linux\": \"$HOME/.junie/mcp.json\",\n    \"win32\": \"%USERPROFILE%\\\\.junie\\\\mcp.json\"\n  },\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","{\n  \"id\": \"jetbrains\",\n  \"name\": \"jetbrains\",\n  \"displayName\": \"JetBrains AI Assistant\",\n  \"description\": \"JetBrains AI Assistant for all JetBrains IDEs - stdio only, configure via IDE UI\",\n  \"userConfigurable\": true,\n  \"localConfigNotes\": \"Configuration must be pasted into Settings → Tools → AI Assistant → Model Context Protocol → Add → As JSON. Direct file writing is not supported due to version-specific XML storage.\",\n  \"documentationUrl\": \"https://www.jetbrains.com/help/ai-assistant/mcp.html\",\n  \"transports\": [\"stdio\"],\n  \"supportedPlatforms\": [\"darwin\", \"linux\", \"win32\"],\n  \"configFormat\": \"json\",\n  \"configPath\": {},\n  \"configStructure\": {\n    \"serversPropertyName\": \"mcpServers\",\n    \"stdioPropertyMapping\": {\n      \"typeProperty\": \"type\",\n      \"commandProperty\": \"command\",\n      \"argsProperty\": \"args\",\n      \"envProperty\": \"env\"\n    }\n  }\n}\n","import { MCPClientConfig, ClientId, Platform, safeValidateClientConfig } from './types.js';\n\nimport { BaseConfigBuilder } from './builders/BaseConfigBuilder.js';\nimport { GenericConfigBuilder } from './builders/GenericConfigBuilder.js';\nimport { GooseConfigBuilder } from './builders/GooseConfigBuilder.js';\nimport { VSCodeConfigBuilder } from './builders/VSCodeConfigBuilder.js';\nimport { CursorConfigBuilder } from './builders/CursorConfigBuilder.js';\nimport { ClaudeCodeConfigBuilder } from './builders/ClaudeCodeConfigBuilder.js';\nimport { CodexConfigBuilder } from './builders/CodexConfigBuilder.js';\nimport chatgptConfig from '../configs/chatgpt.json';\nimport claudeCodeConfig from '../configs/claude-code.json';\nimport claudeDesktopConfig from '../configs/claude-desktop.json';\nimport claudeTeamsEnterpriseConfig from '../configs/claude-teams-enterprise.json';\nimport codexConfig from '../configs/codex.json';\nimport cursorConfig from '../configs/cursor.json';\nimport gooseConfig from '../configs/goose.json';\nimport vscodeConfig from '../configs/vscode.json';\nimport windsurfConfig from '../configs/windsurf.json';\nimport junieConfig from '../configs/junie.json';\nimport jetbrainsConfig from '../configs/jetbrains.json';\nconst allConfigs = [\n  chatgptConfig,\n  claudeCodeConfig,\n  claudeDesktopConfig,\n  claudeTeamsEnterpriseConfig,\n  codexConfig,\n  cursorConfig,\n  gooseConfig,\n  vscodeConfig,\n  windsurfConfig,\n  junieConfig,\n  jetbrainsConfig,\n];\n\nexport class MCPConfigRegistry {\n  private configs: Map<ClientId, MCPClientConfig> = new Map();\n  private builderFactories: Map<ClientId, new (config: MCPClientConfig) => BaseConfigBuilder> =\n    new Map();\n\n  constructor() {\n    this.loadConfigs();\n    this.registerBuilders();\n  }\n\n  private registerBuilders(): void {\n    // Register specific builders for clients that need special handling\n    this.builderFactories.set(\n      'goose' as ClientId,\n      GooseConfigBuilder as new (config: MCPClientConfig) => BaseConfigBuilder\n    );\n    this.builderFactories.set(\n      'vscode' as ClientId,\n      VSCodeConfigBuilder as new (config: MCPClientConfig) => BaseConfigBuilder\n    );\n    this.builderFactories.set(\n      'cursor' as ClientId,\n      CursorConfigBuilder as new (config: MCPClientConfig) => BaseConfigBuilder\n    );\n    this.builderFactories.set(\n      'claude-code' as ClientId,\n      ClaudeCodeConfigBuilder as new (config: MCPClientConfig) => BaseConfigBuilder\n    );\n    this.builderFactories.set(\n      'codex' as ClientId,\n      CodexConfigBuilder as new (config: MCPClientConfig) => BaseConfigBuilder\n    );\n    // Other clients will use GenericConfigBuilder by default\n  }\n\n  private loadConfigs(): void {\n    for (const data of allConfigs) {\n      try {\n        const result = safeValidateClientConfig(data);\n\n        if (!result.success) {\n          const errorMessage = result.error.issues\n            .map((err) => `  - ${err.path.join('.')}: ${err.message}`)\n            .join('\\n');\n          throw new Error(`Validation failed:\\n${errorMessage}`);\n        }\n\n        const config = result.data;\n        this.validateBusinessRules(config);\n\n        this.configs.set(config.id, config);\n      } catch (error) {\n        const configId = (data as Record<string, unknown>).id || 'unknown';\n        if (error instanceof Error) {\n          console.error(`Failed to load config ${configId}:\\n${error.message}`);\n        } else {\n          console.error(`Failed to load config ${configId}:`, error);\n        }\n      }\n    }\n  }\n\n  private validateBusinessRules(config: MCPClientConfig): void {\n    if (!config.userConfigurable) {\n      return;\n    }\n    if (\n      !config.configStructure.httpPropertyMapping &&\n      !config.configStructure.stdioPropertyMapping\n    ) {\n      throw new Error(`Client must support at least one configuration type (http or stdio)`);\n    }\n\n    // Business rule: HTTP support requires httpPropertyMapping\n    if (config.transports.includes('http') && !config.configStructure.httpPropertyMapping) {\n      throw new Error(`Client with HTTP support must have httpPropertyMapping defined`);\n    }\n  }\n\n  getConfig(clientId: ClientId): MCPClientConfig | undefined {\n    return this.configs.get(clientId);\n  }\n\n  getAllConfigs(): MCPClientConfig[] {\n    return Array.from(this.configs.values());\n  }\n\n  getNativeHttpClients(): MCPClientConfig[] {\n    return this.getAllConfigs().filter((config) => config.transports.includes('http'));\n  }\n\n  getBridgeRequiredClients(): MCPClientConfig[] {\n    // Clients that don't support HTTP natively need mcp-remote bridge\n    return this.getAllConfigs().filter((config) => !config.transports.includes('http'));\n  }\n\n  getStdioOnlyClients(): MCPClientConfig[] {\n    return this.getAllConfigs().filter(\n      (config) => config.transports.length === 1 && config.transports[0] === 'stdio'\n    );\n  }\n\n  getClientsWithOneClick(): MCPClientConfig[] {\n    return this.getAllConfigs().filter((config) => config.protocolHandler !== undefined);\n  }\n\n  getSupportedClients(): MCPClientConfig[] {\n    return this.getAllConfigs().filter((config) => config.userConfigurable);\n  }\n\n  getClientsByPlatform(platform: Platform): MCPClientConfig[] {\n    return this.getAllConfigs().filter((config) => config.supportedPlatforms.includes(platform));\n  }\n\n  getUnsupportedClients(): MCPClientConfig[] {\n    return this.getAllConfigs().filter((config) => !config.userConfigurable);\n  }\n\n  /**\n   * Determines if a client needs mcp-remote to connect to HTTP servers.\n   * @param clientId - The client to check\n   * @returns true if the client needs mcp-remote for HTTP connections\n   */\n  clientNeedsMcpRemote(clientId: ClientId): boolean {\n    const config = this.getConfig(clientId);\n    if (!config) {\n      throw new Error(`Unknown client: ${clientId}`);\n    }\n    return !config.transports.includes('http');\n  }\n\n  /**\n   * Determines if a client can connect to HTTP servers natively.\n   * @param clientId - The client to check\n   * @returns true if the client supports HTTP natively\n   */\n  clientSupportsHttpNatively(clientId: ClientId): boolean {\n    const config = this.getConfig(clientId);\n    if (!config) {\n      throw new Error(`Unknown client: ${clientId}`);\n    }\n    return config.transports.includes('http');\n  }\n\n  /**\n   * Determines if a client can connect to stdio servers.\n   * @param clientId - The client to check\n   * @returns true if the client supports stdio\n   */\n  clientSupportsStdio(clientId: ClientId): boolean {\n    const config = this.getConfig(clientId);\n    if (!config) {\n      throw new Error(`Unknown client: ${clientId}`);\n    }\n    return config.transports.includes('stdio');\n  }\n\n  createBuilder(clientId: ClientId): BaseConfigBuilder {\n    const config = this.getConfig(clientId);\n    if (!config) {\n      throw new Error(`Unknown client: ${clientId}`);\n    }\n    if (!config.userConfigurable) {\n      throw new Error(\n        `Cannot create builder for ${config.displayName}: ${config.localConfigNotes || 'No local configuration support.'}`\n      );\n    }\n\n    // Check if we have a specific builder for this client\n    const BuilderClass = this.builderFactories.get(clientId);\n    if (BuilderClass) {\n      return new BuilderClass(config);\n    }\n\n    // Fall back to GenericConfigBuilder for clients without custom builders\n    return new GenericConfigBuilder(config);\n  }\n}\n","import { ClientId, MCPServerConfig } from './types.js';\nimport { MCPConfigRegistry } from './registry.js';\n\n// Create a singleton instance of the registry\nconst registry = new MCPConfigRegistry();\n\n/**\n * Convenience function to build configuration for a specific client\n * without needing to instantiate the registry directly.\n *\n * @param clientId - The client to build configuration for\n * @param serverData - The server configuration data\n * @returns The built configuration object\n */\nexport function buildConfiguration(\n  clientId: ClientId,\n  serverData: MCPServerConfig\n): Record<string, unknown> {\n  const builder = registry.createBuilder(clientId);\n  return builder.buildConfiguration(serverData);\n}\n\n/**\n * Convenience function to build configuration as a string for a specific client\n * without needing to instantiate the registry directly.\n *\n * @param clientId - The client to build configuration for\n * @param serverData - The server configuration data\n * @returns The built configuration as a formatted string (JSON or YAML)\n */\nexport function buildConfigurationString(clientId: ClientId, serverData: MCPServerConfig): string {\n  const builder = registry.createBuilder(clientId);\n  const config = builder.buildConfiguration(serverData);\n  return builder.toString(config);\n}\n\n/**\n * Convenience function to build a one-click installation URL for a specific client\n * without needing to instantiate the registry directly.\n *\n * @param clientId - The client to build the URL for\n * @param serverData - The server configuration data\n * @returns The one-click installation URL\n */\nexport function buildOneClickUrl(clientId: ClientId, serverData: MCPServerConfig): string {\n  const builder = registry.createBuilder(clientId);\n  if (!builder.buildOneClickUrl) {\n    throw new Error(`One-click URL is not supported for client: ${clientId}`);\n  }\n  return builder.buildOneClickUrl(serverData);\n}\n\n/**\n * Determines if a client needs mcp-remote to connect to HTTP servers.\n * This is a convenience function that doesn't require instantiating the registry.\n *\n * @param clientId - The client to check\n * @returns true if the client needs mcp-remote for HTTP connections\n */\nexport function clientNeedsMcpRemote(clientId: ClientId): boolean {\n  return registry.clientNeedsMcpRemote(clientId);\n}\n\n/**\n * Determines if a client can connect to HTTP servers natively.\n * This is a convenience function that doesn't require instantiating the registry.\n *\n * @param clientId - The client to check\n * @returns true if the client supports HTTP natively\n */\nexport function clientSupportsHttpNatively(clientId: ClientId): boolean {\n  return registry.clientSupportsHttpNatively(clientId);\n}\n\n/**\n * Determines if a client can connect to stdio servers.\n * This is a convenience function that doesn't require instantiating the registry.\n *\n * @param clientId - The client to check\n * @returns true if the client supports stdio\n */\nexport function clientSupportsStdio(clientId: ClientId): boolean {\n  return registry.clientSupportsStdio(clientId);\n}\n\n/**\n * Convenience function to build a CLI command for installing an MCP server\n * without needing to instantiate the registry directly.\n *\n * @param clientId - The client to build the command for\n * @param serverData - The server configuration data\n * @returns The CLI command string, or null if the client doesn't support CLI installation\n */\nexport function buildCommand(clientId: ClientId, serverData: MCPServerConfig): string | null {\n  try {\n    const builder = registry.createBuilder(clientId);\n    return builder.buildCommand(serverData);\n  } catch (error) {\n    // Return null for any errors (unsupported clients, validation errors, etc.)\n    return null;\n  }\n}\n"],"mappings":"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","names":["normalized","normalized"]}