Merge pull request #149 from matipojo/fix-puppeteer-async-eval

fix(puppeteer): enable async code execution in puppeteer_evaluate tool
This commit is contained in:
Justin Spahr-Summers
2024-12-05 23:11:50 +00:00
committed by GitHub

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<CallToolResult> { async function handleToolCall(name: string, args: any): Promise<CallToolResult> {
const page = await ensureBrowser(); const page = await ensureBrowser();
@@ -263,32 +272,34 @@ async function handleToolCall(name: string, args: any): Promise<CallToolResult>
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 as any).mcpHelper;
throw error; return logs;
} });
}, args.script);
return { return {
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,