From 2b731fb70f950ad6fa4560653afdc20beeb49789 Mon Sep 17 00:00:00 2001 From: Mati Horovitz <7645314@gmail.com> Date: Sat, 30 Nov 2024 20:22:35 +0200 Subject: [PATCH 1/2] fix(fetch): fix puppeteer server to allow evaluate async functions --- src/puppeteer/index.ts | 43 ++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index d3aa2a30..82f7c86d 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -124,6 +124,15 @@ async function ensureBrowser() { return page!; } +declare global { + interface Window { + mcpHelper: { + logs: string[], + originalConsole: Partial, + } + } +} + async function handleToolCall(name: string, args: any): Promise<{ toolResult: CallToolResult }> { const page = await ensureBrowser(); @@ -285,33 +294,35 @@ async function handleToolCall(name: string, args: any): Promise<{ toolResult: Ca case "puppeteer_evaluate": try { - const result = await page.evaluate((script) => { - const logs: string[] = []; - const originalConsole = { ...console }; + await page.evaluate(() => { + window.mcpHelper = { + logs: [], + originalConsole: { ...console }, + }; ['log', 'info', 'warn', 'error'].forEach(method => { (console as any)[method] = (...args: any[]) => { - logs.push(`[${method}] ${args.join(' ')}`); - (originalConsole as any)[method](...args); + window.mcpHelper.logs.push(`[${method}] ${args.join(' ')}`); + (window.mcpHelper.originalConsole as any)[method](...args); }; - }); + } ); + } ); - try { - const result = eval(script); - Object.assign(console, originalConsole); - return { result, logs }; - } catch (error) { - Object.assign(console, originalConsole); - throw error; - } - }, args.script); + const result = await page.evaluate( args.script ); + + const logs = await page.evaluate(() => { + Object.assign(console, window.mcpHelper.originalConsole); + const logs = window.mcpHelper.logs; + delete ( window.mcpHelper as any).logs; + return logs; + }); return { toolResult: { content: [ { type: "text", - text: `Execution result:\n${JSON.stringify(result.result, null, 2)}\n\nConsole output:\n${result.logs.join('\n')}`, + text: `Execution result:\n${JSON.stringify(result, null, 2)}\n\nConsole output:\n${logs.join('\n')}`, }, ], isError: false, From 68b880d96b797a0bddf0322effb29edf67afdc8d Mon Sep 17 00:00:00 2001 From: Mati Horovitz <7645314@gmail.com> Date: Sat, 30 Nov 2024 22:57:18 +0200 Subject: [PATCH 2/2] Fix cleanup --- src/puppeteer/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/puppeteer/index.ts b/src/puppeteer/index.ts index 82f7c86d..9840fc2e 100644 --- a/src/puppeteer/index.ts +++ b/src/puppeteer/index.ts @@ -313,7 +313,7 @@ async function handleToolCall(name: string, args: any): Promise<{ toolResult: Ca const logs = await page.evaluate(() => { Object.assign(console, window.mcpHelper.originalConsole); const logs = window.mcpHelper.logs; - delete ( window.mcpHelper as any).logs; + delete ( window as any).mcpHelper; return logs; }); @@ -426,4 +426,4 @@ async function runServer() { await server.connect(transport); } -runServer().catch(console.error); \ No newline at end of file +runServer().catch(console.error);