@@ -8,6 +8,7 @@ const { Builder, By, Key, until, Actions } = pkg;
88import { Options as ChromeOptions } from 'selenium-webdriver/chrome.js' ;
99import { Options as FirefoxOptions } from 'selenium-webdriver/firefox.js' ;
1010import { Options as EdgeOptions } from 'selenium-webdriver/edge.js' ;
11+ import { Options as SafariOptions } from 'selenium-webdriver/safari.js' ;
1112
1213
1314// Create an MCP server
@@ -60,13 +61,14 @@ server.tool(
6061 "start_browser" ,
6162 "launches browser" ,
6263 {
63- browser : z . enum ( [ "chrome" , "firefox" , "edge" ] ) . describe ( "Browser to launch (chrome or firefox or microsoft edge )" ) ,
64+ browser : z . enum ( [ "chrome" , "firefox" , "edge" , "safari" ] ) . describe ( "Browser to launch (chrome, firefox, edge, or safari )" ) ,
6465 options : browserOptionsSchema
6566 } ,
6667 async ( { browser, options = { } } ) => {
6768 try {
6869 let builder = new Builder ( ) ;
6970 let driver ;
71+ let warnings = [ ] ;
7072 switch ( browser ) {
7173 case 'chrome' : {
7274 const chromeOptions = new ChromeOptions ( ) ;
@@ -110,6 +112,20 @@ server.tool(
110112 . build ( ) ;
111113 break ;
112114 }
115+ case 'safari' : {
116+ const safariOptions = new SafariOptions ( ) ;
117+ if ( options . headless ) {
118+ warnings . push ( 'Safari does not support headless mode — launching with visible window.' ) ;
119+ }
120+ if ( options . arguments ?. length ) {
121+ warnings . push ( 'Safari does not support custom arguments — ignoring.' ) ;
122+ }
123+ driver = await builder
124+ . forBrowser ( 'safari' )
125+ . setSafariOptions ( safariOptions )
126+ . build ( ) ;
127+ break ;
128+ }
113129 default : {
114130 throw new Error ( `Unsupported browser: ${ browser } ` ) ;
115131 }
@@ -118,8 +134,13 @@ server.tool(
118134 state . drivers . set ( sessionId , driver ) ;
119135 state . currentSession = sessionId ;
120136
137+ let message = `Browser started with session_id: ${ sessionId } ` ;
138+ if ( warnings . length > 0 ) {
139+ message += `\nWarnings: ${ warnings . join ( ' ' ) } ` ;
140+ }
141+
121142 return {
122- content : [ { type : 'text' , text : `Browser started with session_id: ${ sessionId } ` } ]
143+ content : [ { type : 'text' , text : message } ]
123144 } ;
124145 } catch ( e ) {
125146 return {
0 commit comments