diff --git a/packages/playwright-core/src/tools/utils/mcp/server.ts b/packages/playwright-core/src/tools/utils/mcp/server.ts index 948de9ac1de8e..29c3c4fadc9d1 100644 --- a/packages/playwright-core/src/tools/utils/mcp/server.ts +++ b/packages/playwright-core/src/tools/utils/mcp/server.ts @@ -94,8 +94,14 @@ export function createServer(name: string, version: string, factory: ServerBacke }); let backendPromise: Promise | undefined; + let browserConnectionEnded = false; - const onClose = () => backendPromise?.then(b => backendManager.disposeBackend(b)).catch(serverDebug); + const onClose = () => { + const p = backendPromise; + backendPromise = undefined; + browserConnectionEnded = true; + p?.then(b => backendManager.disposeBackend(b)).catch(serverDebug); + }; addServerListener(server, 'close', onClose); server.setRequestHandler(mcpBundle.CallToolRequestSchema, async (request, extra) => { @@ -117,7 +123,10 @@ export function createServer(name: string, version: string, factory: ServerBacke } : () => {}; try { + let wasRecovery = false; if (!backendPromise) { + wasRecovery = browserConnectionEnded; + browserConnectionEnded = false; backendPromise = initializeServer(server, factory, runHeartbeat).catch(e => { backendPromise = undefined; throw e; @@ -132,6 +141,14 @@ export function createServer(name: string, version: string, factory: ServerBacke delete toolResult.isClose; } + // Prepend recovery notice if we reconnected between tool calls + if (wasRecovery) { + toolResult.content = [ + { type: 'text', text: '**Note:** Browser connection ended unexpectedly. A new browser has been started — previous state might be lost.' }, + ...toolResult.content, + ]; + } + const mergedResult = mergeTextParts(toolResult); serverDebugResponse('callResult', mergedResult); return mergedResult;