diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 7bff627..2428ff4 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -201,8 +201,10 @@ func mlsCommandFunc(command *cobra.Command, args []string) error { for srvName, nsv := range services.ServiceList() { if len(modules) > 0 { if !utils.StringInSlice(string(srvName), modules) { + loger.Debug().Str("moduleName", string(srvName)).Msgf("module %s not in %v, skip", string(srvName), modules) continue } + loger.Debug().Str("moduleName", string(srvName)).Msgf("starting %s service", srvName) } cfg, ok := nowConfigJson[string(srvName)].(map[string]interface{}) srv, err := nsv(ctxNew) diff --git a/client/client.go b/client/client.go index 35cc48e..b2777ff 100644 --- a/client/client.go +++ b/client/client.go @@ -51,7 +51,7 @@ func NewMCPServerConfig(description string, command string, srvName string) MCPS Description: description, IsActive: true, Command: command, - Args: []string{"-m", "all"}, + Args: []string{"-m", "Browser"}, BaseUrl: "", ServerName: srvName, TimeOut: 300, diff --git a/go.mod b/go.mod index 28977c6..6bfba99 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/gojue/moling go 1.24.1 require ( - github.com/chromedp/cdproto v0.0.0-20250417220500-b38043e8e6c8 + github.com/chromedp/cdproto v0.0.0-20250518235601-40b4c35ec9fe github.com/chromedp/chromedp v0.13.6 - github.com/mark3labs/mcp-go v0.21.1 + github.com/mark3labs/mcp-go v0.29.0 github.com/rs/zerolog v1.34.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 @@ -13,7 +13,7 @@ require ( require ( github.com/chromedp/sysutil v1.1.0 // indirect - github.com/go-json-experiment/json v0.0.0-20250417205406-170dfdcf87d1 // indirect + github.com/go-json-experiment/json v0.0.0-20250517221953-25912455fbc8 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.4.0 // indirect @@ -21,6 +21,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/spf13/cast v1.8.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index 7f3cad6..6cee916 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,5 @@ -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 h1:AqW2bDQf67Zbq6Tpop/+yJSIknxhiQecO2B8jNYTAPs= -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/cdproto v0.0.0-20250403032234-65de8f5d025b h1:jJmiCljLNTaq/O1ju9Bzz2MPpFlmiTn0F7LwCoeDZVw= -github.com/chromedp/cdproto v0.0.0-20250403032234-65de8f5d025b/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/cdproto v0.0.0-20250416210000-d7e4d624041a h1:TVjyMfX22UgV/jP0A4UwrrCmI9zfvp6ZS5UBZMy3HDw= -github.com/chromedp/cdproto v0.0.0-20250416210000-d7e4d624041a/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/cdproto v0.0.0-20250417220500-b38043e8e6c8 h1:j1b2XORm5Zh5jhTu8rH8AoRnrdT1V4x00OrBXU8Qzs4= -github.com/chromedp/cdproto v0.0.0-20250417220500-b38043e8e6c8/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/chromedp v0.13.3 h1:c6nTn97XQBykzcXiGYL5LLebw3h3CEyrCihm4HquYh0= -github.com/chromedp/chromedp v0.13.3/go.mod h1:khsDP9OP20GrowpJfZ7N05iGCwcAYxk7qf9AZBzR3Qw= +github.com/chromedp/cdproto v0.0.0-20250518235601-40b4c35ec9fe h1:roGYW+2lkWq2EdEOrSOxj8+L07gG1q6iF3xeKUHfcDQ= +github.com/chromedp/cdproto v0.0.0-20250518235601-40b4c35ec9fe/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= github.com/chromedp/chromedp v0.13.6 h1:xlNunMyzS5bu3r/QKrb3fzX6ow3WBQ6oao+J65PGZxk= github.com/chromedp/chromedp v0.13.6/go.mod h1:h8GPP6ZtLMLsU8zFbTcb7ZDGCvCy8j/vRoFmRltQx9A= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= @@ -16,12 +8,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 h1:yE7argOs92u+sSCRgqqe6eF+cDaVhSPlioy1UkA0p/w= -github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535/go.mod h1:BWmvoE1Xia34f3l/ibJweyhrT+aROb/FQ6d+37F0e2s= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 h1:F8d1AJ6M9UQCavhwmO6ZsrYLfG8zVFWfEfMS2MXPkSY= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= -github.com/go-json-experiment/json v0.0.0-20250417205406-170dfdcf87d1 h1:+VexzzkMLb1tnvpuQdGT/DicIRW7MN8ozsXqBMgp0Hk= -github.com/go-json-experiment/json v0.0.0-20250417205406-170dfdcf87d1/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/go-json-experiment/json v0.0.0-20250517221953-25912455fbc8 h1:o8UqXPI6SVwQt04RGsqKp3qqmbOfTNMqDrWsc4O47kk= +github.com/go-json-experiment/json v0.0.0-20250517221953-25912455fbc8/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= @@ -29,32 +19,24 @@ github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/mark3labs/mcp-go v0.15.0 h1:lViiC4dk6chJHZccezaTzZLMOQVUXJDGNQPtzExr5NQ= -github.com/mark3labs/mcp-go v0.15.0/go.mod h1:xBB350hekQsJAK7gJAii8bcEoWemboLm2mRm5/+KBaU= -github.com/mark3labs/mcp-go v0.17.0 h1:5Ps6T7qXr7De/2QTqs9h6BKeZ/qdeUeGrgM5lPzi930= -github.com/mark3labs/mcp-go v0.17.0/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mark3labs/mcp-go v0.18.0 h1:YuhgIVjNlTG2ZOwmrkORWyPTp0dz1opPEqvsPtySXao= -github.com/mark3labs/mcp-go v0.18.0/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mark3labs/mcp-go v0.20.0 h1:NYZDZ10GBKHVz4SdQ2tPFSDFQFKCTrTZJLn4wj6jAaw= -github.com/mark3labs/mcp-go v0.20.0/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mark3labs/mcp-go v0.20.1 h1:E1Bbx9K8d8kQmDZ1QHblM38c7UU2evQ2LlkANk1U/zw= -github.com/mark3labs/mcp-go v0.20.1/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mark3labs/mcp-go v0.21.0 h1:oyEtiXg8PnrVEFis9b1AwbiUWF2dTbyBP5yLo7SruXE= -github.com/mark3labs/mcp-go v0.21.0/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mark3labs/mcp-go v0.21.1 h1:7Ek6KPIIbMhEYHRiRIg6K6UAgNZCJaHKQp926MNr6V0= -github.com/mark3labs/mcp-go v0.21.1/go.mod h1:KmJndYv7GIgcPVwEKJjNcbhVQ+hJGJhrCCB/9xITzpE= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mark3labs/mcp-go v0.29.0 h1:sH1NBcumKskhxqYzhXfGc201D7P76TVXiT0fGVhabeI= +github.com/mark3labs/mcp-go v0.29.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -63,10 +45,14 @@ github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzb github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk= +github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= @@ -78,12 +64,8 @@ github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT0 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/services/browser.go b/services/browser.go index 5bb2044..c1aa48d 100644 --- a/services/browser.go +++ b/services/browser.go @@ -74,11 +74,7 @@ func NewBrowserServer(ctx context.Context) (Service, error) { // Init initializes the browser server by creating a new context. func (bs *BrowserServer) Init() error { - //loggerNameHook := zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, msg string) { - // e.Str("Service", string(bs.Name())) - //}) - - //bs.logger = bs.logger.Hook(loggerNameHook) + // Initialize the browser server err := bs.initBrowser(bs.config.BrowserDataPath) if err != nil { return fmt.Errorf("failed to initialize browser: %v", err) @@ -96,17 +92,29 @@ func (bs *BrowserServer) Init() error { chromedp.Flag("disable-blink-features", "AutomationControlled"), chromedp.Flag("enable-automation", false), chromedp.Flag("disable-features", "Translate"), - chromedp.Flag("headless", bs.config.Headless), chromedp.Flag("hide-scrollbars", false), chromedp.Flag("mute-audio", true), + //chromedp.Flag("no-sandbox", true), chromedp.Flag("disable-infobars", true), chromedp.Flag("disable-extensions", true), chromedp.Flag("CommandLineFlagSecurityWarningsEnabled", false), + chromedp.Flag("disable-notifications", true), + chromedp.Flag("disable-dev-shm-usage", true), + chromedp.Flag("autoplay-policy", "user-gesture-required"), chromedp.CombinedOutput(bs.logger), + // (1920, 1080), (1366, 768), (1440, 900), (1280, 800) chromedp.WindowSize(1280, 800), chromedp.UserDataDir(bs.config.BrowserDataPath), chromedp.IgnoreCertErrors, ) + + // headless mode + if bs.config.Headless { + opts = append(opts, chromedp.Flag("headless", true)) + opts = append(opts, chromedp.Flag("disable-gpu", true)) + opts = append(opts, chromedp.Flag("disable-webgl", true)) + } + bs.ctx, bs.cancelAlloc = chromedp.NewExecAllocator(context.Background(), opts...) bs.ctx, bs.cancelChrome = chromedp.NewContext(bs.ctx, @@ -298,7 +306,8 @@ func (bs *BrowserServer) handlePrompt(ctx context.Context, request mcp.GetPrompt // handleNavigate handles the navigation action. func (bs *BrowserServer) handleNavigate(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - url, ok := request.Params.Arguments["url"].(string) + args := request.GetArguments() + url, ok := args["url"].(string) if !ok { return nil, fmt.Errorf("url must be a string") } @@ -312,13 +321,14 @@ func (bs *BrowserServer) handleNavigate(ctx context.Context, request mcp.CallToo // handleScreenshot handles the screenshot action. func (bs *BrowserServer) handleScreenshot(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - name, ok := request.Params.Arguments["name"].(string) + args := request.GetArguments() + name, ok := args["name"].(string) if !ok { return mcp.NewToolResultError("name must be a string"), nil } - selector, _ := request.Params.Arguments["selector"].(string) - width, _ := request.Params.Arguments["width"].(int) - height, _ := request.Params.Arguments["height"].(int) + selector, _ := args["selector"].(string) + width, _ := args["width"].(int) + height, _ := args["height"].(int) if width == 0 { width = 1280 } @@ -348,7 +358,8 @@ func (bs *BrowserServer) handleScreenshot(ctx context.Context, request mcp.CallT // handleClick handles the click action on a specified element. func (bs *BrowserServer) handleClick(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - selector, ok := request.Params.Arguments["selector"].(string) + args := request.GetArguments() + selector, ok := args["selector"].(string) if !ok { return mcp.NewToolResultError(fmt.Sprintf("selector must be a string:%v", selector)), nil } @@ -367,14 +378,15 @@ func (bs *BrowserServer) handleClick(ctx context.Context, request mcp.CallToolRe // handleFill handles the fill action on a specified input field. func (bs *BrowserServer) handleFill(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - selector, ok := request.Params.Arguments["selector"].(string) + args := request.GetArguments() + selector, ok := args["selector"].(string) if !ok { - return mcp.NewToolResultError(fmt.Sprintf("failed to fill selector:%v", request.Params.Arguments["selector"])), nil + return mcp.NewToolResultError(fmt.Sprintf("failed to fill selector:%v", args["selector"])), nil } - value, ok := request.Params.Arguments["value"].(string) + value, ok := args["value"].(string) if !ok { - return mcp.NewToolResultError(fmt.Sprintf("failed to fill input field: %v, selector:%v", request.Params.Arguments["value"], selector)), nil + return mcp.NewToolResultError(fmt.Sprintf("failed to fill input field: %v, selector:%v", args["value"], selector)), nil } runCtx, cancelFunc := context.WithTimeout(bs.ctx, time.Duration(bs.config.SelectorQueryTimeout)*time.Second) @@ -387,13 +399,14 @@ func (bs *BrowserServer) handleFill(ctx context.Context, request mcp.CallToolReq } func (bs *BrowserServer) handleSelect(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - selector, ok := request.Params.Arguments["selector"].(string) + args := request.GetArguments() + selector, ok := args["selector"].(string) if !ok { - return mcp.NewToolResultError(fmt.Sprintf("failed to select selector:%v", request.Params.Arguments["selector"])), nil + return mcp.NewToolResultError(fmt.Sprintf("failed to select selector:%v", args["selector"])), nil } - value, ok := request.Params.Arguments["value"].(string) + value, ok := args["value"].(string) if !ok { - return mcp.NewToolResultError(fmt.Sprintf("failed to select value:%v", request.Params.Arguments["value"])), nil + return mcp.NewToolResultError(fmt.Sprintf("failed to select value:%v", args["value"])), nil } runCtx, cancelFunc := context.WithTimeout(bs.ctx, time.Duration(bs.config.SelectorQueryTimeout)*time.Second) defer cancelFunc() @@ -406,7 +419,8 @@ func (bs *BrowserServer) handleSelect(ctx context.Context, request mcp.CallToolR // handleHover handles the hover action on a specified element. func (bs *BrowserServer) handleHover(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - selector, ok := request.Params.Arguments["selector"].(string) + args := request.GetArguments() + selector, ok := args["selector"].(string) if !ok { return mcp.NewToolResultError(fmt.Sprintf("selector must be a string:%v", selector)), nil } @@ -421,7 +435,8 @@ func (bs *BrowserServer) handleHover(ctx context.Context, request mcp.CallToolRe } func (bs *BrowserServer) handleEvaluate(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - script, ok := request.Params.Arguments["script"].(string) + args := request.GetArguments() + script, ok := args["script"].(string) if !ok { return mcp.NewToolResultError("script must be a string"), nil } diff --git a/services/browser_debugger.go b/services/browser_debugger.go index 66095be..4525eed 100644 --- a/services/browser_debugger.go +++ b/services/browser_debugger.go @@ -29,7 +29,8 @@ import ( // handleDebugEnable handles the enabling and disabling of debugging in the browser. func (bs *BrowserServer) handleDebugEnable(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - enabled, ok := request.Params.Arguments["enabled"].(bool) + args := request.GetArguments() + enabled, ok := args["enabled"].(bool) if !ok { return mcp.NewToolResultError("enabled must be a boolean"), nil } @@ -64,18 +65,19 @@ func (bs *BrowserServer) handleDebugEnable(ctx context.Context, request mcp.Call // handleSetBreakpoint handles setting a breakpoint in the browser. func (bs *BrowserServer) handleSetBreakpoint(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - url, ok := request.Params.Arguments["url"].(string) + args := request.GetArguments() + url, ok := args["url"].(string) if !ok { return mcp.NewToolResultError("url must be a string"), nil } - line, ok := request.Params.Arguments["line"].(float64) + line, ok := args["line"].(float64) if !ok { return mcp.NewToolResultError("line must be a number"), nil } - column, _ := request.Params.Arguments["column"].(float64) - condition, _ := request.Params.Arguments["condition"].(string) + column, _ := args["column"].(float64) + condition, _ := args["condition"].(string) var breakpointID string rctx, cancel := context.WithCancel(bs.ctx) @@ -111,7 +113,8 @@ func (bs *BrowserServer) handleSetBreakpoint(ctx context.Context, request mcp.Ca // handleRemoveBreakpoint handles removing a breakpoint in the browser. func (bs *BrowserServer) handleRemoveBreakpoint(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - breakpointID, ok := request.Params.Arguments["breakpointId"].(string) + args := request.GetArguments() + breakpointID, ok := args["breakpointId"].(string) if !ok { return mcp.NewToolResultError("breakpointId must be a string"), nil } diff --git a/services/browser_test.go b/services/browser_test.go index 4d4fd5a..abdbae5 100644 --- a/services/browser_test.go +++ b/services/browser_test.go @@ -71,7 +71,7 @@ func TestBrowserServer(t *testing.T) { Method: "tools/call", }, } - request.Params.Arguments = map[string]interface{}{ + args = map[string]interface{}{ "url": "https://www.baidu.com", } result, err := bs.handleNavigate(ctx, request) diff --git a/services/command.go b/services/command.go index 143bae7..07297f3 100644 --- a/services/command.go +++ b/services/command.go @@ -116,7 +116,8 @@ func (cs *CommandServer) handlePrompt(ctx context.Context, request mcp.GetPrompt // handleExecuteCommand handles the execution of a named command. func (cs *CommandServer) handleExecuteCommand(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - command, ok := request.Params.Arguments["command"].(string) + args := request.GetArguments() + command, ok := args["command"].(string) if !ok { return mcp.NewToolResultError(fmt.Errorf("command must be a string").Error()), nil } diff --git a/services/file_system.go b/services/file_system.go index 09125ee..f6acf00 100644 --- a/services/file_system.go +++ b/services/file_system.go @@ -448,7 +448,8 @@ func (fs *FilesystemServer) handleReadResource(ctx context.Context, request mcp. // Tool handlers func (fs *FilesystemServer) handleReadFile(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { return mcp.NewToolResultError("Path must be a string"), nil } @@ -603,11 +604,12 @@ func (fs *FilesystemServer) handleReadFile(ctx context.Context, request mcp.Call } func (fs *FilesystemServer) handleWriteFile(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { return mcp.NewToolResultError("Path must be a string"), nil } - content, ok := request.Params.Arguments["content"].(string) + content, ok := args["content"].(string) if !ok { return mcp.NewToolResultError("Content must be a string"), nil } @@ -669,7 +671,8 @@ func (fs *FilesystemServer) handleWriteFile(ctx context.Context, request mcp.Cal } func (fs *FilesystemServer) handleListDirectory(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { return mcp.NewToolResultError("Path must be a string"), nil } @@ -735,7 +738,8 @@ func (fs *FilesystemServer) handleListDirectory(ctx context.Context, request mcp } func (fs *FilesystemServer) handleCreateDirectory(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { return mcp.NewToolResultError("path must be a string"), nil } @@ -793,11 +797,12 @@ func (fs *FilesystemServer) handleCreateDirectory(ctx context.Context, request m } func (fs *FilesystemServer) handleMoveFile(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - source, ok := request.Params.Arguments["source"].(string) + args := request.GetArguments() + source, ok := args["source"].(string) if !ok { return mcp.NewToolResultError("source must be a string"), nil } - destination, ok := request.Params.Arguments["destination"].(string) + destination, ok := args["destination"].(string) if !ok { return mcp.NewToolResultError("destination must be a string"), nil } @@ -851,11 +856,12 @@ func (fs *FilesystemServer) handleMoveFile(ctx context.Context, request mcp.Call } func (fs *FilesystemServer) handleSearchFiles(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { return mcp.NewToolResultError("path must be a string"), nil } - pattern, ok := request.Params.Arguments["pattern"].(string) + pattern, ok := args["pattern"].(string) if !ok { return mcp.NewToolResultError("pattern must be a string"), nil } @@ -907,9 +913,10 @@ func (fs *FilesystemServer) handleSearchFiles(ctx context.Context, request mcp.C } func (fs *FilesystemServer) handleGetFileInfo(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - path, ok := request.Params.Arguments["path"].(string) + args := request.GetArguments() + path, ok := args["path"].(string) if !ok { - return mcp.NewToolResultError(fmt.Errorf("path %v must be a string", request.Params.Arguments["path"]).Error()), nil + return mcp.NewToolResultError(fmt.Errorf("path %v must be a string", args["path"]).Error()), nil } validPath, err := fs.validatePath(path)