@@ -9,7 +9,7 @@ import {IssueFormatter} from './formatters/IssueFormatter.js';
99import { NetworkFormatter } from './formatters/NetworkFormatter.js' ;
1010import { SnapshotFormatter } from './formatters/SnapshotFormatter.js' ;
1111import type { McpContext } from './McpContext.js' ;
12- import { DevTools } from './third_party/index.js' ;
12+ import { DevTools , type Page } from './third_party/index.js' ;
1313import type {
1414 ConsoleMessage ,
1515 ImageContent ,
@@ -36,6 +36,25 @@ interface TraceInsightData {
3636 insightName : InsightName ;
3737}
3838
39+ async function getToolGroup ( page : Page ) {
40+ return await page . evaluate ( ( ) => {
41+ return new Promise < ToolGroup | null > ( resolve => {
42+ const event = new CustomEvent ( 'devtoolstooldiscovery' ) ;
43+ // @ts -expect-error adding custom property
44+ event . respondWith = ( toolGroup : ToolGroup ) => {
45+ window . __mcp_tool_group = toolGroup ;
46+ resolve ( toolGroup ?? null ) ;
47+ } ;
48+ window . dispatchEvent ( event ) ;
49+ // TODO: replace with checking for existence of event listener?
50+ // Can `respondWith` be called asynchronously?
51+ setTimeout ( ( ) => {
52+ resolve ( null ) ;
53+ } , 0 ) ;
54+ } ) ;
55+ } ) ;
56+ }
57+
3958export class McpResponse implements Response {
4059 #includePages = false ;
4160 #snapshotParams?: SnapshotParams ;
@@ -314,9 +333,10 @@ export class McpResponse implements Response {
314333 extensions = context . listExtensions ( ) ;
315334 }
316335
317- let inPageTools : ToolGroup | undefined ;
336+ let inPageTools : ToolGroup | null | undefined ;
318337 if ( this . #listInPageTools) {
319- inPageTools = context . getInPageTools ( ) ;
338+ inPageTools = await getToolGroup ( context . getSelectedPage ( ) ) ;
339+ context . setInPageTools ( inPageTools ) ;
320340 }
321341
322342 let consoleMessages : Array < ConsoleFormatter | IssueFormatter > | undefined ;
@@ -429,7 +449,7 @@ export class McpResponse implements Response {
429449 traceSummary ?: TraceResult ;
430450 traceInsight ?: TraceInsightData ;
431451 extensions ?: InstalledExtension [ ] ;
432- inPageTools ?: ToolGroup ;
452+ inPageTools ?: ToolGroup | null ;
433453 } ,
434454 ) : { content : Array < TextContent | ImageContent > ; structuredContent : object } {
435455 const structuredContent : {
@@ -609,7 +629,7 @@ Call ${handleDialog.name} to handle it before continuing.`);
609629 }
610630
611631 if ( this . #listInPageTools) {
612- structuredContent . inPageTools = data . inPageTools ;
632+ structuredContent . inPageTools = data . inPageTools ?? undefined ;
613633 response . push ( '## In-page tools' ) ;
614634 if ( ! data . inPageTools ) {
615635 response . push ( 'No in-page tools installed.' ) ;
0 commit comments