Skip to content

Commit d381b8d

Browse files
committed
fix: Handle errors during tool calls and check if a dialog is open
This change also adds a check for existence of open dialogs before trying to detect open devtools
1 parent 1277c19 commit d381b8d

3 files changed

Lines changed: 28 additions & 7 deletions

File tree

src/WaitForHelper.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ export class WaitForHelper {
128128
action: () => Promise<unknown>,
129129
options?: {timeout?: number; handleDialog?: 'accept' | 'dismiss' | string},
130130
): Promise<void> {
131+
let dialogOpened = false;
131132
if (options?.handleDialog) {
132133
const dialogHandler = (dialog: Pick<Dialog, 'accept' | 'dismiss'>) => {
134+
dialogOpened = true;
133135
if (options.handleDialog === 'dismiss') {
134136
void dialog.dismiss();
135137
} else if (options.handleDialog === 'accept') {
@@ -167,6 +169,10 @@ export class WaitForHelper {
167169
try {
168170
await navigationFinished;
169171

172+
if (dialogOpened) {
173+
return;
174+
}
175+
170176
// Wait for stable dom after navigation so we execute in
171177
// the correct context
172178
await this.waitForStableDom();

src/index.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,22 @@ export async function createMcpServer(
199199
logger(`${tool.name} request: ${JSON.stringify(params, null, ' ')}`);
200200
const context = await getContext();
201201
logger(`${tool.name} context: resolved`);
202-
await context.detectOpenDevToolsWindows();
202+
const page =
203+
serverArgs.experimentalPageIdRouting &&
204+
params.pageId &&
205+
!serverArgs.slim
206+
? context.getPageById(params.pageId)
207+
: context.getSelectedMcpPage();
208+
// If there is a dialog open, we will skip devtools detection
209+
if (!page.getDialog()) {
210+
await context.detectOpenDevToolsWindows();
211+
}
203212
const response = serverArgs.slim
204213
? new SlimMcpResponse(serverArgs)
205214
: new McpResponse(serverArgs);
206215

207216
response.setRedactNetworkHeaders(serverArgs.redactNetworkHeaders);
208217
if ('pageScoped' in tool && tool.pageScoped) {
209-
const page =
210-
serverArgs.experimentalPageIdRouting &&
211-
params.pageId &&
212-
!serverArgs.slim
213-
? context.getPageById(params.pageId)
214-
: context.getSelectedMcpPage();
215218
response.setPage(page);
216219
await tool.handler(
217220
{

src/tools/ToolDefinition.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,18 @@ export function definePageTool<
336336
return {
337337
...definition,
338338
pageScoped: true,
339+
handler: async (request, response, context) => {
340+
try {
341+
await definition.handler(request, response, context);
342+
} catch (error) {
343+
const dialog = request.page.getDialog();
344+
if (dialog) {
345+
response.appendResponseLine(`[Blocked] Action triggered a dialog.`);
346+
return;
347+
}
348+
throw error;
349+
}
350+
},
339351
} as DefinedPageTool<Schema>;
340352
}
341353

0 commit comments

Comments
 (0)