mobile-mcp-ai 2.7.10__py3-none-any.whl → 2.7.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mobile_mcp/core/basic_tools_lite.py +77 -0
- mobile_mcp/mcp_tools/mcp_server.py +10 -0
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/METADATA +2 -1
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/RECORD +8 -8
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/WHEEL +0 -0
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/entry_points.txt +0 -0
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/licenses/LICENSE +0 -0
- {mobile_mcp_ai-2.7.10.dist-info → mobile_mcp_ai-2.7.12.dist-info}/top_level.txt +0 -0
|
@@ -2310,6 +2310,83 @@ class BasicMobileToolsLite:
|
|
|
2310
2310
|
except Exception as e:
|
|
2311
2311
|
return {"success": False, "message": f"❌ 按键失败: {e}"}
|
|
2312
2312
|
|
|
2313
|
+
async def hide_keyboard(self) -> Dict:
|
|
2314
|
+
"""收起键盘
|
|
2315
|
+
|
|
2316
|
+
在输入完成后收起键盘,确保页面元素不被键盘遮挡。
|
|
2317
|
+
对于登录场景中需要勾选协议复选框非常有用。
|
|
2318
|
+
|
|
2319
|
+
Returns:
|
|
2320
|
+
包含操作结果的字典
|
|
2321
|
+
"""
|
|
2322
|
+
try:
|
|
2323
|
+
if self._is_ios():
|
|
2324
|
+
ios_client = self._get_ios_client()
|
|
2325
|
+
if ios_client and hasattr(ios_client, 'wda'):
|
|
2326
|
+
# iOS: 尝试点击键盘上的"完成"/"Done"按钮或发送回车收起键盘
|
|
2327
|
+
try:
|
|
2328
|
+
# 尝试点击键盘上的"完成"或"Done"按钮
|
|
2329
|
+
keyboard = ios_client.wda(className='XCUIElementTypeKeyboard')
|
|
2330
|
+
if keyboard.exists:
|
|
2331
|
+
# 尝试找 return/done/完成 按钮
|
|
2332
|
+
for btn_name in ['return', 'Return', 'done', 'Done', '完成']:
|
|
2333
|
+
try:
|
|
2334
|
+
btn = keyboard.buttons[btn_name]
|
|
2335
|
+
if btn.exists:
|
|
2336
|
+
btn.click()
|
|
2337
|
+
return {"success": True, "message": "✅ 键盘已收起 (iOS - 点击完成按钮)"}
|
|
2338
|
+
except:
|
|
2339
|
+
continue
|
|
2340
|
+
|
|
2341
|
+
# 如果没有找到按钮,尝试点击键盘以外的区域
|
|
2342
|
+
size = ios_client.wda.window_size()
|
|
2343
|
+
# 点击屏幕顶部区域(通常不会被键盘遮挡)
|
|
2344
|
+
ios_client.wda.click(size[0] // 2, 50)
|
|
2345
|
+
return {"success": True, "message": "✅ 键盘已收起 (iOS - 点击空白区域)"}
|
|
2346
|
+
else:
|
|
2347
|
+
return {"success": True, "message": "💡 键盘未显示,无需收起"}
|
|
2348
|
+
except Exception as e:
|
|
2349
|
+
# 退回到发送回车键
|
|
2350
|
+
ios_client.wda.send_keys('\n')
|
|
2351
|
+
return {"success": True, "message": f"✅ 键盘已收起 (iOS - 发送回车,原因: {e})"}
|
|
2352
|
+
return {"success": False, "message": "❌ iOS 客户端未初始化"}
|
|
2353
|
+
else:
|
|
2354
|
+
# Android: 使用 back 键或 adb 命令收起键盘
|
|
2355
|
+
try:
|
|
2356
|
+
# 方法1: 使用 adb shell 检测键盘状态
|
|
2357
|
+
# u2.shell() 返回 ShellResponse(output, exit_code)
|
|
2358
|
+
shell_result = self.client.u2.shell('dumpsys input_method | grep mInputShown')
|
|
2359
|
+
# 提取 output 字段(兼容字符串和 ShellResponse 两种情况)
|
|
2360
|
+
result = shell_result.output if hasattr(shell_result, 'output') else str(shell_result)
|
|
2361
|
+
|
|
2362
|
+
if 'mInputShown=true' in result:
|
|
2363
|
+
# 键盘正在显示,按返回键收起
|
|
2364
|
+
self.client.u2.shell('input keyevent 4') # KEYCODE_BACK
|
|
2365
|
+
time.sleep(0.3)
|
|
2366
|
+
|
|
2367
|
+
# 验证键盘是否已收起
|
|
2368
|
+
shell_result_after = self.client.u2.shell('dumpsys input_method | grep mInputShown')
|
|
2369
|
+
result_after = shell_result_after.output if hasattr(shell_result_after, 'output') else str(shell_result_after)
|
|
2370
|
+
|
|
2371
|
+
if 'mInputShown=false' in result_after:
|
|
2372
|
+
return {"success": True, "message": "✅ 键盘已收起 (Android - back键)"}
|
|
2373
|
+
else:
|
|
2374
|
+
# 如果 back 键没效果,尝试点击空白区域
|
|
2375
|
+
info = self.client.u2.info
|
|
2376
|
+
height = info.get('displayHeight', 1920)
|
|
2377
|
+
width = info.get('displayWidth', 1080)
|
|
2378
|
+
# 点击标题栏区域
|
|
2379
|
+
self.client.u2.click(width // 2, 100)
|
|
2380
|
+
return {"success": True, "message": "✅ 键盘已收起 (Android - 点击空白区域)"}
|
|
2381
|
+
else:
|
|
2382
|
+
return {"success": True, "message": "💡 键盘未显示,无需收起"}
|
|
2383
|
+
except Exception as e:
|
|
2384
|
+
# 备用方案:直接按返回键
|
|
2385
|
+
self.client.u2.shell('input keyevent 4')
|
|
2386
|
+
return {"success": True, "message": f"✅ 键盘收起完成 (Android - back键,备用方案: {e})"}
|
|
2387
|
+
except Exception as e:
|
|
2388
|
+
return {"success": False, "message": f"❌ 收起键盘失败: {e}"}
|
|
2389
|
+
|
|
2313
2390
|
def wait(self, seconds: float) -> Dict:
|
|
2314
2391
|
"""等待指定时间"""
|
|
2315
2392
|
time.sleep(seconds)
|
|
@@ -594,6 +594,12 @@ class MobileMCPServer:
|
|
|
594
594
|
}
|
|
595
595
|
))
|
|
596
596
|
|
|
597
|
+
tools.append(Tool(
|
|
598
|
+
name="mobile_hide_keyboard",
|
|
599
|
+
description="⌨️ 收起键盘。【重要】输入密码后勾选协议前必须调用,确保复选框不被键盘遮挡。登录场景必备!",
|
|
600
|
+
inputSchema={"type": "object", "properties": {}, "required": []}
|
|
601
|
+
))
|
|
602
|
+
|
|
597
603
|
# ==================== 应用管理 ====================
|
|
598
604
|
tools.append(Tool(
|
|
599
605
|
name="mobile_launch_app",
|
|
@@ -1040,6 +1046,10 @@ class MobileMCPServer:
|
|
|
1040
1046
|
result = self.tools.wait(arguments["seconds"])
|
|
1041
1047
|
return [TextContent(type="text", text=self.format_response(result))]
|
|
1042
1048
|
|
|
1049
|
+
elif name == "mobile_hide_keyboard":
|
|
1050
|
+
result = await self.tools.hide_keyboard()
|
|
1051
|
+
return [TextContent(type="text", text=self.format_response(result))]
|
|
1052
|
+
|
|
1043
1053
|
# 应用管理
|
|
1044
1054
|
elif name == "mobile_launch_app":
|
|
1045
1055
|
result = await self.tools.launch_app(arguments["package_name"])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mobile-mcp-ai
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.12
|
|
4
4
|
Summary: 移动端自动化 MCP Server - 支持 Android/iOS,AI 功能可选(基础工具不需要 AI)
|
|
5
5
|
Home-page: https://github.com/test111ddff-hash/mobile-mcp-ai
|
|
6
6
|
Author: douzi
|
|
@@ -460,6 +460,7 @@ pip install pyautogui pyperclip pygetwindow
|
|
|
460
460
|
| 👆 | `mobile_swipe` | 滑动 |
|
|
461
461
|
| ⌨️ | `mobile_press_key` | 按键 |
|
|
462
462
|
| ⏱️ | `mobile_wait` | 等待 |
|
|
463
|
+
| ⌨️ | `mobile_hide_keyboard` | 收起键盘(登录场景必备) |
|
|
463
464
|
| 📦 | `mobile_launch_app` | 启动应用 |
|
|
464
465
|
| 📦 | `mobile_terminate_app` | 终止应用 |
|
|
465
466
|
| 📦 | `mobile_list_apps` | 列出应用 |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
mobile_mcp/__init__.py,sha256=sQJZTL_sxQFzmcS7jOtS2AHCfUySz40vhX96N6u1qy4,816
|
|
2
2
|
mobile_mcp/config.py,sha256=-xSl9vahp3EFAA97P1ahcnQC-HHAFvccGHpnFAXeKHU,5841
|
|
3
3
|
mobile_mcp/core/__init__.py,sha256=ndMy-cLAIsQDG5op7gM_AIplycqZSZPWEkec1pEhvEY,170
|
|
4
|
-
mobile_mcp/core/basic_tools_lite.py,sha256=
|
|
4
|
+
mobile_mcp/core/basic_tools_lite.py,sha256=iQtWjSkGEFGtJJ-pQrhJ3AedwyJ3Qj981tXs82xXZmI,237425
|
|
5
5
|
mobile_mcp/core/device_manager.py,sha256=xG5DoeNFs45pl-FTEhEWblqVwxtFK-FmVEGlNL6EqRI,8798
|
|
6
6
|
mobile_mcp/core/dynamic_config.py,sha256=Ja1n1pfb0HspGByqk2_A472mYVniKmGtNEWyjUjmgK8,9811
|
|
7
7
|
mobile_mcp/core/ios_client_wda.py,sha256=Nq9WxevhTWpVpolM-Ymp-b0nUQV3tXLFszmJHbDC4wA,18770
|
|
@@ -19,14 +19,14 @@ mobile_mcp/core/utils/logger.py,sha256=XXQAHUwT1jc70pq_tYFmL6f_nKrFlYm3hcgl-5RYR
|
|
|
19
19
|
mobile_mcp/core/utils/operation_history_manager.py,sha256=gi8S8HJAMqvkUrY7_-kVbko3Xt7c4GAUziEujRd-N-Y,4792
|
|
20
20
|
mobile_mcp/core/utils/smart_wait.py,sha256=N5wKTUYrNWPruBILqrAjpvtso8Z3GRWCfMIR_aZxPLg,8649
|
|
21
21
|
mobile_mcp/mcp_tools/__init__.py,sha256=xkro8Rwqv_55YlVyhh-3DgRFSsLE3h1r31VIb3bpM6E,143
|
|
22
|
-
mobile_mcp/mcp_tools/mcp_server.py,sha256=
|
|
22
|
+
mobile_mcp/mcp_tools/mcp_server.py,sha256=nstcZqFx43MUm-wrc6mZfXqbmWU9PpP9O7pJi_C1ePY,54936
|
|
23
23
|
mobile_mcp/utils/__init__.py,sha256=8EH0i7UGtx1y_j_GEgdN-cZdWn2sRtZSEOLlNF9HRnY,158
|
|
24
24
|
mobile_mcp/utils/logger.py,sha256=Sqq2Nr0Y4p03erqcrbYKVPCGiFaNGHMcE_JwCkeOfU4,3626
|
|
25
25
|
mobile_mcp/utils/xml_formatter.py,sha256=uwTRb3vLbqhT8O-udzWT7s7LsV-DyDUz2DkofD3hXOE,4556
|
|
26
26
|
mobile_mcp/utils/xml_parser.py,sha256=QhL8CWbdmNDzmBLjtx6mEnjHgMFZzJeHpCL15qfXSpI,3926
|
|
27
|
-
mobile_mcp_ai-2.7.
|
|
28
|
-
mobile_mcp_ai-2.7.
|
|
29
|
-
mobile_mcp_ai-2.7.
|
|
30
|
-
mobile_mcp_ai-2.7.
|
|
31
|
-
mobile_mcp_ai-2.7.
|
|
32
|
-
mobile_mcp_ai-2.7.
|
|
27
|
+
mobile_mcp_ai-2.7.12.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
|
28
|
+
mobile_mcp_ai-2.7.12.dist-info/METADATA,sha256=DF-5J-jSHnuS2xWWjEX1ky83sNuGB7c2-Ng09Nq_Ysc,11581
|
|
29
|
+
mobile_mcp_ai-2.7.12.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
30
|
+
mobile_mcp_ai-2.7.12.dist-info/entry_points.txt,sha256=KB_FglozgPHBprSM1vFbIzGyheFuHFmGanscRdMJ_8A,68
|
|
31
|
+
mobile_mcp_ai-2.7.12.dist-info/top_level.txt,sha256=lLm6YpbTv855Lbh8BIA0rPxhybIrvYUzMEk9OErHT94,11
|
|
32
|
+
mobile_mcp_ai-2.7.12.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|