From ea6b0a6902a73b51291ad723e5083aef77ea9179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E8=81=AA?= Date: Tue, 24 Jun 2025 23:02:35 +0800 Subject: [PATCH 1/4] fix: failed to exec web script --- Makefile | 43 ++++++++++++++++++++++++++++++++++++++++ internal/version/VERSION | 2 +- uixt/browser_driver.go | 4 +++- uixt/mcp_server.go | 1 + uixt/mcp_tools_web.go | 14 +++++++++++-- 5 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index aabf01ab..2fa96675 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,49 @@ build: ## build hrp cli tool -o output/hrp ./cmd/cli ./output/hrp -v +.PHONY: build-windows +build-windows: ## build hrp cli tool for Windows amd64 + @echo "[info] build hrp cli tool for Windows amd64" + go mod tidy + GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ + -s -w \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ + -o output/hrp.exe ./cmd/cli + @echo "[info] Windows binary built successfully: output/hrp.exe" + +.PHONY: build-windows-arm64 +build-windows-arm64: ## build hrp cli tool for Windows arm64 + @echo "[info] build hrp cli tool for Windows arm64" + go mod tidy + GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ + -s -w \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ + -o output/hrp_arm64.exe ./cmd/cli + @echo "[info] Windows ARM64 binary built successfully: output/hrp_arm64.exe" + +.PHONY: build-linux +build-linux: ## build hrp cli tool for Linux amd64 + @echo "[info] build hrp cli tool for Linux amd64" + go mod tidy + GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ + -s -w \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ + -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ + -o output/hrp_linux ./cmd/cli + @echo "[info] Linux binary built successfully: output/hrp_linux" + +.PHONY: build-all +build-all: build build-windows build-windows-arm64 build-linux ## build hrp cli tool for all platforms + @echo "[info] All binaries built successfully" + .PHONY: install-hooks install-hooks: ## install git hooks @find scripts -name "install-*-hook" | awk -F'-' '{s=$$2;for(i=3;i Date: Tue, 24 Jun 2025 23:07:44 +0800 Subject: [PATCH 2/4] fix: delete useless codes --- Makefile | 43 ---------------------------------------- internal/version/VERSION | 2 +- 2 files changed, 1 insertion(+), 44 deletions(-) diff --git a/Makefile b/Makefile index 2fa96675..aabf01ab 100644 --- a/Makefile +++ b/Makefile @@ -38,49 +38,6 @@ build: ## build hrp cli tool -o output/hrp ./cmd/cli ./output/hrp -v -.PHONY: build-windows -build-windows: ## build hrp cli tool for Windows amd64 - @echo "[info] build hrp cli tool for Windows amd64" - go mod tidy - GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ - -s -w \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ - -o output/hrp.exe ./cmd/cli - @echo "[info] Windows binary built successfully: output/hrp.exe" - -.PHONY: build-windows-arm64 -build-windows-arm64: ## build hrp cli tool for Windows arm64 - @echo "[info] build hrp cli tool for Windows arm64" - go mod tidy - GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ - -s -w \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ - -o output/hrp_arm64.exe ./cmd/cli - @echo "[info] Windows ARM64 binary built successfully: output/hrp_arm64.exe" - -.PHONY: build-linux -build-linux: ## build hrp cli tool for Linux amd64 - @echo "[info] build hrp cli tool for Linux amd64" - go mod tidy - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -tags netgo,osusergo -trimpath -ldflags "\ - -s -w \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitCommit=$(shell git rev-parse HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.GitAuthor=$(shell git log -1 --pretty=format:%an)' \ - -X 'github.com/httprunner/httprunner/v5/internal/version.BuildTime=$(shell date "+%y%m%d%H%M")'" \ - -o output/hrp_linux ./cmd/cli - @echo "[info] Linux binary built successfully: output/hrp_linux" - -.PHONY: build-all -build-all: build build-windows build-windows-arm64 build-linux ## build hrp cli tool for all platforms - @echo "[info] All binaries built successfully" - .PHONY: install-hooks install-hooks: ## install git hooks @find scripts -name "install-*-hook" | awk -F'-' '{s=$$2;for(i=3;i Date: Tue, 24 Jun 2025 23:17:05 +0800 Subject: [PATCH 3/4] fix: add actions to web driver --- internal/version/VERSION | 2 +- uixt/mcp_tools_web.go | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/internal/version/VERSION b/internal/version/VERSION index 14e28208..09e169e7 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2506242307 +v5.0.0-beta-2506242317 diff --git a/uixt/mcp_tools_web.go b/uixt/mcp_tools_web.go index 79f7674c..2099ffd7 100644 --- a/uixt/mcp_tools_web.go +++ b/uixt/mcp_tools_web.go @@ -133,6 +133,8 @@ func (t *ToolSecondaryClick) ConvertActionToCallToolRequest(action option.Mobile "x": params[0], "y": params[1], } + // Extract options to arguments + extractActionOptionsToArguments(action.GetOptions(), arguments) return BuildMCPCallToolRequest(t.Name(), arguments), nil } return mcp.CallToolRequest{}, fmt.Errorf("invalid secondary click params: %v", action.Params) @@ -168,9 +170,11 @@ func (t *ToolHoverBySelector) Implement() server.ToolHandlerFunc { if err != nil { return nil, err } + // Get options directly since ActionOptions is now ActionOptions + opts := unifiedReq.Options() // Hover by selector action logic - err = driverExt.HoverBySelector(unifiedReq.Selector) + err = driverExt.HoverBySelector(unifiedReq.Selector, opts...) if err != nil { return NewMCPErrorResponse(fmt.Sprintf("Hover by selector failed: %s", err.Error())), nil } @@ -187,6 +191,8 @@ func (t *ToolHoverBySelector) ConvertActionToCallToolRequest(action option.Mobil arguments := map[string]any{ "selector": selector, } + // Extract options to arguments + extractActionOptionsToArguments(action.GetOptions(), arguments) return BuildMCPCallToolRequest(t.Name(), arguments), nil } return mcp.CallToolRequest{}, fmt.Errorf("invalid hover by selector params: %v", action.Params) @@ -222,9 +228,11 @@ func (t *ToolTapBySelector) Implement() server.ToolHandlerFunc { if err != nil { return nil, err } + // Get options directly since ActionOptions is now ActionOptions + opts := unifiedReq.Options() // Tap by selector action logic - err = driverExt.TapBySelector(unifiedReq.Selector, option.WithIndex(unifiedReq.Index)) + err = driverExt.TapBySelector(unifiedReq.Selector, opts...) if err != nil { return NewMCPErrorResponse(fmt.Sprintf("Tap by selector failed: %s", err.Error())), nil } @@ -278,9 +286,11 @@ func (t *ToolSecondaryClickBySelector) Implement() server.ToolHandlerFunc { if err != nil { return nil, err } + // Get options directly since ActionOptions is now ActionOptions + opts := unifiedReq.Options() // Secondary click by selector action logic - err = driverExt.SecondaryClickBySelector(unifiedReq.Selector) + err = driverExt.SecondaryClickBySelector(unifiedReq.Selector, opts...) if err != nil { return NewMCPErrorResponse(fmt.Sprintf("Secondary click by selector failed: %s", err.Error())), nil } @@ -297,6 +307,8 @@ func (t *ToolSecondaryClickBySelector) ConvertActionToCallToolRequest(action opt arguments := map[string]any{ "selector": selector, } + // Extract options to arguments + extractActionOptionsToArguments(action.GetOptions(), arguments) return BuildMCPCallToolRequest(t.Name(), arguments), nil } return mcp.CallToolRequest{}, fmt.Errorf("invalid secondary click by selector params: %v", action.Params) @@ -371,5 +383,7 @@ func (t *ToolWebCloseTab) ConvertActionToCallToolRequest(action option.MobileAct arguments := map[string]any{ "tabIndex": tabIndex, } + // Extract options to arguments + extractActionOptionsToArguments(action.GetOptions(), arguments) return BuildMCPCallToolRequest(t.Name(), arguments), nil } From 470bde97d7e3c8140129a551b22ea0f011b2cfef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E8=81=AA?= Date: Wed, 25 Jun 2025 11:13:56 +0800 Subject: [PATCH 4/4] fix: failed to return err --- internal/version/VERSION | 2 +- uixt/mcp_tools_ai.go | 6 +++--- uixt/mcp_tools_app.go | 12 ++++++------ uixt/mcp_tools_button.go | 6 +++--- uixt/mcp_tools_input.go | 4 ++-- uixt/mcp_tools_screen.go | 2 +- uixt/mcp_tools_swipe.go | 12 ++++++------ uixt/mcp_tools_touch.go | 10 +++++----- uixt/mcp_tools_utility.go | 2 +- uixt/mcp_tools_web.go | 12 ++++++------ 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/internal/version/VERSION b/internal/version/VERSION index 09e169e7..61281e5a 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2506242317 +v5.0.0-beta-2506251113 diff --git a/uixt/mcp_tools_ai.go b/uixt/mcp_tools_ai.go index bc9a42c0..26168732 100644 --- a/uixt/mcp_tools_ai.go +++ b/uixt/mcp_tools_ai.go @@ -44,7 +44,7 @@ func (t *ToolStartToGoal) Implement() server.ToolHandlerFunc { // Start to goal logic _, err = driverExt.StartToGoal(ctx, unifiedReq.Prompt) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Failed to achieve goal: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Failed to achieve goal: %s", err.Error())), err } message := fmt.Sprintf("Successfully achieved goal: %s", unifiedReq.Prompt) @@ -104,7 +104,7 @@ func (t *ToolAIAction) Implement() server.ToolHandlerFunc { // AI action logic err = driverExt.AIAction(ctx, unifiedReq.Prompt) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("AI action failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("AI action failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully performed AI action with prompt: %s", unifiedReq.Prompt) @@ -168,7 +168,7 @@ func (t *ToolAIQuery) Implement() server.ToolHandlerFunc { // AI query logic with options result, err := driverExt.AIQuery(unifiedReq.Prompt, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("AI query failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("AI query failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully queried information with prompt: %s", unifiedReq.Prompt) diff --git a/uixt/mcp_tools_app.go b/uixt/mcp_tools_app.go index 417d5fac..3c9e8c77 100644 --- a/uixt/mcp_tools_app.go +++ b/uixt/mcp_tools_app.go @@ -94,7 +94,7 @@ func (t *ToolLaunchApp) Implement() server.ToolHandlerFunc { // Launch app action logic err = driverExt.AppLaunch(unifiedReq.PackageName) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Launch app failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Launch app failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully launched app: %s", unifiedReq.PackageName) @@ -153,7 +153,7 @@ func (t *ToolTerminateApp) Implement() server.ToolHandlerFunc { // Terminate app action logic success, err := driverExt.AppTerminate(unifiedReq.PackageName) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Terminate app failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Terminate app failed: %s", err.Error())), err } if !success { log.Warn().Str("packageName", unifiedReq.PackageName).Msg("app was not running") @@ -213,7 +213,7 @@ func (t *ToolAppInstall) Implement() server.ToolHandlerFunc { // App install action logic err = driverExt.GetDevice().Install(unifiedReq.AppUrl) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("App install failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("App install failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully installed app from: %s", unifiedReq.AppUrl) @@ -267,7 +267,7 @@ func (t *ToolAppUninstall) Implement() server.ToolHandlerFunc { // App uninstall action logic err = driverExt.GetDevice().Uninstall(unifiedReq.PackageName) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("App uninstall failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("App uninstall failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully uninstalled app: %s", unifiedReq.PackageName) @@ -321,7 +321,7 @@ func (t *ToolAppClear) Implement() server.ToolHandlerFunc { // App clear action logic err = driverExt.AppClear(unifiedReq.PackageName) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("App clear failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("App clear failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully cleared app: %s", unifiedReq.PackageName) @@ -371,7 +371,7 @@ func (t *ToolGetForegroundApp) Implement() server.ToolHandlerFunc { // Get foreground app info appInfo, err := driverExt.ForegroundInfo() if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Get foreground app failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Get foreground app failed: %s", err.Error())), err } message := fmt.Sprintf("Current foreground app: %s (%s)", appInfo.AppName, appInfo.PackageName) diff --git a/uixt/mcp_tools_button.go b/uixt/mcp_tools_button.go index f49ae309..a4a3de78 100644 --- a/uixt/mcp_tools_button.go +++ b/uixt/mcp_tools_button.go @@ -44,7 +44,7 @@ func (t *ToolPressButton) Implement() server.ToolHandlerFunc { // Press button action logic err = driverExt.PressButton(types.DeviceButton(unifiedReq.Button)) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Press button failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Press button failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully pressed button: %s", unifiedReq.Button) @@ -91,7 +91,7 @@ func (t *ToolHome) Implement() server.ToolHandlerFunc { // Home action logic err = driverExt.Home() if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Home button press failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Home button press failed: %s", err.Error())), err } message := "Successfully pressed home button" @@ -132,7 +132,7 @@ func (t *ToolBack) Implement() server.ToolHandlerFunc { // Back action logic err = driverExt.Back() if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Back button press failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Back button press failed: %s", err.Error())), err } message := "Successfully pressed back button" diff --git a/uixt/mcp_tools_input.go b/uixt/mcp_tools_input.go index 4286e211..a0be103e 100644 --- a/uixt/mcp_tools_input.go +++ b/uixt/mcp_tools_input.go @@ -47,7 +47,7 @@ func (t *ToolInput) Implement() server.ToolHandlerFunc { // Input action logic err = driverExt.Input(unifiedReq.Text) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Input failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Input failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully input text: %s", unifiedReq.Text) @@ -99,7 +99,7 @@ func (t *ToolSetIme) Implement() server.ToolHandlerFunc { // Set IME action logic err = driverExt.SetIme(unifiedReq.Ime) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Set IME failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Set IME failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully set IME to: %s", unifiedReq.Ime) diff --git a/uixt/mcp_tools_screen.go b/uixt/mcp_tools_screen.go index eaf38261..99d94565 100644 --- a/uixt/mcp_tools_screen.go +++ b/uixt/mcp_tools_screen.go @@ -130,7 +130,7 @@ func (t *ToolGetSource) Implement() server.ToolHandlerFunc { // Get source action logic sourceData, err := driverExt.Source(option.WithProcessName(unifiedReq.PackageName)) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Get source failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Get source failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully retrieved source for package: %s", unifiedReq.PackageName) diff --git a/uixt/mcp_tools_swipe.go b/uixt/mcp_tools_swipe.go index 8c6108ba..1dfa6dd7 100644 --- a/uixt/mcp_tools_swipe.go +++ b/uixt/mcp_tools_swipe.go @@ -155,7 +155,7 @@ func (t *ToolSwipeDirection) Implement() server.ToolHandlerFunc { } if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Swipe failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Swipe failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully swiped %s", swipeDirection) @@ -255,7 +255,7 @@ func (t *ToolSwipeCoordinate) Implement() server.ToolHandlerFunc { swipeAction := prepareSwipeAction(driverExt, params, opts...) err = swipeAction(driverExt) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Advanced swipe failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Advanced swipe failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully performed advanced swipe from (%.2f, %.2f) to (%.2f, %.2f)", @@ -345,7 +345,7 @@ func (t *ToolSwipeToTapApp) Implement() server.ToolHandlerFunc { // Swipe to tap app action logic err = driverExt.SwipeToTapApp(unifiedReq.AppName, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap app failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap app failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully found and tapped app: %s", unifiedReq.AppName) @@ -422,7 +422,7 @@ func (t *ToolSwipeToTapText) Implement() server.ToolHandlerFunc { // Swipe to tap text action logic err = driverExt.SwipeToTapTexts([]string{unifiedReq.Text}, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap text failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap text failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully found and tapped text: %s", unifiedReq.Text) @@ -500,7 +500,7 @@ func (t *ToolSwipeToTapTexts) Implement() server.ToolHandlerFunc { // Swipe to tap texts action logic err = driverExt.SwipeToTapTexts(unifiedReq.Texts, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap texts failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Swipe to tap texts failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully found and tapped one of texts: %v", unifiedReq.Texts) @@ -586,7 +586,7 @@ func (t *ToolDrag) Implement() server.ToolHandlerFunc { // Drag action logic err = driverExt.Swipe(unifiedReq.FromX, unifiedReq.FromY, unifiedReq.ToX, unifiedReq.ToY, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Drag failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Drag failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully dragged from (%.2f, %.2f) to (%.2f, %.2f)", diff --git a/uixt/mcp_tools_touch.go b/uixt/mcp_tools_touch.go index 2ff3376e..19e42261 100644 --- a/uixt/mcp_tools_touch.go +++ b/uixt/mcp_tools_touch.go @@ -58,7 +58,7 @@ func (t *ToolTapXY) Implement() server.ToolHandlerFunc { // Tap action logic err = driverExt.TapXY(unifiedReq.X, unifiedReq.Y, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Tap failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Tap failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully tapped at coordinates (%.2f, %.2f)", unifiedReq.X, unifiedReq.Y) @@ -144,7 +144,7 @@ func (t *ToolTapAbsXY) Implement() server.ToolHandlerFunc { // Tap absolute XY action logic err = driverExt.TapAbsXY(unifiedReq.X, unifiedReq.Y, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Tap absolute XY failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Tap absolute XY failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully tapped at absolute coordinates (%.0f, %.0f)", unifiedReq.X, unifiedReq.Y) @@ -224,7 +224,7 @@ func (t *ToolTapByOCR) Implement() server.ToolHandlerFunc { // Tap by OCR action logic err = driverExt.TapByOCR(unifiedReq.Text, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Tap by OCR failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Tap by OCR failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully tapped on OCR text: %s", unifiedReq.Text) @@ -290,7 +290,7 @@ func (t *ToolTapByCV) Implement() server.ToolHandlerFunc { // We'll add a basic implementation that triggers CV recognition err = driverExt.TapByCV(opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Tap by CV failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Tap by CV failed: %s", err.Error())), err } message := "Successfully tapped by computer vision" @@ -352,7 +352,7 @@ func (t *ToolDoubleTapXY) Implement() server.ToolHandlerFunc { // Double tap XY action logic err = driverExt.DoubleTap(unifiedReq.X, unifiedReq.Y) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Double tap failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Double tap failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully double tapped at (%.2f, %.2f)", unifiedReq.X, unifiedReq.Y) diff --git a/uixt/mcp_tools_utility.go b/uixt/mcp_tools_utility.go index 32f1c4d3..4aa2a267 100644 --- a/uixt/mcp_tools_utility.go +++ b/uixt/mcp_tools_utility.go @@ -236,7 +236,7 @@ func (t *ToolClosePopups) Implement() server.ToolHandlerFunc { // Close popups action logic err = driverExt.ClosePopupsHandler() if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Close popups failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Close popups failed: %s", err.Error())), err } message := "Successfully closed popups" diff --git a/uixt/mcp_tools_web.go b/uixt/mcp_tools_web.go index 2099ffd7..a21a7489 100644 --- a/uixt/mcp_tools_web.go +++ b/uixt/mcp_tools_web.go @@ -52,7 +52,7 @@ func (t *ToolWebLoginNoneUI) Implement() server.ToolHandlerFunc { _, err = driver.LoginNoneUI(unifiedReq.PackageName, unifiedReq.PhoneNumber, unifiedReq.Captcha, unifiedReq.Password) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Web login failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Web login failed: %s", err.Error())), err } message := "Successfully performed web login without UI" @@ -114,7 +114,7 @@ func (t *ToolSecondaryClick) Implement() server.ToolHandlerFunc { // Secondary click action logic err = driverExt.SecondaryClick(unifiedReq.X, unifiedReq.Y) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Secondary click failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Secondary click failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully performed secondary click at (%.2f, %.2f)", unifiedReq.X, unifiedReq.Y) @@ -176,7 +176,7 @@ func (t *ToolHoverBySelector) Implement() server.ToolHandlerFunc { // Hover by selector action logic err = driverExt.HoverBySelector(unifiedReq.Selector, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Hover by selector failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Hover by selector failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully hovered over element with selector: %s", unifiedReq.Selector) @@ -234,7 +234,7 @@ func (t *ToolTapBySelector) Implement() server.ToolHandlerFunc { // Tap by selector action logic err = driverExt.TapBySelector(unifiedReq.Selector, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Tap by selector failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Tap by selector failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully tapped element with selector: %s", unifiedReq.Selector) @@ -292,7 +292,7 @@ func (t *ToolSecondaryClickBySelector) Implement() server.ToolHandlerFunc { // Secondary click by selector action logic err = driverExt.SecondaryClickBySelector(unifiedReq.Selector, opts...) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Secondary click by selector failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Secondary click by selector failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully performed secondary click on element with selector: %s", unifiedReq.Selector) @@ -358,7 +358,7 @@ func (t *ToolWebCloseTab) Implement() server.ToolHandlerFunc { err = browserDriver.CloseTab(unifiedReq.TabIndex) if err != nil { - return NewMCPErrorResponse(fmt.Sprintf("Close tab failed: %s", err.Error())), nil + return NewMCPErrorResponse(fmt.Sprintf("Close tab failed: %s", err.Error())), err } message := fmt.Sprintf("Successfully closed tab at index: %d", unifiedReq.TabIndex)