{"record":{"id":"9ebbf35c348acb7a","repo":"musistudio/claude-code-router","slug":"browser-tab-was-not-found-tabid","errorCode":null,"errorMessage":"Browser tab was not found: ${tabId}","messagePattern":"Browser tab was not found: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/electron/src/main/browser-automation-mcp.ts","lineNumber":1117,"sourceCode":"    await builtInBrowserService.openHidden(await loadAppConfig());\n    return builtInBrowserService.getAutomationState();\n  }\n\n  private async ensureBrowserVisible(): Promise<BuiltInBrowserState> {\n    await builtInBrowserService.open(await loadAppConfig());\n    return builtInBrowserService.getAutomationState();\n  }\n\n  private async openSession(args: Record<string, unknown>): Promise<unknown> {\n    let state = await this.ensureBrowserOpen();\n    const url = readString(args.url);\n    const requestedTabId = readString(args.tabId);\n    const previousActiveTabId = state.activeTabId;\n    let tabId = requestedTabId;\n    let createdTab = false;\n\n    if (tabId && !state.tabs.some((tab) => tab.id === tabId)) {\n      throw new Error(`Browser tab was not found: ${tabId}`);\n    }\n\n    if (!tabId && url) {\n      const tab = builtInBrowserService.createAutomationTab();\n      tabId = tab.id;\n      createdTab = true;\n    } else if (!tabId) {\n      tabId = state.activeTabId || builtInBrowserService.createAutomationTab().id;\n      createdTab = !state.activeTabId;\n    } else if (state.activeTabId !== tabId) {\n      builtInBrowserService.selectAutomationTab(tabId);\n    }\n\n    if (!tabId) {\n      throw new Error(\"Unable to resolve browser tab for automation session.\");\n    }\n\n    const waitUntil = normalizeWaitUntil(readString(args.waitUntil), url ? \"interactive\" : \"none\");","sourceCodeStart":1099,"sourceCodeEnd":1135,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/electron/src/main/browser-automation-mcp.ts#L1099-L1135","documentation":"Thrown at the start of the main browser automation tool run when args.tabId is provided but does not match any tab in the automation browser's state. It is an explicit-target validation: an unknown tab id is rejected immediately rather than creating a new tab.","triggerScenarios":"Passing a tabId from a stale prior session after tabs were closed, from a different browser instance, or a fabricated/mistyped id.","commonSituations":"Scripts cache tab ids across steps; a tab crashes or is closed mid-script between obtaining the id and using it; the automation browser was reopened resetting tab ids.","solutions":["Re-fetch current tab state via browser_tab_list and use a live tabId.","If you want a new tab, omit tabId and pass url so one is created.","Handle this error in scripts by re-querying state instead of retrying the same stale id."],"exampleFix":"// before\nawait call(\"browser_navigate\", { url, tabId: cachedTabId }); // tab was closed\n\n// after\nconst { tabs } = await call(\"browser_tab_list\", {});\nconst live = tabs.find((t) => t.url.includes(\"example.com\")) ?? tabs[0];\nawait call(\"browser_navigate\", { url, tabId: live?.id });","handlingStrategy":"fallback","validationCode":"const { tabs } = await call(\"browser_tab_list\", {});\nif (!tabs.some((t) => t.id === tabId)) { tabId = tabs[0]?.id; } // refresh stale id\nawait call(\"browser_navigate\", { url, tabId });","typeGuard":null,"tryCatchPattern":"try { await call(\"browser_navigate\", { url, tabId }); } catch (e) { if (e instanceof Error && e.message.includes(\"Browser tab was not found\")) { const { tabs } = await call(\"browser_tab_list\", {}); await call(\"browser_navigate\", { url, tabId: tabs[0]?.id }); } else throw e; }","preventionTips":["Re-validate cached tab ids before use","Omit tabId + pass url to create a tab when unsure","Treat tab closures as invalidating script state"],"tags":["mcp","browser-automation","tab-not-found","stale-reference"],"backgroundTag":"tab-id-not-found","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}