fix(fetch): fix puppeteer server to allow evaluate async functions

This commit is contained in:
Mati Horovitz 2024-11-30 20:22:35 +02:00
commit 2b731fb70f

View file

@ -124,6 +124,15 @@ async function ensureBrowser() {
return page!; return page!;
} }
declare global {
interface Window {
mcpHelper: {
logs: string[],
originalConsole: Partial<typeof console>,
}
}
}
async function handleToolCall(name: string, args: any): Promise<{ toolResult: CallToolResult }> { async function handleToolCall(name: string, args: any): Promise<{ toolResult: CallToolResult }> {
const page = await ensureBrowser(); const page = await ensureBrowser();
@ -285,33 +294,35 @@ async function handleToolCall(name: string, args: any): Promise<{ toolResult: Ca
case "puppeteer_evaluate": case "puppeteer_evaluate":
try { try {
const result = await page.evaluate((script) => { await page.evaluate(() => {
const logs: string[] = []; window.mcpHelper = {
const originalConsole = { ...console }; logs: [],
originalConsole: { ...console },
};
['log', 'info', 'warn', 'error'].forEach(method => { ['log', 'info', 'warn', 'error'].forEach(method => {
(console as any)[method] = (...args: any[]) => { (console as any)[method] = (...args: any[]) => {
logs.push(`[${method}] ${args.join(' ')}`); window.mcpHelper.logs.push(`[${method}] ${args.join(' ')}`);
(originalConsole as any)[method](...args); (window.mcpHelper.originalConsole as any)[method](...args);
}; };
}); } );
} );
try { const result = await page.evaluate( args.script );
const result = eval(script);
Object.assign(console, originalConsole); const logs = await page.evaluate(() => {
return { result, logs }; Object.assign(console, window.mcpHelper.originalConsole);
} catch (error) { const logs = window.mcpHelper.logs;
Object.assign(console, originalConsole); delete ( window.mcpHelper as any).logs;
throw error; return logs;
} });
}, args.script);
return { return {
toolResult: { toolResult: {
content: [ content: [
{ {
type: "text", 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, isError: false,