diff --git a/src/WaitForHelper.ts b/src/WaitForHelper.ts index f41ca84cc..6a67224c3 100644 --- a/src/WaitForHelper.ts +++ b/src/WaitForHelper.ts @@ -128,8 +128,10 @@ export class WaitForHelper { action: () => Promise, options?: {timeout?: number; handleDialog?: 'accept' | 'dismiss' | string}, ): Promise { + let dialogOpened = false; if (options?.handleDialog) { const dialogHandler = (dialog: Pick) => { + dialogOpened = true; if (options.handleDialog === 'dismiss') { void dialog.dismiss(); } else if (options.handleDialog === 'accept') { @@ -167,6 +169,10 @@ export class WaitForHelper { try { await navigationFinished; + if (dialogOpened) { + return; + } + // Wait for stable dom after navigation so we execute in // the correct context await this.waitForStableDom(); diff --git a/src/index.ts b/src/index.ts index 24b7d42a0..f7d550681 100644 --- a/src/index.ts +++ b/src/index.ts @@ -199,19 +199,22 @@ export async function createMcpServer( logger(`${tool.name} request: ${JSON.stringify(params, null, ' ')}`); const context = await getContext(); logger(`${tool.name} context: resolved`); - await context.detectOpenDevToolsWindows(); + const page = + serverArgs.experimentalPageIdRouting && + params.pageId && + !serverArgs.slim + ? context.getPageById(params.pageId) + : context.getSelectedMcpPage(); + // If there is a dialog open, we will skip devtools detection + if (!page.getDialog()) { + await context.detectOpenDevToolsWindows(); + } const response = serverArgs.slim ? new SlimMcpResponse(serverArgs) : new McpResponse(serverArgs); response.setRedactNetworkHeaders(serverArgs.redactNetworkHeaders); if ('pageScoped' in tool && tool.pageScoped) { - const page = - serverArgs.experimentalPageIdRouting && - params.pageId && - !serverArgs.slim - ? context.getPageById(params.pageId) - : context.getSelectedMcpPage(); response.setPage(page); await tool.handler( { diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index 4ff48ecf1..5e0aef9f9 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -344,6 +344,18 @@ export function definePageTool< return { ...definition, pageScoped: true, + handler: async (request, response, context) => { + try { + await definition.handler(request, response, context); + } catch (error) { + const dialog = request.page.getDialog(); + if (dialog) { + response.appendResponseLine(`[Blocked] Action triggered a dialog.`); + return; + } + throw error; + } + }, } as DefinedPageTool; }