From 495443a2c4e6caabb16c8377b48943f9e14c3d62 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 21 May 2025 16:24:54 +0800 Subject: [PATCH] feat: add uixt tool list_packages --- internal/version/VERSION | 2 +- mcphost/mcp_server.go | 22 ++++++++++++++++++++++ uixt/android_device.go | 4 ++++ uixt/browser_device.go | 4 ++++ uixt/device.go | 2 ++ uixt/harmony_device.go | 4 ++++ uixt/ios_device.go | 12 ++++++++++++ 7 files changed, 49 insertions(+), 1 deletion(-) diff --git a/internal/version/VERSION b/internal/version/VERSION index 9fd914bc..5fdf39fe 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2505202311 +v5.0.0-beta-2505211624 diff --git a/mcphost/mcp_server.go b/mcphost/mcp_server.go index 5fe5fed9..bfadadaa 100644 --- a/mcphost/mcp_server.go +++ b/mcphost/mcp_server.go @@ -101,6 +101,14 @@ func (ums *MCPServer4XTDriver) addTools() { ums.tools = append(ums.tools, selectDeviceTool) ums.handlerMap[selectDeviceTool.Name] = ums.handleSelectDevice + // ListPackages Tool + listPackagesTool := mcp.NewTool("list_packages", + mcp.WithDescription("List all the apps/packages on the device."), + ) + ums.mcpServer.AddTool(listPackagesTool, ums.handleListPackages) + ums.tools = append(ums.tools, listPackagesTool) + ums.handlerMap[listPackagesTool.Name] = ums.handleListPackages + // TapXY Tool tapParams := append( []mcp.ToolOption{mcp.WithDescription("Taps on the device screen at the given coordinates.")}, @@ -181,6 +189,20 @@ func (ums *MCPServer4XTDriver) handleSelectDevice(ctx context.Context, request m return mcp.NewToolResultText(fmt.Sprintf("Selected device: %s", uuid)), nil } +// handleListPackages handles the list_packages tool call. +func (ums *MCPServer4XTDriver) handleListPackages(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + driverExt, err := ums.setupXTDriver(ctx, request.Params.Arguments) + if err != nil { + return nil, err + } + + apps, err := driverExt.IDriver.GetDevice().ListPackages() + if err != nil { + return nil, err + } + return mcp.NewToolResultText(fmt.Sprintf("Device packages: %v", apps)), nil +} + // handleTapXY handles the tap_xy tool call. func (ums *MCPServer4XTDriver) handleTapXY(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { driverExt, err := ums.setupXTDriver(ctx, request.Params.Arguments) diff --git a/uixt/android_device.go b/uixt/android_device.go index a53134a0..570c5302 100644 --- a/uixt/android_device.go +++ b/uixt/android_device.go @@ -303,6 +303,10 @@ func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err e return types.WindowInfo{}, errors.New("failed to extract current window") } +func (dev *AndroidDevice) ListPackages() ([]string, error) { + return dev.Device.ListPackages() +} + func (dev *AndroidDevice) GetPackageInfo(packageName string) (types.AppInfo, error) { appInfo := types.AppInfo{ Name: packageName, diff --git a/uixt/browser_device.go b/uixt/browser_device.go index f09bd229..533cd6da 100644 --- a/uixt/browser_device.go +++ b/uixt/browser_device.go @@ -57,6 +57,10 @@ func (dev *BrowserDevice) Uninstall(packageName string) error { return errors.New("not support") } +func (dev *BrowserDevice) ListPackages() ([]string, error) { + return nil, errors.New("not support") +} + func (dev *BrowserDevice) GetPackageInfo(packageName string) (types.AppInfo, error) { return types.AppInfo{}, errors.New("not support") } diff --git a/uixt/device.go b/uixt/device.go index 7e44857a..3ced174a 100644 --- a/uixt/device.go +++ b/uixt/device.go @@ -18,6 +18,8 @@ type IDevice interface { Install(appPath string, opts ...option.InstallOption) error Uninstall(packageName string) error + ListPackages() ([]string, error) + GetPackageInfo(packageName string) (types.AppInfo, error) ScreenShot() (*bytes.Buffer, error) // TODO: remove? diff --git a/uixt/harmony_device.go b/uixt/harmony_device.go index 11320b1a..8725f471 100644 --- a/uixt/harmony_device.go +++ b/uixt/harmony_device.go @@ -95,6 +95,10 @@ func (dev *HarmonyDevice) Uninstall(packageName string) error { return nil } +func (dev *HarmonyDevice) ListPackages() ([]string, error) { + return nil, errors.New("not implemented") +} + func (dev *HarmonyDevice) GetPackageInfo(packageName string) (types.AppInfo, error) { log.Warn().Msg("get package info not implemented for harmony device, skip") return types.AppInfo{}, nil diff --git a/uixt/ios_device.go b/uixt/ios_device.go index 8aae0d9f..c6d36a73 100644 --- a/uixt/ios_device.go +++ b/uixt/ios_device.go @@ -317,6 +317,18 @@ func (dev *IOSDevice) GetDeviceInfo() (*DeviceDetail, error) { return detail, err } +func (dev *IOSDevice) ListPackages() ([]string, error) { + apps, err := dev.ListApps(ApplicationTypeAny) + if err != nil { + return nil, err + } + var packages []string + for _, app := range apps { + packages = append(packages, app.CFBundleIdentifier) + } + return packages, nil +} + func (dev *IOSDevice) ListApps(appType ApplicationType) (apps []installationproxy.AppInfo, err error) { svc, _ := installationproxy.New(dev.DeviceEntry) defer svc.Close()