{"record":{"id":"48a000d7d6260770","repo":"musistudio/claude-code-router","slug":"browser-tab-close-requires-tabid-or-session","errorCode":null,"errorMessage":"browser_tab_close requires tabId or session.","messagePattern":"browser_tab_close requires tabId or session\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/electron/src/main/browser-automation-mcp.ts","lineNumber":803,"sourceCode":"        await this.ensureBrowserOpen();\n        const session = this.resolveOptionalSession(args);\n        const tabId = readString(args.tabId) || session?.ref.tabId;\n        if (!tabId) {\n          throw new Error(\"browser_tab_activate requires tabId or session.\");\n        }\n        const state = builtInBrowserService.selectAutomationTab(tabId);\n        return {\n          ...browserWindowState(state),\n          tab: summarizeTab(requiredTabState(state, tabId), state.activeTabId)\n        };\n      }\n      case \"browser_tab_close\": {\n        await this.ensureBrowserOpen();\n        const session = this.resolveOptionalSession(args);\n        this.assertCanMutate(session);\n        const tabId = readString(args.tabId) || session?.ref.tabId;\n        if (!tabId) {\n          throw new Error(\"browser_tab_close requires tabId or session.\");\n        }\n        const state = builtInBrowserService.closeAutomationTab(tabId);\n        this.removeSessionsForTab(tabId);\n        return browserWindowState(state);\n      }\n      case \"browser_navigate\": {\n        await this.ensureBrowserOpen();\n        const session = this.resolveOptionalSession(args);\n        this.assertCanMutate(session);\n        const tabId = readString(args.tabId) || session?.ref.tabId || builtInBrowserService.getAutomationState().activeTabId;\n        if (!tabId) {\n          throw new Error(\"browser_navigate could not resolve an active tab.\");\n        }\n        const url = requiredString(args.url, \"browser_navigate requires url.\");\n        const waitUntil = normalizeWaitUntil(readString(args.waitUntil), \"interactive\");\n        const readiness = await waitForReadiness(\n          builtInBrowserService.getAutomationWebContents(tabId),\n          waitUntil,","sourceCodeStart":785,"sourceCodeEnd":821,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/electron/src/main/browser-automation-mcp.ts#L785-L821","documentation":"Thrown by the browser_tab_close MCP tool when no tab identifier can be resolved from args.tabId or an attached session. Closing requires an explicit target tab; the tool intentionally has no 'close active tab' implicit behavior.","triggerScenarios":"Calling tools/call with name='browser_tab_close' with empty arguments (no tabId, no session), or with a session whose ref failed to resolve.","commonSituations":"A script closes tabs in a loop after the tab was already closed and removed from the session map; the caller assumed the last-used tab would be implicit.","solutions":["Pass tabId explicitly in the tool arguments.","Or pass the session ref obtained from the tool run that created the tab.","Re-query tab state before closing to confirm the tab still exists and capture its id."],"exampleFix":"// before\nawait call(\"browser_tab_close\", {});\n\n// after\nawait call(\"browser_tab_close\", { tabId });","handlingStrategy":"validation","validationCode":"if (!args.tabId && !args.session?.ref?.tabId) throw new Error(\"No tab to close — fetch state first\");\nawait call(\"browser_tab_close\", args);","typeGuard":"function hasTabTarget(args: unknown): boolean { const a = args as any; return Boolean(a?.tabId ?? a?.session?.ref?.tabId); }","tryCatchPattern":"try { await call(\"browser_tab_close\", { tabId }); } catch (e) { if (e instanceof Error && e.message.includes(\"requires tabId or session\")) { /* re-list tabs */ } throw e; }","preventionTips":["Track open tab ids in script state","Tolerate already-closed tabs in cleanup loops","Re-query after bulk operations"],"tags":["mcp","browser-automation","missing-param","tab-management"],"backgroundTag":"missing-required-parameter","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}