Skip to content

Commit 9b180e3

Browse files
committed
make in-page tools work with pageId routing
1 parent cdbc66f commit 9b180e3

6 files changed

Lines changed: 20 additions & 17 deletions

File tree

src/McpContext.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import type {
3131
} from './third_party/index.js';
3232
import {Locator} from './third_party/index.js';
3333
import {PredefinedNetworkConditions} from './third_party/index.js';
34-
import type {ToolGroup, ToolDefinition} from './tools/inPage.js';
3534
import {listPages} from './tools/pages.js';
3635
import {CLOSE_PAGE_ERROR} from './tools/ToolDefinition.js';
3736
import type {Context, DevToolsData} from './tools/ToolDefinition.js';
@@ -102,7 +101,6 @@ export class McpContext implements Context {
102101
#screenRecorderData: {recorder: ScreenRecorder; filePath: string} | null =
103102
null;
104103

105-
#inPageTools?: ToolGroup<ToolDefinition>;
106104
#nextPageId = 1;
107105
#extensionPages = new WeakMap<Target, Page>();
108106

@@ -466,14 +464,6 @@ export class McpContext implements Context {
466464
this.#updateSelectedPageTimeouts();
467465
}
468466

469-
setInPageTools(toolGroup?: ToolGroup<ToolDefinition>) {
470-
this.#inPageTools = toolGroup;
471-
}
472-
473-
getInPageTools(): ToolGroup<ToolDefinition> | undefined {
474-
return this.#inPageTools;
475-
}
476-
477467
#updateSelectedPageTimeouts() {
478468
const page = this.#getSelectedMcpPage();
479469
// For waiters 5sec timeout should be sufficient.

src/McpPage.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
Page,
1111
Viewport,
1212
} from './third_party/index.js';
13+
import type {ToolGroup, ToolDefinition} from './tools/inPage.js';
1314
import {takeSnapshot} from './tools/snapshot.js';
1415
import type {ContextPage} from './tools/ToolDefinition.js';
1516
import type {
@@ -46,6 +47,8 @@ export class McpPage implements ContextPage {
4647
#dialog?: Dialog;
4748
#dialogHandler: (dialog: Dialog) => void;
4849

50+
inPageTools: ToolGroup<ToolDefinition> | undefined;
51+
4952
constructor(page: Page, id: number) {
5053
this.pptrPage = page;
5154
this.id = id;
@@ -67,6 +70,10 @@ export class McpPage implements ContextPage {
6770
this.#dialog = undefined;
6871
}
6972

73+
getInPageTools(): ToolGroup<ToolDefinition> | undefined {
74+
return this.inPageTools;
75+
}
76+
7077
get networkConditions(): string | null {
7178
return this.emulationSettings.networkConditions ?? null;
7279
}

src/McpResponse.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,9 @@ export class McpResponse implements Response {
421421

422422
let inPageTools: ToolGroup<ToolDefinition> | undefined;
423423
if (this.#listInPageTools) {
424-
inPageTools = await getToolGroup(context.getSelectedMcpPage());
425-
context.setInPageTools(inPageTools);
424+
const page = this.#page ?? context.getSelectedMcpPage();
425+
inPageTools = await getToolGroup(page);
426+
page.inPageTools = inPageTools;
426427
}
427428

428429
let consoleMessages: Array<ConsoleFormatter | IssueFormatter> | undefined;

src/tools/ToolDefinition.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ export type Context = Readonly<{
198198
triggerExtensionAction(id: string): Promise<void>;
199199
listExtensions(): InstalledExtension[];
200200
getExtension(id: string): InstalledExtension | undefined;
201-
getInPageTools(): ToolGroup<InPageToolDefinition> | undefined;
202201
getSelectedMcpPage(): McpPage;
203202
getExtensionServiceWorkers(): ExtensionServiceWorker[];
204203
getExtensionServiceWorkerId(
@@ -213,6 +212,8 @@ export type ContextPage = Readonly<{
213212

214213
getDialog(): Dialog | undefined;
215214
clearDialog(): void;
215+
216+
getInPageTools(): ToolGroup<InPageToolDefinition> | undefined;
216217
}>;
217218

218219
export function defineTool<Schema extends zod.ZodRawShape>(

src/tools/inPage.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ export const executeInPageTool = definePageTool({
7070
.optional()
7171
.describe('The JSON-stringified parameters to pass to the tool'),
7272
},
73-
handler: async (request, response, context) => {
74-
const page = context.getSelectedMcpPage();
73+
handler: async (request, response) => {
7574
const toolName = request.params.toolName;
7675
let params: Record<string, unknown> = {};
7776
if (request.params.params) {
@@ -88,7 +87,7 @@ export const executeInPageTool = definePageTool({
8887
}
8988
}
9089

91-
const toolGroup = context.getInPageTools();
90+
const toolGroup = request.page.getInPageTools();
9291
const tool = toolGroup?.tools.find(t => t.name === toolName);
9392
if (!tool) {
9493
throw new Error(`Tool ${toolName} not found`);
@@ -102,7 +101,7 @@ export const executeInPageTool = definePageTool({
102101
);
103102
}
104103

105-
const result = await page.pptrPage.evaluate(
104+
const result = await request.page.pptrPage.evaluate(
106105
async (name, args) => {
107106
if (!window.__dtmcp?.executeTool) {
108107
throw new Error('No tools found on the page');

tests/tools/inPage.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ describe('inPage', () => {
2020
await withMcpContext(
2121
async (response, context) => {
2222
const page = await context.newPage();
23+
response.setPage(page);
2324

2425
await page.pptrPage.evaluate(() => {
2526
window.__dtmcp = {
@@ -76,6 +77,7 @@ describe('inPage', () => {
7677
await withMcpContext(
7778
async (response, context) => {
7879
const page = await context.newPage();
80+
response.setPage(page);
7981
await page.pptrPage.evaluate(() => {
8082
window.addEventListener('devtoolstooldiscovery', (e: Event) => {
8183
// @ts-expect-error Event has `respondWith`
@@ -105,6 +107,7 @@ describe('inPage', () => {
105107
await withMcpContext(
106108
async (response, context) => {
107109
const page = await context.newPage();
110+
response.setPage(page);
108111
await page.pptrPage.evaluate(() => {
109112
window.addEventListener('devtoolstooldiscovery', () => {
110113
// do nothing
@@ -133,6 +136,7 @@ describe('inPage', () => {
133136
await withMcpContext(
134137
async (response, context) => {
135138
const page = await context.newPage();
139+
response.setPage(page);
136140
await listInPageTools.handler({params: {}, page}, response, context);
137141

138142
const result = await response.handle('list_in_page_tools', context);
@@ -155,6 +159,7 @@ describe('inPage', () => {
155159
evaluateFn: () => void,
156160
) {
157161
const page = await context.newPage();
162+
response.setPage(page);
158163
await page.pptrPage.evaluate(evaluateFn);
159164
await listInPageTools.handler({params: {}, page}, response, context);
160165
await response.handle('list_in_page_tools', context);

0 commit comments

Comments
 (0)