From 78127e24ab1cc08b39df2b6c1d80f25bddce289d Mon Sep 17 00:00:00 2001 From: Gustav Ernberg von Heijne Date: Mon, 17 Nov 2025 14:17:33 +0100 Subject: [PATCH 1/5] Add initScript capability --- src/tools/pages.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tools/pages.ts b/src/tools/pages.ts index f4638860..48b060ef 100644 --- a/src/tools/pages.ts +++ b/src/tools/pages.ts @@ -116,6 +116,9 @@ export const navigatePage = defineTool({ .boolean() .optional() .describe('Whether to ignore cache on reload.'), + initScript: zod.string().optional().describe( + `(optional) A JavaScript function declaration to be executed by the tool on new document for every page load. + `), ...timeoutSchema, }, handler: async (request, response, context) => { @@ -132,6 +135,10 @@ export const navigatePage = defineTool({ request.params.type = 'url'; } + if(request.params.initScript){ + page.evaluateOnNewDocument(request.params.initScript); + } + await context.waitForEventsAfterAction(async () => { switch (request.params.type) { case 'url': From 86e0bb254b6459f6dbade4010fc896a3f8eb5377 Mon Sep 17 00:00:00 2001 From: Gustav Ernberg von Heijne Date: Mon, 17 Nov 2025 15:52:56 +0100 Subject: [PATCH 2/5] Add tests --- tests/tools/pages.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/tools/pages.test.ts b/tests/tools/pages.test.ts index a4a76bcd..eab77d38 100644 --- a/tests/tools/pages.test.ts +++ b/tests/tools/pages.test.ts @@ -193,6 +193,21 @@ describe('pages', () => { assert.ok(response.includePages); }); }); + it('navigates to correct page with initScript', async () => { + await withBrowser(async (response, context) => { + await navigatePage.handler( + {params: {url: 'data:text/html,
Hello MCP
', initScript: 'window.initScript = "completed"'}}, + response, + context, + ); + const page = context.getSelectedPage(); + + // wait for up to 1s for the global variable to set by the initScript to exist + await page.waitForFunction("window.initScript==='completed'", {timeout: 1000}); + + assert.ok(response.includePages); + }); + }); }); describe('resize', () => { it('create a page', async () => { From 45a9c2b1dab795f9ffb31cad253252b2df052b4d Mon Sep 17 00:00:00 2001 From: Gustav Ernberg von Heijne Date: Mon, 17 Nov 2025 16:00:49 +0100 Subject: [PATCH 3/5] Update description of parameter --- src/tools/pages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/pages.ts b/src/tools/pages.ts index 48b060ef..6e522bb5 100644 --- a/src/tools/pages.ts +++ b/src/tools/pages.ts @@ -117,7 +117,7 @@ export const navigatePage = defineTool({ .optional() .describe('Whether to ignore cache on reload.'), initScript: zod.string().optional().describe( - `(optional) A JavaScript function declaration to be executed by the tool on new document for every page load. + `(optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts. `), ...timeoutSchema, }, From 8b7de1a3ed1b47d9b3c815ad580e12fee3eb5bc6 Mon Sep 17 00:00:00 2001 From: Gustav Ernberg von Heijne Date: Mon, 17 Nov 2025 16:19:51 +0100 Subject: [PATCH 4/5] Update formatting --- docs/tool-reference.md | 1 + src/tools/pages.ts | 13 ++++++++----- tests/tools/pages.test.ts | 11 +++++++++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/docs/tool-reference.md b/docs/tool-reference.md index 0e126b8c..2451e185 100644 --- a/docs/tool-reference.md +++ b/docs/tool-reference.md @@ -152,6 +152,7 @@ - **timeout** (integer) _(optional)_: Maximum wait time in milliseconds. If set to 0, the default timeout will be used. - **type** (enum: "url", "back", "forward", "reload") _(optional)_: Navigate the page by URL, back or forward in history, or reload. - **url** (string) _(optional)_: Target URL (only type=url) +- **initScript** (string) _(optional)_: Script to execute whenever a page is navigated to. --- diff --git a/src/tools/pages.ts b/src/tools/pages.ts index 6e522bb5..270c08e4 100644 --- a/src/tools/pages.ts +++ b/src/tools/pages.ts @@ -116,9 +116,12 @@ export const navigatePage = defineTool({ .boolean() .optional() .describe('Whether to ignore cache on reload.'), - initScript: zod.string().optional().describe( - `(optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts. - `), + initScript: zod + .string() + .optional() + .describe( + '(optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts.', + ), ...timeoutSchema, }, handler: async (request, response, context) => { @@ -135,8 +138,8 @@ export const navigatePage = defineTool({ request.params.type = 'url'; } - if(request.params.initScript){ - page.evaluateOnNewDocument(request.params.initScript); + if (request.params.initScript) { + await page.evaluateOnNewDocument(request.params.initScript); } await context.waitForEventsAfterAction(async () => { diff --git a/tests/tools/pages.test.ts b/tests/tools/pages.test.ts index eab77d38..6e69de61 100644 --- a/tests/tools/pages.test.ts +++ b/tests/tools/pages.test.ts @@ -196,14 +196,21 @@ describe('pages', () => { it('navigates to correct page with initScript', async () => { await withBrowser(async (response, context) => { await navigatePage.handler( - {params: {url: 'data:text/html,
Hello MCP
', initScript: 'window.initScript = "completed"'}}, + { + params: { + url: 'data:text/html,
Hello MCP
', + initScript: 'window.initScript = "completed"', + }, + }, response, context, ); const page = context.getSelectedPage(); // wait for up to 1s for the global variable to set by the initScript to exist - await page.waitForFunction("window.initScript==='completed'", {timeout: 1000}); + await page.waitForFunction("window.initScript==='completed'", { + timeout: 1000, + }); assert.ok(response.includePages); }); From dbc210901a2d09f093b78c25ebf3f3b8ee8cba8f Mon Sep 17 00:00:00 2001 From: Gustav Ernberg von Heijne Date: Mon, 17 Nov 2025 16:26:26 +0100 Subject: [PATCH 5/5] Automatic doc update --- docs/tool-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tool-reference.md b/docs/tool-reference.md index 2451e185..64054697 100644 --- a/docs/tool-reference.md +++ b/docs/tool-reference.md @@ -149,10 +149,10 @@ **Parameters:** - **ignoreCache** (boolean) _(optional)_: Whether to ignore cache on reload. +- **initScript** (string) _(optional)_: (optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts. - **timeout** (integer) _(optional)_: Maximum wait time in milliseconds. If set to 0, the default timeout will be used. - **type** (enum: "url", "back", "forward", "reload") _(optional)_: Navigate the page by URL, back or forward in history, or reload. - **url** (string) _(optional)_: Target URL (only type=url) -- **initScript** (string) _(optional)_: Script to execute whenever a page is navigated to. ---