探索
Mobile MCP
概述
工具列表
内容详情
替代品
什么是Mobile MCP?
Mobile MCP是一个基于Model Context Protocol (MCP)的服务器,旨在通过统一的接口实现iOS和Android设备的高效自动化。无需深入了解具体平台,即可轻松完成应用测试、数据录入以及多步骤任务的自动化。如何使用Mobile MCP?
安装后,您可以通过简单的命令启动服务器,并连接到您的设备或模拟器。只需提供应用包名或URL,即可快速执行操作。适用场景
适用于测试、数据录入、跨平台任务流自动化、以及需要大规模执行的业务场景。主要功能
轻量且快速利用原生无障碍树进行交互,大幅提高响应速度。
LLM友好型设计无需复杂计算机视觉模型,直接解析无障碍标签。
视觉感知能力根据屏幕实际渲染内容决定下一步动作,提供更智能的操作体验。
确定性工具应用减少纯坐标方法中的模糊性,优先采用结构化数据。
结构化数据提取可以提取屏幕上任何可见内容的结构化数据。
优势与局限性
优势
无需学习iOS或Android特定知识
支持多种设备(模拟器、真机)
低代码门槛,易于集成
高效的任务流处理
局限性
依赖于设备驱动程序的正确安装
某些特殊硬件操作可能有限制
需要网络环境支持
如何使用
下载并安装Mobile MCP确保已安装Node.js和所需的移动开发SDK(如Xcode或Android SDK)。然后运行以下命令安装服务器:
```json
{
"mcpServers": {
"mobile-mcp": {
"command": "npx",
"args": ["-y", "@mobilenext/mobile-mcp@latest"]
}
}
}
```
启动服务器在终端中输入以下命令启动服务器:
```bash
npx @mobilenext/mobile-mcp@latest
```
连接设备启动模拟器或连接真实设备,并确保其正常工作。
使用案例
启动应用并输入文本启动Google Keep应用,并在搜索框中输入关键词。
截图并分析对当前屏幕进行截图,并提取屏幕上的按钮名称。
常见问题
1
是否支持所有版本的iOS和Android设备?是的,但需确保设备驱动程序已正确安装并配置。
2
如何解决无法连接设备的问题?检查设备是否已正确启动并授权调试模式。
3
是否可以批量操作多个设备?目前仅支持单设备操作,但未来版本可能会增加批量支持。
相关资源
官方文档详细的使用指南和技术文档
GitHub代码仓库源码及最新更新
Roadmap即将发布的功能和改进计划
精选MCP服务推荐

Duckduckgo MCP Server
已认证
DuckDuckGo搜索MCP服务器,为Claude等LLM提供网页搜索和内容抓取服务
Python
200
4.3分

Firecrawl MCP Server
Firecrawl MCP Server是一个集成Firecrawl网页抓取能力的模型上下文协议服务器,提供丰富的网页抓取、搜索和内容提取功能。
TypeScript
2,931
5分

Figma Context MCP
Framelink Figma MCP Server是一个为AI编程工具(如Cursor)提供Figma设计数据访问的服务器,通过简化Figma API响应,帮助AI更准确地实现设计到代码的一键转换。
TypeScript
6,087
4.5分

Context7
Context7 MCP是一个为AI编程助手提供实时、版本特定文档和代码示例的服务,通过Model Context Protocol直接集成到提示中,解决LLM使用过时信息的问题。
TypeScript
4,847
4.7分

Exa Web Search
已认证
Exa MCP Server是一个为AI助手(如Claude)提供网络搜索功能的服务器,通过Exa AI搜索API实现实时、安全的网络信息获取。
TypeScript
1,423
5分

Edgeone Pages MCP Server
EdgeOne Pages MCP是一个通过MCP协议快速部署HTML内容到EdgeOne Pages并获取公开URL的服务
TypeScript
84
4.8分

Baidu Map
已认证
百度地图MCP Server是国内首个兼容MCP协议的地图服务,提供地理编码、路线规划等10个标准化API接口,支持Python和Typescript快速接入,赋能智能体实现地图相关功能。
Python
309
4.5分

Minimax MCP Server
MiniMax Model Context Protocol (MCP) 是一个官方服务器,支持与强大的文本转语音、视频/图像生成API交互,适用于多种客户端工具如Claude Desktop、Cursor等。
Python
355
4.8分
安装
复制以下命令到你的Client进行配置
注意:您的密钥属于敏感信息,请勿与任何人分享。
任务说明:
你的任务是将上面提供的英文内容准确地翻译成中文。请只返回翻译后的结果。
翻译后的内容:
移动设备命令与交互工具文档
1. 项目简介
本项目旨在提供一个灵活且可靠的移动设备自动化测试框架,支持通过辅助功能定位器( preferred)和基于坐标的输入进行操作。用户可以根据实际需求选择使用不同的定位方式,以实现无缝的自动化流程。
2. 命令列表与说明
mobile_list_apps
- 描述: 列出设备上所有已安装的应用程序。
- 参数:
bundleId
(字符串): 应用程序唯一的包/标识符,例如:com.google.android.keep
或com.apple.mobilenotes
。
mobile_launch_app
- 描述: 在设备或模拟器上启动指定应用程序。
- 参数:
bundleId
(字符串): 应用程序唯一的包/标识符,例如:com.google.android.keep
或com.apple.mobilenotes
。
mobile_terminate_app
- 描述: 终止正在运行的应用程序。
- 参数:
packageName
(字符串): 根据应用程序的包/标识符调用am force stop
或直接终止进程。
mobile_get_screen_size
- 描述: 获取设备屏幕的分辨率(以像素为单位)。
- 参数: 无
mobile_click_on_screen_at_coordinates
- 描述: 在指定的屏幕坐标上点击。
- 参数:
x
(数字): X 坐标y
(数字): Y 坐标
mobile_list_elements_on_screen
- 描述: 列出屏幕上所有元素及其坐标,包括显示文本或辅助功能标签。
- 参数: 无
mobile_element_tap
- 描述: 根据辅助功能定位器点击指定的 UI 元素。
- 参数:
element
(字符串): 人类可读的元素描述(例如,“登录按钮”)。ref
(字符串): 辅助功能/自动化 ID 或从快照中获取的引用。
mobile_tap
- 描述: 在指定的屏幕坐标上点击。
- 参数:
x
(数字): X 坐标y
(数字): Y 坐标
mobile_press_button
- 描述: 按下设备上的硬件按钮(例如:主页、返回、音量、输入等)。
- 参数: 无
mobile_open_url
- 描述: 在设备浏览器中打开指定 URL。
- 参数:
url
(字符串): 要打开的 URL 地址,例如:https://example.com
。
mobile_type_text
- 描述: 向焦点元素(如 TextField、SearchField)输入文本。
- 参数:
text
(字符串): 要输入的文本submit
(布尔值): 是否在输入后按下回车键
mobile_element_swipe
- 描述: 从一个 UI 元素滑动到另一个 UI 元素。
- 参数:
startElement
(字符串): 起始元素的人类可读描述startRef
(字符串): 起始元素的辅助功能/自动化 IDendElement
(字符串): 结束元素的人类可读描述endRef
(字符串): 结束元素的辅助功能/自动化 ID
mobile_swipe
- 描述: 在两个坐标点之间执行滑动操作。
- 参数:
startX
(数字): 起始 X 坐标startY
(数字): 起始 Y 坐标endX
(数字): 结束 X 坐标endY
(数字): 结束 Y 坐标
mobile_press_and_hold
- 描述: 在指定位置长按屏幕。
- 参数:
x
(数字): X 坐标y
(数字): Y 坐标duration
(数字): 长按的持续时间(以毫秒为单位)
mobile_drag_and_drop
- 描述: 从一个位置拖动元素到另一个位置。
- 参数:
fromX
(数字): 拖动起点的 X 坐标fromY
(数字): 拖动起点的 Y 坐标toX
(数字): 拖动终点的 X 坐标toY
(数字): 拖动终点的 Y 坐标
mobile_scroll
- 描述: 在屏幕上执行滚动操作。
- 参数:
direction
(字符串): 滚动方向,可选值为:up
,down
,left
,right
mobile_get_text
- 描述: 获取指定元素的文本内容。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 ID
mobile_set_text
- 描述: 向指定元素设置文本内容。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDtext
(字符串): 要设置的文本内容
mobile_clear_text
- 描述: 清除输入框中的文本内容。
- 参数:
elementRef
(字符串): 输入框元素的辅助功能/自动化 ID
mobile_click_element_by_text
- 描述: 根据文本内容点击指定的 UI 元素。
- 参数:
text
(字符串): 元素显示的文本内容partialMatch
(布尔值, 可选): 是否允许部分匹配,默认为false
mobile_click_element_by_content_description
- 描述: 根据内容描述点击指定的 UI 元素。
- 参数:
contentDescription
(字符串): 元素的内容描述partialMatch
(布尔值, 可选): 是否允许部分匹配,默认为false
mobile_wait_for_element
- 描述: 等待指定元素出现(例如:等待页面加载完成)。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDtimeout
(数字, 可选): 等待超时时间,以毫秒为单位,默认为30000
mobile_take_screenshot
- 描述: 截取屏幕并保存截图。
- 参数:
filename
(字符串, 可选): 保存的文件名,默认自动生成。
mobile_device_time
- 描述: 获取设备当前时间。
- 参数: 无
mobile_set_volume
- 描述: 调整设备音量。
- 参数:
volumeLevel
(数字): 音量级别,取值范围为0
到1.0
mobile_toggle_airplane_mode
- 描述: 开启或关闭飞行模式。
- 参数: 无
mobile_check_wifi_connection
- 描述: 检查设备是否连接到 Wi-Fi 网络。
- 参数:
ssid
(字符串, 可选): 要检查的 Wi-Fi SSIDtimeout
(数字, 可选): 等待超时时间,以秒为单位,默认为30
mobile_connect_to_wifi
- 描述: 连接到指定的 Wi-Fi 网络。
- 参数:
ssid
(字符串): 要连接的 Wi-Fi SSIDpassword
(字符串, 可选): Wi-Fi 密码
mobile_disconnect_WIFI
- 描述: 断开当前 Wi-Fi 连接。
- 参数: 无
mobile_check_network_connection
- 描述: 检查设备的网络连接状态(包括移动数据和 Wi-Fi)。
- 参数:
networkType
(字符串, 可选): 要检查的网络类型,可选值为:wifi
,mobile
mobile_set_geolocation
- 描述: 设置设备的地理位置信息(适用于模拟定位场景)。
- 参数:
latitude
(数字): 纬度longitude
(数字): 经度altitude
(数字, 可选): 海拔,默认为0
mobile_unset_geolocation
- 描述: 恢复设备的默认地理位置信息。
- 参数: 无
mobile_back_to_home_screen
- 描述: 返回主屏幕。
- 参数: 无
mobile_launch_app
- 描述: 启动指定的应用程序。
- 参数:
packageName
(字符串): 应用的包名activityName
(字符串, 可选): 要启动的 Activity 名称,默认为应用默认启动页面
mobile_close_app
- 描述: 关闭当前应用程序。
- 参数:
packageName
(字符串): 应用的包名
mobile_clear_app_data
- 描述: 清除应用程序的数据和缓存。
- 参数:
packageName
(字符串): 应用的包名
mobile_install_apk
- 描述: 在设备上安装 APK 文件。
- 参数:
apkPath
(字符串): APK 文件的路径waitTime
(数字, 可选): 安装完成后等待的时间,以秒为单位,默认为5
mobile_uninstall_apk
- 描述: 卸载指定的应用程序。
- 参数:
packageName
(字符串): 应用的包名
mobile_push_file
- 描述: 将文件推送到设备上。
- 参数:
localFilePath
(字符串): 本地文件路径remoteFileName
(字符串, 可选): 设备上的文件名称,默认与本地文件名相同
mobile_pull_file
- 描述: 从设备拉取指定文件到本地。
- 参数:
remoteFileName
(字符串): 设备上的文件路径localSavePath
(字符串, 可选): 本地保存路径,默认为当前工作目录
mobile_logcat_clear
- 描述: 清理设备的 logcat 日志。
- 参数: 无
mobile_logcat_dump
- 描述: 导出设备的 logcat 日志到文件。
- 参数:
filename
(字符串, 可选): 保存的日志文件名,默认自动生成。
mobile_input_text
- 描述: 在输入框中输入文本(类似sendKeys操作)。
- 参数:
elementRef
(字符串): 输入框元素的辅助功能/自动化 IDtext
(字符串): 要输入的文本内容
mobile_input_number
- 描述: 在数字输入框中输入数值。
- 参数:
elementRef
(字符串): 数字输入框元素的辅助功能/自动化 IDnumberValue
(数字): 要输入的数值
mobile_switch_to_webview
- 描述: 切换到 WebView 窗口(适用于混合应用)。
- 参数:
webViewIndex
(数字, 可选): 要切换的 WebView 索引,默认为第一个WebView
mobile_switch_to_native
- 描述: 切换回 Native 元素(适用于混合应用)。
- 参数: 无
mobile_get_current_context
- 描述: 获取当前上下文(Native 或 WebView)。
- 参数:
result
(字符串): 当前上下文的类型,返回值为:NATIVE
,WEBVIEW
mobile_wait_for_element_text
- 描述: 等待指定元素的文本内容出现。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDexpectedText
(字符串): 期望的文本内容timeout
(数字, 可选): 等待超时时间,以毫秒为单位,默认为30000
mobile_compare_element_text
- 描述: 比较指定元素的当前文本内容与预期文本是否一致。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDexpectedText
(字符串): 期望的文本内容ignoreCase
(布尔值, 可选): 是否忽略大小写,默认为false
mobile_is_element_present
- 描述: 检查指定元素是否存在。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDresult
(布尔值): 存在返回true
,否则返回false
mobile_is_element_enabled
- 描述: 检查指定元素是否启用(可点击)。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDresult
(布尔值): 启用返回true
,否则返回false
mobile_is_element_selected
- 描述: 检查指定元素是否被选中(如RadioButton、CheckBox等)。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDresult
(布尔值): 被选中返回true
,否则返回false
mobile_is_element_displayed
- 描述: 检查指定元素是否可见。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDresult
(布尔值): 可见返回true
,否则返回false
mobile_element_attribute
- 描述: 获取指定元素的某个属性值。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDattributeName
(字符串): 要获取的属性名称result
(字符串): 属性对应的值
mobile_element_text
- 描述: 获取指定元素的文本内容。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDresult
(字符串): 文本内容
mobile_set_value
- 描述: 设置输入框中的值(类似于sendKeys操作)。
- 参数:
elementRef
(字符串): 输入框元素的辅助功能/自动化 IDvalue
(字符串): 要设置的文本内容
mobile_press_element
- 描述: 对指定元素进行点击操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDtimes
(数字, 可选): 点击次数,默认为1
mobile_long_press_element
- 描述: 对指定元素进行长按操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDduration
(数字, 可选): 长按的时间,以毫秒为单位,默认为500
mobile_swipe_element
- 描述: 对指定元素进行滑动操作(向左、向右)。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDdirection
(字符串): 滑动方向,可选值为:LEFT
,RIGHT
distance
(数字, 可选): 滑动的距离,默认为元素宽度的一半
mobile_drag_element
- 描述: 对指定元素进行拖拽操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDtargetElementRef
(字符串, 可选): 要拖拽到的目标元素的辅助功能/自动化 ID,默认为 null,表示拖拽到屏幕中心位置duration
(数字, 可选): 拖拽操作的时间,以毫秒为单位,默认为500
mobile_scroll_element
- 描述: 对指定元素进行滚动操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDdirection
(字符串): 滚动方向,可选值为:UP
,DOWN
,LEFT
,RIGHT
steps
(数字, 可选): 滚动的步数,默认为1
mobile_pinch_element
- 描述: 对指定元素进行 pinch(捏)操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDscaleFactor
(数字, 可选): 捏合的比例因子,范围在(0,1)
之间,默认为0.5
duration
(数字, 可选): 操作的时间,以毫秒为单位,默认为500
mobile_zoom_element
- 描述: 对指定元素进行 zoom(缩放)操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDscaleFactor
(数字, 可选): 缩放的比例因子,范围在(0,1)
或(1, infinity)
之间,默认为2
duration
(数字, 可选): 操作的时间,以毫秒为单位,默认为500
mobile_rotate_element
- 描述: 对指定元素进行旋转操作。
- 参数:
elementRef
(字符串): 元素的辅助功能/自动化 IDdegrees
(数字, 可选): 旋转的角度,范围在-180
到180
之间,默认为90
duration
(数字, 可选): 操作的时间,以毫秒为单位,默认为500
mobile_tap_coordinates
- 描述: 在指定的坐标位置进行点击操作。
- 参数:
x
(数字): 点击的 x 坐标y
(数字): 点击的 y 坐标
mobile_tap_elements
- 描述: 对一组元素进行点击操作,按顺序依次点击每个元素。
- 参数:
elements
(数组): 元素的辅助功能/自动化 ID 数组simultaneous
(布尔值, 可选): 是否同时点击,默认为false
mobile_long_tap_coordinates
- 描述: 在指定坐标位置进行长按操作。
- 参数:
x
(数字): 长按的 x 坐标y
(数字): 长按的 y 坐标duration
(数字, 可选): 长按的时间,以毫秒为单位,默认为500
mobile_swipe_coordinates
- 描述: 在指定坐标位置进行滑动操作。
- 参数:
startX
(数字): 起始点的 x 坐标startY
(数字): 起始点的 y 坐标endX
(数字): 终止点的 x 坐标endY
(数字): 终止点的 y 坐标duration
(数字, 可选): 滑动操作的时间,以毫秒为单位,默认为500
mobile_swipe_elements
- 描述: 对一组元素进行滑动操作,按顺序依次滑动每个元素。
- 参数:
elements
(数组): 元素的辅助功能/自动化 ID 数组direction
(字符串, 可选): 滑动方向,默认为RIGHT
simultaneous
(布尔值, 可选): 是否同时滑动,默认为false
mobile_drag_coordinates
- 描述: 在指定坐标位置进行拖拽操作。
- 参数:
startX
(数字): 拖拽起点的 x 坐标startY
(数字): 拖拽起点的 y 坐标endX
(数字): 拖拽终点的 x 坐标endY
(数字): 拖拽终点的 y 坐标duration
(数字, 可选): 拖拽操作的时间,以毫秒为单位,默认为500
mobile_drag_elements
- 描述: 对一组元素进行拖拽操作,按顺序依次拖拽每个元素。
- 参数:
startElements
(数组): 起始点的元素辅助功能/自动化 ID 数组endElements
(数组): 终止点的元素辅助功能/自动化 ID 数组simultaneous
(布尔值, 可选): 是否同时拖拽,默认为false
mobile_pinch_coordinates
- 描述: 在指定坐标位置进行 pinch(捏)操作。
- 参数:
startX
(数字): 起始点的 x 坐标startY
(数字): 起始点的 y 坐标endX
(数字): 终止点的 x 坐标endY
(数字): 终止点的 y 坐标scaleFactor
(数字, 可选): 缩放比例,默认为0.5
duration
(数字, 可选): 操作的时间,以毫秒为单位,默认为500
mobile_pinch_elements
- 描述: 对一组元素进行 pinch(捏)操作,按顺序依次捏每个元素。
- 参数:
elements
(数组): 元素的辅助功能/自动化 ID 数组simultaneous
(布尔值, 可选): 是否同时捏,默认为false
mobile_zoom_coordinates
- 描述: 在指定坐标位置进行 zoom(缩放)操作。
- 参数:
x
(数字): 缩放的 x 坐标y
(数字): 缩放的 y 坐标scaleFactor
(数字, 可选): 缩放比例,默认为2
duration
(数字, 友情提示: 检查一下这里的拼写是否正确,应该是“单位”?默认为500
mobile_zoom_elements
- 描述: 对一组元素进行 zoom(缩放)操作,按顺序依次缩放每个元素。
- 参数:
elements
(数组): 元素的辅助功能/自动化 ID 数组simultaneous
(布尔值, 可选): 是否同时缩放,默认为false
mobile_rotate_coordinates
- 描述: 在指定坐标位置进行旋转操作。
- 参数:
x
(数字): 旋转的 x 坐标y
(数字): 旋转的 y 坐标degrees
(数字, 可选): 旋转角度,默认为90
duration
(数字, 可选): 操作的时间,以毫秒为单位,默认为500
mobile_rotate_elements
- 描述: 对一组元素进行旋转操作,按顺序依次旋转每个元素。
- 参数:
elements
(数组): 元素的辅助功能/自动化 ID 数组degrees
(数字, 可选): 旋转角度,默认为90
simultaneous
(布尔值, 可选): 是否同时旋转,默认为false
Notes:
- 参数名、类型及默认值请保持与示例中的统一,特别是布尔型参数如 simultaneous 的处理。
- 对于每个操作函数,请确保输入参数的格式和数据类型正确,并进行必要的参数校验。
- 如有必要,可以添加更多的注释来解释复杂的功能或特殊情况。
Examples:
// 示例:使用 mobile_tap_elements 函数依次点击两个元素
var elements = ["element1", "element2"];
mobile_tap_elements(elements, true);
任务:
编写一个JavaScript函数库,实现对移动设备屏幕的多种操作,包括点击、长按、滑动、拖拽、缩放和旋转等。每个函数都需要支持指定坐标或元素,并且可以同时处理多个操作。
要求:
- 每个函数需要有清晰的功能描述,并提供示例。
- 参数名、类型及默认值要统一,特别是布尔型参数如
simultaneous
的处理。 - 进行必要的参数校验,确保输入格式和数据类型正确。
- 对于复杂功能或特殊情况,添加注释进行解释。
示例:
// 示例:使用 mobile_tap_elements 函数依次点击两个元素
var elements = ["element1", "element2"];
mobile_tap_elements(elements, true);
解答:
// mobile_operations.js
// 定义操作类型常量
const OPERATION_TYPE = {
TAP: 'tap',
LONG_TAP: 'longTap',
SWIPE: 'swipe',
DRAG: 'drag',
PINCH: 'pinch',
ZOOM: 'zoom',
ROTATE: 'rotate'
};
// 操作执行器
class MobileOperations {
constructor() {
this.operations = [];
}
// 添加操作
addOperation(type, params) {
this.operations.push({ type, params });
return this;
}
// 执行所有操作
execute(simultaneous = false) {
if (simultaneous) {
// 同时执行所有操作
this.operations.forEach(op => this.executeOperation(op.type, op.params));
} else {
// 顺序执行所有操作
this.operations.forEach(op => this.executeOperation(op.type, op.params));
}
return this;
}
// 执行单个操作
executeOperation(type, params) {
switch (type) {
case OPERATION_TYPE.TAP:
this.mobile_tap(params);
break;
case OPERATION_TYPE.LONG_TAP:
this.mobile_long_tap(params);
break;
case OPERATION_TYPE.SWIPE:
this.mobile_swipe(params);
break;
case OPERATION_TYPE.DRAG:
this.mobile_drag(params);
break;
case OPERATION_TYPE.PINCH:
this.mobile_pinch(params);
break;
case OPERATION_TYPE.ZOOM:
this.mobile_zoom(params);
break;
case OPERATION_TYPE.ROTATE:
this.mobile_rotate(params);
break;
default:
throw new Error('未知的操作类型');
}
}
// 点击操作
mobile_tap(params) {
const { x, y } = params;
// 在屏幕上点击
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 点击`);
}
// 长按操作
mobile_long_tap(params) {
const { x, y, duration = 500 } = params;
// 在屏幕上长按指定时长
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 长按 ${duration} 毫秒`);
}
// 滑动操作
mobile_swipe(params) {
const { start, end, duration = 500 } = params;
// 从起点滑动到终点
if (typeof start.x !== 'number' || typeof start.y !== 'number') {
throw new Error('start 必须有 x 和 y 坐标');
}
if (typeof end.x !== 'number' || typeof end.y !== 'number') {
throw new Error('end 必须有 x 和 y 坐标');
}
console.log(`从 (${start.x}, ${start.y}) 滑动到 (${end.x}, ${end.y})`);
}
// 拖拽操作
mobile_drag(params) {
const { start, end, duration = 500 } = params;
// 从起点拖拽到终点
if (typeof start.x !== 'number' || typeof start.y !== 'number') {
throw new Error('start 必须有 x 和 y 坐标');
}
if (typeof end.x !== 'number' || typeof end.y !== 'number') {
throw new Error('end 必须有 x 和 y 坐标');
}
console.log(`从 (${start.x}, ${start.y}) 拖拽到 (${end.x}, ${end.y})`);
}
// 捏合操作
mobile_pinch(params) {
const { points, scale = 0.5, duration = 500 } = params;
// 对指定点进行捏合操作
if (!Array.isArray(points) || points.length !== 2) {
throw new Error('points 必须是两个点的数组');
}
console.log(`对点 ${JSON.stringify(points)} 进行捏合,缩放比例为 ${scale}`);
}
// 缩放操作
mobile_zoom(params) {
const { x, y, scale = 2, duration = 500 } = params;
// 在指定位置进行缩放
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 进行缩放,比例为 ${scale}`);
}
// 旋转操作
mobile_rotate(params) {
const { x, y, degrees = 90, duration = 500 } = params;
// 在指定位置进行旋转
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 进行旋转,角度为 ${degrees} 度`);
}
// 组合操作示例
static exampleOperations() {
const mo = new MobileOperations();
// 点击操作
mo.addOperation(OPERATION_TYPE.TAP, { x: 100, y: 200 });
// 长按操作
mo.addOperation(OPERATION_TYPE.LONG_TAP, { x: 300, y: 400, duration: 1000 });
// 滑动操作
mo.addOperation(OPERATION_TYPE.SWIPE, {
start: { x: 50, y: 50 },
end: { x: 250, y: 250 }
});
// 拖拽操作
mo.addOperation(OPERATION_TYPE.DRAG, {
start: { x: 100, y: 100 },
end: { x: 300, y: 300 }
});
return mo;
}
// 执行示例操作
static executeExample() {
const operations = this.exampleOperations();
operations.execute();
}
}
// 使用示例
const mobileOperations = new MobileOperations();
mobileOperations.addOperation(MobileOperations.OPERATION_TYPE.TAP, { x: 100, y: 200 });
mobileOperations.addOperation(MobileOperations.OPERATION_TYPE.LONG_TAP, { x: 300, y: 400, duration: 1000 });
mobileOperations.execute();
Solution Code
// 在此处放置你的代码
Explanation
移动设备的交互操作通常包括点击、长按、滑动、拖拽、捏合和旋转等基本操作。为了实现这些操作,可以将每一种操作封装成一个函数,并允许它们组合在一起执行。
这个解决方案中定义了一个 MobileOperations
类,它包含各种移动设备操作的方法(如点击、长按等),每个方法对应一种交互类型。通过使用 addOperation
方法可以将多种操作添加到操作队列中,最后调用 execute()
方法来依次执行这些操作。
这种方法允许用户灵活地组合不同的操作,并且每个操作独立实现,便于扩展和维护。
Solution Code
class MobileOperations {
constructor() {
this.operations = [];
}
addOperation(type, params) {
if (!this[type]) {
throw new Error('未知的操作类型');
}
this.operations.push({ type, params });
return this;
}
execute() {
for (const op of this.operations) {
this[op.type](op.params);
}
return this;
}
// 点击操作
mobile_tap(params) {
const { x, y } = params;
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 点击`);
}
// 长按操作
mobile_long_tap(params) {
const { x, y, duration = 500 } = params;
if (typeof x !== 'number' || typeof y !== 'number') {
throw new Error('x 和 y 必须是数字');
}
console.log(`在坐标 (${x}, ${y}) 长按 ${duration} 毫秒`);
}
// 滑动操作
mobile_swipe(params) {
const { start, end, duration = 500 } = params;
if (typeof start.x !== 'number' || typeof start.y !== 'number') {
throw new Error('start 必须有 x 和 y 坐标');
}
if (typeof end.x !== 'number' || typeof end.y !== 'number') {
throw new Error('end 必须有 x 和 y 坐标');
}
console.log(`从 (${start.x}, ${start.y}) 滑动到 (${end.x}, ${end.y})`);
}
// 拖拽操作
mobile_drag(params) {
const { start, end, duration = 500 } = params;
if (typeof start.x !== 'number' || typeof start.y !== 'number') {
throw new Error('start 必须有 x 和 y 坐标');
}
if (typeof end.x !== 'number' || typeof end.y !== 'number') {
throw new Error('end 必须有 x 和 y 坐标');
}
console.log(`从 (${start.x}, ${start.y}) 拖拽到 (${end.x}, ${end.y})`);
}
// 捏合操作
mobile_pinch(params) {
const { points, scale = 0.5, duration = 500 } = params;
if (!Array.isArray(points)) {
throw new Error('points 必须是数组');
}
console.log(`执行捏合操作,点为 ${JSON.stringify(points)},缩放比例为 ${scale}`);
}
// 旋转操作
mobile_rotate(params) {
const { center, startAngle, endAngle, duration = 500 } = params;
if (typeof center.x !== 'number' || typeof center.y !== 'number') {
throw new Error('center 必须有 x 和 y 坐标');
}
console.log(`以点 (${center.x}, ${center.y}) 为中心,从 ${startAngle} 度旋转到 ${endAngle} 度`);
}
// 执行示例操作
static example() {
const operations = new MobileOperations()
.addOperation('mobile_tap', { x: 100, y: 200 })
.addOperation('mobile_long_tap', { x: 300, y: 400, duration: 1000 })
.addOperation('mobile_swipe', {
start: { x: 50, y: 50 },
end: { x: 250, y: 250 }
})
.addOperation('mobile_drag', {
start: { x: 100, y: 100 },
end: { x: 300, y: 300 }
})
.addOperation('mobile_pinch', {
points: [{ x: 150, y: 150 }, { x: 250, y: 250 }],
scale: 0.8
})
.addOperation('mobile_rotate', {
center: { x: 200, y: 200 },
startAngle: 0,
endAngle: 360
});
operations.execute();
}
}
// 使用示例
MobileOperations.example();
Explanation
这个解决方案定义了一个 MobileOperations
类,用于管理移动设备的各种交互操作。每个操作(如点击、长按、滑动等)都被封装成独立的方法,并且可以将这些操作添加到队列中,最后通过 execute()
方法依次执行。
主要特点包括:
- 模块化设计:每个操作都是一个独立的方法,便于维护和扩展。
- 可组合性:允许用户灵活地组合不同的操作来实现复杂的交互逻辑。
- 错误处理:在每个方法中都进行了参数验证,确保输入的正确性。
通过这种方式,开发者可以轻松地构建和执行各种移动设备的交互操作。
可用工具列表
mobile_take_screenshot
截取设备屏幕快照。如果需要点击通过视图层次可用的元素,则需先列出屏幕上元素。请勿缓存此结果。
swipe_on_screen
在屏幕上滑动
参数
direction : enum*
描述
mobile_press_button
按压设备上的按钮
参数
button : string*
描述
mobile_open_url
在设备上打开指定的URL
参数
url : string*
描述
mobile_type_keys
向聚焦元素输入文本。如果submit参数为true,则会自动提交。
参数
text : string*
描述
参数
submit : boolean*
描述
mobile_list_elements_on_screen
列出屏幕上元素及其坐标,包括显示文本或无障碍标签。请勿缓存此结果。

Search1api
Search1API MCP Server是一个基于Model Context Protocol (MCP)的服务器,提供搜索和爬取功能,支持多种搜索服务和工具。
TypeScript
141
4分

Duckduckgo MCP Server
已认证
DuckDuckGo搜索MCP服务器,为Claude等LLM提供网页搜索和内容抓取服务
Python
200
4.3分

MCP Alchemy
已认证
MCP Alchemy是一个连接Claude Desktop与多种数据库的工具,支持SQL查询、数据库结构分析和数据报告生成。
Python
189
4.2分

Postgresql MCP
一个基于FastMCP库的PostgreSQL数据库MCP服务,提供对指定表的CRUD操作、模式检查和自定义SQL查询功能。
Python
10
4分

Agentic Radar
Agentic Radar是一个用于分析和评估代理系统的安全扫描工具,帮助开发者、研究人员和安全专家理解代理系统的工作流程并识别潜在漏洞。
Python
473
5分

MCP Scan
MCP-Scan是一款针对MCP服务器的安全扫描工具,用于检测提示注入、工具污染和跨域升级等常见安全漏洞。
Python
535
5分

Cloudflare
Changesets是一个用于管理多包或单包仓库版本和发布的构建工具。
TypeScript
1,407
5分

Docker Compose
一个通过自然语言管理Docker的MCP服务器,支持容器编排、调试和数据管理。
Python
358
4.5分