@@ -17,38 +17,45 @@ import fs from 'fs';
1717
1818let browser : Browser | undefined ;
1919
20- const ignoredPrefixes = new Set ( [
21- 'chrome://' ,
22- 'chrome-extension ://' ,
23- 'chrome-untrusted ://' ,
24- 'devtools ://',
25- ] ) ;
20+ function makeTargetFilter ( devtools : boolean ) {
21+ const ignoredPrefixes = new Set ( [
22+ 'chrome://' ,
23+ 'chrome-extension ://' ,
24+ 'chrome-untrusted ://',
25+ ] ) ;
2626
27- function targetFilter ( target : Target ) : boolean {
28- if ( target . url ( ) === 'chrome://newtab/' ) {
29- return true ;
27+ if ( ! devtools ) {
28+ ignoredPrefixes . add ( 'devtools://' ) ;
3029 }
31- for ( const prefix of ignoredPrefixes ) {
32- if ( target . url ( ) . startsWith ( prefix ) ) {
33- return false ;
30+ return function targetFilter ( target : Target ) : boolean {
31+ if ( target . url ( ) === 'chrome://newtab/' ) {
32+ return true ;
3433 }
35- }
36- return true ;
34+ for ( const prefix of ignoredPrefixes ) {
35+ if ( target . url ( ) . startsWith ( prefix ) ) {
36+ return false ;
37+ }
38+ }
39+ return true ;
40+ } ;
3741}
3842
3943const connectOptions : ConnectOptions = {
40- targetFilter,
4144 // We do not expect any single CDP command to take more than 10sec.
4245 protocolTimeout : 10_000 ,
4346} ;
4447
45- async function ensureBrowserConnected ( browserURL : string ) {
48+ async function ensureBrowserConnected ( options : {
49+ browserURL : string ;
50+ devtools : boolean ;
51+ } ) {
4652 if ( browser ?. connected ) {
4753 return browser ;
4854 }
4955 browser = await puppeteer . connect ( {
5056 ...connectOptions ,
51- browserURL,
57+ targetFilter : makeTargetFilter ( options . devtools ) ,
58+ browserURL : options . browserURL ,
5259 defaultViewport : null ,
5360 } ) ;
5461 return browser ;
@@ -61,6 +68,7 @@ type McpLaunchOptions = {
6168 userDataDir ?: string ;
6269 headless : boolean ;
6370 isolated : boolean ;
71+ devtools : boolean ;
6472} ;
6573
6674export async function launch ( options : McpLaunchOptions ) : Promise < Browser > {
@@ -91,6 +99,9 @@ export async function launch(options: McpLaunchOptions): Promise<Browser> {
9199 if ( customDevTools ) {
92100 args . push ( `--custom-devtools-frontend=file://${ customDevTools } ` ) ;
93101 }
102+ if ( options . devtools ) {
103+ args . push ( '--auto-open-devtools-for-tabs' ) ;
104+ }
94105 let puppeterChannel : ChromeReleaseChannel | undefined ;
95106 if ( ! executablePath ) {
96107 puppeterChannel =
@@ -102,6 +113,7 @@ export async function launch(options: McpLaunchOptions): Promise<Browser> {
102113 try {
103114 return await puppeteer . launch ( {
104115 ...connectOptions ,
116+ targetFilter : makeTargetFilter ( options . devtools ) ,
105117 channel : puppeterChannel ,
106118 executablePath,
107119 defaultViewport : null ,
@@ -138,16 +150,16 @@ async function ensureBrowserLaunched(
138150 return browser ;
139151}
140152
141- export async function resolveBrowser ( options : {
142- browserUrl ?: string ;
143- executablePath ?: string ;
144- customDevTools ?: string ;
145- channel ?: Channel ;
146- headless : boolean ;
147- isolated : boolean ;
148- } ) {
153+ export async function resolveBrowser (
154+ options : McpLaunchOptions & {
155+ browserUrl ?: string ;
156+ } ,
157+ ) {
149158 const browser = options . browserUrl
150- ? await ensureBrowserConnected ( options . browserUrl )
159+ ? await ensureBrowserConnected ( {
160+ browserURL : options . browserUrl ,
161+ devtools : options . devtools ,
162+ } )
151163 : await ensureBrowserLaunched ( options ) ;
152164
153165 return browser ;
0 commit comments