{"record":{"id":"fee0fbbef7b4ae4b","repo":"musistudio/claude-code-router","slug":"mcp-server-must-be-saved-before-tool-discovery-fee0fb","errorCode":null,"errorMessage":"MCP server must be saved before tool discovery.","messagePattern":"MCP server must be saved before tool discovery\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/electron/src/main/ipc.ts","lineNumber":145,"sourceCode":"ipcMain.handle(IPC_CHANNELS.appGetPluginMarketplace, () => getPluginMarketplace());\nipcMain.handle(IPC_CHANNELS.appGetRequestLogDetail, (_event, request) => getRequestLogDetail(request));\nipcMain.handle(IPC_CHANNELS.appGetRequestLogBodyChunk, (_event, request) => getRequestLogBodyChunk(request));\nipcMain.handle(IPC_CHANNELS.appGetRequestLogs, (_event, filter?: RequestLogListFilter) => getRequestLogs(filter));\nipcMain.handle(IPC_CHANNELS.appGetUpdateStatus, () => appUpdateService.getStatus());\nipcMain.handle(IPC_CHANNELS.appGetUsageStats, (_event, range?: UsageStatsRange, filter?: UsageStatsFilter) => getUsageStats(range, filter));\nipcMain.handle(IPC_CHANNELS.appFetchProviderManifest, (_event, request: ProviderManifestFetchRequest) => fetchProviderManifest(request));\nipcMain.handle(IPC_CHANNELS.appImportLocalAgentProvider, (_event, request: LocalAgentProviderImportRequest) => importLocalAgentProvider(request));\nipcMain.handle(IPC_CHANNELS.appProbeLocalAgentProvider, (_event, request) => probeLocalAgentProvider(request));\nipcMain.handle(IPC_CHANNELS.appInstallProxyCertificate, () => proxyService.installCertificate());\nipcMain.handle(IPC_CHANNELS.appListMcpServerTools, async (_event, serverName: string) => {\n  const name = typeof serverName === \"string\" ? serverName.trim() : \"\";\n  if (!name) {\n    throw new Error(\"MCP server name is required.\");\n  }\n  const config = await loadAppConfig();\n  const server = config.agent.mcpServers.find((candidate) => candidate.name === name);\n  if (!server) {\n    throw new Error(\"MCP server must be saved before tool discovery.\");\n  }\n  return listMcpServerTools(server);\n});\nipcMain.handle(IPC_CHANNELS.appStartChromeLoginImport, async (_event, request: ChromeLoginImportRequest) => {\n  return await chromeLoginImportService.createJob(request);\n});\nipcMain.handle(IPC_CHANNELS.appGetChromeLoginImport, (_event, id: string) => {\n  return chromeLoginImportService.getJob(typeof id === \"string\" ? id : \"\");\n});\nipcMain.handle(IPC_CHANNELS.appOpenBuiltInBrowser, async (_event, url?: string) => {\n  const config = await loadAppConfig();\n  await builtInBrowserService.open(config, url);\n});\nipcMain.handle(IPC_CHANNELS.appOpenPluginApp, async (_event, pluginId: string, appId?: string) => {\n  const normalizedPluginId = readString(pluginId);\n  if (!normalizedPluginId) {\n    throw new Error(\"Plugin id is required.\");\n  }","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/electron/src/main/ipc.ts#L127-L163","documentation":"Error \"MCP server must be saved before tool discovery.\" thrown in musistudio/claude-code-router.","triggerScenarios":"Thrown at packages/electron/src/main/ipc.ts:145 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}