From 016eac6c05c3165af06090e7f0de09f9d0c8c0a1 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Fri, 31 Oct 2025 09:00:20 +0100 Subject: [PATCH] fix: work around NTP iframes causing hangs --- src/McpContext.ts | 2 ++ src/browser.ts | 7 +++++++ src/main.ts | 1 + 3 files changed, 10 insertions(+) diff --git a/src/McpContext.ts b/src/McpContext.ts index ceae3513..47c5030a 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -343,11 +343,13 @@ export class McpContext implements Context { } async detectOpenDevToolsWindows() { + this.logger('Detecting open DevTools windows'); const pages = await this.browser.pages(); this.#pageToDevToolsPage = new Map(); for (const devToolsPage of pages) { if (devToolsPage.url().startsWith('devtools://')) { try { + this.logger('Calling getTargetInfo for ' + devToolsPage.url()); const data = await devToolsPage // @ts-expect-error no types for _client(). ._client() diff --git a/src/browser.ts b/src/browser.ts index d0c99c7f..f3f3d9e1 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -8,6 +8,7 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; +import {logger} from './logger.js'; import type { Browser, ChromeReleaseChannel, @@ -29,6 +30,10 @@ function makeTargetFilter() { if (target.url() === 'chrome://newtab/') { return true; } + if (target.url().startsWith('https://ogs.google.com/widget/app/so')) { + // Some special frame on the NTP that is not picked up by CDP-auto-attach. + return false; + } for (const prefix of ignoredPrefixes) { if (target.url().startsWith(prefix)) { return false; @@ -65,7 +70,9 @@ export async function ensureBrowserConnected(options: { throw new Error('Either browserURL or wsEndpoint must be provided'); } + logger('Connecting Puppeteer to ', JSON.stringify(connectOptions)); browser = await puppeteer.connect(connectOptions); + logger('Connected Puppeteer'); return browser; } diff --git a/src/main.ts b/src/main.ts index 9dad338e..395f07a8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -129,6 +129,7 @@ function registerTool(tool: ToolDefinition): void { try { logger(`${tool.name} request: ${JSON.stringify(params, null, ' ')}`); const context = await getContext(); + logger(`${tool.name} context: resolved`); await context.detectOpenDevToolsWindows(); const response = new McpResponse(); await tool.handler(