From 60e608f10180fc4b267808f218d3edba776fc161 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 21 May 2025 17:35:30 +0800 Subject: [PATCH] feat: add uixt tool swipe --- internal/version/VERSION | 2 +- mcphost/mcp_server.go | 50 ++++++++++++++++++++++++++++++++-------- uixt/types/request.go | 4 ++++ 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/internal/version/VERSION b/internal/version/VERSION index 781ed3db..9e2d5b89 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2505211725 +v5.0.0-beta-2505211747 diff --git a/mcphost/mcp_server.go b/mcphost/mcp_server.go index b8d211b0..85515c30 100644 --- a/mcphost/mcp_server.go +++ b/mcphost/mcp_server.go @@ -167,10 +167,10 @@ func (ums *MCPServer4XTDriver) addTools() { // Swipe Tool swipeParams := append( - []mcp.ToolOption{mcp.WithDescription("Swipes on the device screen from one point to another.")}, + []mcp.ToolOption{mcp.WithDescription("Swipe on the screen")}, commonToolOptions..., ) - swipeParams = append(swipeParams, generateMCPOptions(types.DragRequest{})...) + swipeParams = append(swipeParams, generateMCPOptions(types.SwipeRequest{})...) swipeTool := mcp.NewTool("swipe", swipeParams...) ums.mcpServer.AddTool(swipeTool, ums.handleSwipe) ums.tools = append(ums.tools, swipeTool) @@ -354,22 +354,54 @@ func (ums *MCPServer4XTDriver) handleSwipe(ctx context.Context, request mcp.Call if err != nil { return nil, err } - var swipeReq types.DragRequest + var swipeReq types.SwipeRequest if err := mapToStruct(request.Params.Arguments, &swipeReq); err != nil { return mcp.NewToolResultError("parse parameters error: " + err.Error()), nil } - actionOptions := []option.ActionOption{} - if swipeReq.Duration > 0 { - actionOptions = append(actionOptions, option.WithDuration(swipeReq.Duration/1000.0)) + + // enum direction: up, down, left, right + switch swipeReq.Direction { + case "up": + err = driverExt.Swipe(0.5, 0.5, 0.5, 0.1) + case "down": + err = driverExt.Swipe(0.5, 0.5, 0.5, 0.9) + case "left": + err = driverExt.Swipe(0.5, 0.5, 0.1, 0.5) + case "right": + err = driverExt.Swipe(0.5, 0.5, 0.9, 0.5) + default: + return mcp.NewToolResultError(fmt.Sprintf("get unexpected swipe direction: %s", swipeReq.Direction)), nil } - err = driverExt.Swipe(swipeReq.FromX, swipeReq.FromY, - swipeReq.ToX, swipeReq.ToY, actionOptions...) + if err != nil { + return mcp.NewToolResultError("Swipe failed: " + err.Error()), nil + } + return mcp.NewToolResultText( + fmt.Sprintf("swipe %s success", swipeReq.Direction), + ), nil +} + +// handleDrag handles the drag tool call. +func (ums *MCPServer4XTDriver) handleDrag(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + driverExt, err := ums.setupXTDriver(ctx, request.Params.Arguments) + if err != nil { + return nil, err + } + var dragReq types.DragRequest + if err := mapToStruct(request.Params.Arguments, &dragReq); err != nil { + return mcp.NewToolResultError("parse parameters error: " + err.Error()), nil + } + actionOptions := []option.ActionOption{} + if dragReq.Duration > 0 { + actionOptions = append(actionOptions, option.WithDuration(dragReq.Duration/1000.0)) + } + err = driverExt.Swipe(dragReq.FromX, dragReq.FromY, + dragReq.ToX, dragReq.ToY, actionOptions...) if err != nil { return mcp.NewToolResultError("Swipe failed: " + err.Error()), nil } return mcp.NewToolResultText( fmt.Sprintf("swipe (%f,%f)->(%f,%f) success", - swipeReq.FromX, swipeReq.FromY, swipeReq.ToX, swipeReq.ToY), + dragReq.FromX, dragReq.FromY, dragReq.ToX, dragReq.ToY), ), nil } diff --git a/uixt/types/request.go b/uixt/types/request.go index b9167f04..946f659e 100644 --- a/uixt/types/request.go +++ b/uixt/types/request.go @@ -15,6 +15,10 @@ type DragRequest struct { PressDuration float64 `json:"press_duration" desc:"Press duration in milliseconds (optional)"` } +type SwipeRequest struct { + Direction string `json:"direction" binding:"required" desc:"The direction of the swipe. Supported directions: up, down, left, right"` +} + type AppClearRequest struct { PackageName string `json:"packageName" binding:"required"` }