一个提供全面Android设备控制的Model Context Protocol (MCP)服务器,通过Scrcpy提供了22个强大的工具,用于UI自动化、屏幕截图和超快速H.264流传输。
注意:ADB(Android调试桥)和Scrcpy是可选的——如果需要,服务器会在首次使用时从官方来源自动下载它们。
克隆并构建
git clone https://github.com/jduartedj/android-mcp-server.git
cd android-mcp-server
npm install
npm run build
测试服务器
node dist/index.js
服务器将启动,并根据需要自动下载ADB/Scrcpy。
添加到VS Code(参见下面的VS Code集成)
npm install
npm run build
node dist/index.js
服务器支持以下环境变量:
ADB_PATH:ADB可执行文件的自定义路径(默认:使用系统PATH或自动下载)DEVICE_SERIAL:要针对的具体设备序列号(默认:第一个可用设备)要在VS Code中使用此MCP服务器与GitHub Copilot:
打开VS Code设置(Ctrl+, 或Cmd+,)
搜索MCP或导航到:GitHub Copilot > Chat > MCP Servers
编辑MCP配置,点击“在settings.json中编辑”
向您的配置中添加Android MCP服务器:
{
"github.copilot.chat.mcp.servers": {
"android-mcp-server": {
"command": "node",
"args": ["F:\\android-mcp-server\\dist\\index.js"],
"env": {
"ADB_PATH": "",
"DEVICE_SERIAL": ""
}
}
}
}
注意:用实际的绝对路径替换F:\\android-mcp-server\\dist\\index.js。在Windows上使用双反斜杠。
{
"github.copilot.chat.mcp.servers": {
"android-mcp-server": {
"command": "npx",
"args": ["-y", "android-mcp-server"]
}
}
}
添加服务器后:
@workspace,您应该能看到Android MCP工具一旦集成,您可以询问GitHub Copilot:
android_screenshot从Android设备捕获屏幕截图。
参数:
outputPath(可选):保存截图的本地路径。如果没有提供,则返回base64编码的图像。deviceSerial(可选):通过序列号指定目标设备性能:每次捕获约1-2秒
示例:
{
"name": "android_screenshot",
"arguments": {
"outputPath": "./screenshot.png"
}
}
android_touch在特定屏幕坐标处模拟触摸事件。支持快速点击和长按。
参数:
x(必需):X坐标y(必需):Y坐标duration(可选):触摸持续时间(单位:毫秒,默认:100毫秒快速点击,大于100毫秒长按)deviceSerial(可选):通过序列号指定目标设备性能:立即
示例 - 快速点击:
{
"name": "android_touch",
"arguments": { "x": 500, "y": 1000, "duration": 100 }
}
示例 - 长按:
{
"name": "android_touch",
"arguments": { "x": 500, "y": 1000, "duration": 2000 }
}
android_swipe在两个坐标之间执行滑动手势。
参数:
startX(必需):起始X坐标startY(必需):起始Y坐标endX(必需):结束X坐标endY(必需):结束Y坐标duration(可选):滑动持续时间(单位:毫秒,默认:300)deviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_swipe",
"arguments": {
"startX": 500, "startY": 1500, "endX": 500, "endY": 500, "duration": 300
}
}
android_launch_app通过包名启动Android应用。
参数:
packageName(必需):应用的包名(例如,com.example.app,com.google.android.apps.maps)deviceSerial(可选):通过序列号指定目标设备性能:约1-2秒
示例:
{
"name": "android_launch_app",
"arguments": { "packageName": "com.example.app" }
}
android_list_packages列出Android设备上已安装的包,可选过滤。
参数:
filter(可选):包名的搜索过滤器(不区分大小写)deviceSerial(可选):通过序列号指定目标设备性能:中等(检索完整的包列表)
示例 - 列出所有包:
{
"name": "android_list_packages",
"arguments": {}
}
示例 - 过滤包:
{
"name": "android_list_packages",
"arguments": { "filter": "google" }
}
android_input_text通过ADB在Android设备当前聚焦的字段中输入文本。
参数:
text(必需):要输入的文本。空格会自动处理。deviceSerial(可选):通过序列号指定目标设备性能:立即
用例:
示例:
{
"name": "android_input_text",
"arguments": {
"text": "user@example.com"
}
}
android_send_key_event向Android设备发送按键事件(例如,HOME、BACK、ENTER)。
参数:
keyCode(必需):按键事件码。可以是键名(例如,KEYEVENT_HOME,KEYEVENT_BACK)或数字码(例如,3表示HOME,4表示BACK)deviceSerial(可选):通过序列号指定目标设备性能:立即
常见键码:
KEYEVENT_HOME或3 - 主页按钮KEYEVENT_BACK或4 - 返回按钮KEYEVENT_ENTER或66 - 回车/返回键KEYEVENT_DEL或67 - 删除键KEYEVENT_MENU或82 - 菜单按钮KEYEVENT_VOLUME_UP或24 - 音量增加KEYEVENT_VOLUME_DOWN或25 - 音量减少KEYEVENT_POWER或26 - 电源按钮用例:
示例:
{
"name": "android_send_key_event",
"arguments": {
"keyCode": "KEYEVENT_BACK"
}
}
android_execute_command执行带有自定义参数的通用ADB命令。这个强大的工具允许代理完全自由地运行任何ADB命令及其参数。
参数:
args(必需):ADB命令参数数组(例如,["shell", "pm", "list", "packages"])deviceSerial(可选):通过序列号指定目标设备性能:因命令而异
返回值:命令执行的stdout和stderr
用例:
常见示例:
列出所有包:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "pm", "list", "packages"]
}
}
获取设备属性:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "getprop", "ro.build.version.release"]
}
}
读取logcat:
{
"name": "android_execute_command",
"arguments": {
"args": ["logcat", "-d", "-s", "MyTag:V"]
}
}
清除应用数据:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "pm", "clear", "com.example.app"]
}
}
获取电池信息:
{
"name": "android_execute_command",
"arguments": {
"args": ["shell", "dumpsys", "battery"]
}
}
推送文件到设备:
{
"name": "android_execute_command",
"arguments": {
"args": ["push", "/local/path/file.txt", "/sdcard/file.txt"]
}
}
安装APK:
{
"name": "android_execute_command",
"arguments": {
"args": ["install", "-r", "/path/to/app.apk"]
}
}
端口转发:
{
"name": "android_execute_command",
"arguments": {
"args": ["forward", "tcp:8080", "tcp:8080"]
}
}
android_uiautomator_dump转储当前屏幕的完整UI层次结构作为XML,用于检查和元素识别。
参数:
deviceSerial(可选):通过序列号指定目标设备返回值:完整的XML UI层次结构,可以解析以找到元素资源ID和属性。
性能:约500-800毫秒
用例:
示例:
{
"name": "android_uiautomator_dump",
"arguments": {}
}
android_uiautomator_find通过资源ID或文本内容使用UIAutomator查找UI元素。
参数:
resourceId(可选):要搜索的资源ID(例如,com.example.app:id/button_submit)text(可选):要搜索的文本内容deviceSerial(可选):通过序列号指定目标设备性能:快速
示例 - 通过资源ID查找:
{
"name": "android_uiautomator_find",
"arguments": { "resourceId": "com.example.app:id/email_input" }
}
示例 - 通过文本查找:
{
"name": "android_uiautomator_find",
"arguments": { "text": "Submit" }
}
android_uiautomator_click通过资源ID点击UI元素。
参数:
resourceId(必需):要点击的元素的资源IDdeviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_uiautomator_click",
"arguments": { "resourceId": "com.example.app:id/button_submit" }
}
android_uiautomator_double_click通过资源ID对UI元素执行双击。
参数:
resourceId(必需):元素的资源IDdeviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_uiautomator_double_click",
"arguments": { "resourceId": "com.example.app:id/text_field" }
}
android_uiautomator_long_click通过资源ID对UI元素执行长按。
参数:
resourceId(必需):元素的资源IDdeviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_uiautomator_long_click",
"arguments": { "resourceId": "com.example.app:id/menu_item" }
}
android_uiautomator_set_text通过资源ID设置UI元素的文本。首先会自动清除现有文本。
参数:
resourceId(必需):元素的资源IDtext(必需):要设置的文本deviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_uiautomator_set_text",
"arguments": {
"resourceId": "com.example.app:id/email_input",
"text": "user@example.com"
}
}
android_uiautomator_clear_text通过资源ID清除UI元素的文本。
参数:
resourceId(必需):元素的资源IDdeviceSerial(可选):通过序列号指定目标设备性能:立即
示例:
{
"name": "android_uiautomator_clear_text",
"arguments": { "resourceId": "com.example.app:id/search_input" }
}
android_uiautomator_toggle_checkbox通过资源ID切换复选框元素。
参数:
resourceId(必需):复选