@midscene/android 1.5.3 → 1.5.4-beta-20260310030546.0

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.
package/dist/es/index.mjs CHANGED
@@ -12,6 +12,7 @@ import { createImgBase64ByFormat, isValidImageBuffer } from "@midscene/shared/im
12
12
  import { mergeAndNormalizeAppNameMapping, normalizeForComparison, repeat } from "@midscene/shared/utils";
13
13
  import { ADB } from "appium-adb";
14
14
  import { Agent } from "@midscene/core/agent";
15
+ import { BaseMidsceneTools } from "@midscene/shared/mcp";
15
16
  var __webpack_modules__ = {
16
17
  "./src/scrcpy-manager.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
17
18
  __webpack_require__.d(__webpack_exports__, {
@@ -1823,4 +1824,58 @@ async function agentFromAdbDevice(deviceId, opts) {
1823
1824
  await device.connect();
1824
1825
  return new AndroidAgent(device, opts);
1825
1826
  }
1826
- export { AndroidAgent, AndroidDevice, ScrcpyDeviceAdapter, agentFromAdbDevice, getConnectedDevices, overrideAIConfig };
1827
+ const debug = (0, logger_.getDebug)('mcp:android-tools');
1828
+ class AndroidMidsceneTools extends BaseMidsceneTools {
1829
+ createTemporaryDevice() {
1830
+ return new AndroidDevice('temp-for-action-space', {});
1831
+ }
1832
+ async ensureAgent(deviceId) {
1833
+ if (this.agent && deviceId) {
1834
+ try {
1835
+ await this.agent.destroy?.();
1836
+ } catch (error) {
1837
+ debug('Failed to destroy agent during cleanup:', error);
1838
+ }
1839
+ this.agent = void 0;
1840
+ }
1841
+ if (this.agent) return this.agent;
1842
+ debug('Creating Android agent with deviceId:', deviceId || 'auto-detect');
1843
+ const agent = await agentFromAdbDevice(deviceId, {
1844
+ autoDismissKeyboard: false
1845
+ });
1846
+ this.agent = agent;
1847
+ return agent;
1848
+ }
1849
+ preparePlatformTools() {
1850
+ return [
1851
+ {
1852
+ name: 'android_connect',
1853
+ description: 'Connect to Android device via ADB. If deviceId not provided, uses the first available device.',
1854
+ schema: {
1855
+ deviceId: z.string().optional().describe('Android device ID (from adb devices)')
1856
+ },
1857
+ handler: async ({ deviceId })=>{
1858
+ const agent = await this.ensureAgent(deviceId);
1859
+ const screenshot = await agent.page.screenshotBase64();
1860
+ return {
1861
+ content: [
1862
+ {
1863
+ type: 'text',
1864
+ text: `Connected to Android device${deviceId ? `: ${deviceId}` : ' (auto-detected)'}`
1865
+ },
1866
+ ...this.buildScreenshotContent(screenshot)
1867
+ ],
1868
+ isError: false
1869
+ };
1870
+ }
1871
+ },
1872
+ {
1873
+ name: 'android_disconnect',
1874
+ description: 'Disconnect from current Android device and release ADB resources',
1875
+ schema: {},
1876
+ handler: this.createDisconnectHandler('Android device')
1877
+ }
1878
+ ];
1879
+ }
1880
+ }
1881
+ export { AndroidAgent, AndroidDevice, AndroidMidsceneTools, ScrcpyDeviceAdapter, agentFromAdbDevice, getConnectedDevices, overrideAIConfig };
package/dist/lib/index.js CHANGED
@@ -458,6 +458,7 @@ var __webpack_exports__ = {};
458
458
  (()=>{
459
459
  __webpack_require__.r(__webpack_exports__);
460
460
  __webpack_require__.d(__webpack_exports__, {
461
+ AndroidMidsceneTools: ()=>AndroidMidsceneTools,
461
462
  getConnectedDevices: ()=>getConnectedDevices,
462
463
  overrideAIConfig: ()=>env_namespaceObject.overrideAIConfig,
463
464
  AndroidAgent: ()=>AndroidAgent,
@@ -1857,9 +1858,65 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1857
1858
  await device.connect();
1858
1859
  return new AndroidAgent(device, opts);
1859
1860
  }
1861
+ const mcp_namespaceObject = require("@midscene/shared/mcp");
1862
+ const debug = (0, logger_.getDebug)('mcp:android-tools');
1863
+ class AndroidMidsceneTools extends mcp_namespaceObject.BaseMidsceneTools {
1864
+ createTemporaryDevice() {
1865
+ return new AndroidDevice('temp-for-action-space', {});
1866
+ }
1867
+ async ensureAgent(deviceId) {
1868
+ if (this.agent && deviceId) {
1869
+ try {
1870
+ await this.agent.destroy?.();
1871
+ } catch (error) {
1872
+ debug('Failed to destroy agent during cleanup:', error);
1873
+ }
1874
+ this.agent = void 0;
1875
+ }
1876
+ if (this.agent) return this.agent;
1877
+ debug('Creating Android agent with deviceId:', deviceId || 'auto-detect');
1878
+ const agent = await agentFromAdbDevice(deviceId, {
1879
+ autoDismissKeyboard: false
1880
+ });
1881
+ this.agent = agent;
1882
+ return agent;
1883
+ }
1884
+ preparePlatformTools() {
1885
+ return [
1886
+ {
1887
+ name: 'android_connect',
1888
+ description: 'Connect to Android device via ADB. If deviceId not provided, uses the first available device.',
1889
+ schema: {
1890
+ deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)')
1891
+ },
1892
+ handler: async ({ deviceId })=>{
1893
+ const agent = await this.ensureAgent(deviceId);
1894
+ const screenshot = await agent.page.screenshotBase64();
1895
+ return {
1896
+ content: [
1897
+ {
1898
+ type: 'text',
1899
+ text: `Connected to Android device${deviceId ? `: ${deviceId}` : ' (auto-detected)'}`
1900
+ },
1901
+ ...this.buildScreenshotContent(screenshot)
1902
+ ],
1903
+ isError: false
1904
+ };
1905
+ }
1906
+ },
1907
+ {
1908
+ name: 'android_disconnect',
1909
+ description: 'Disconnect from current Android device and release ADB resources',
1910
+ schema: {},
1911
+ handler: this.createDisconnectHandler('Android device')
1912
+ }
1913
+ ];
1914
+ }
1915
+ }
1860
1916
  })();
1861
1917
  exports.AndroidAgent = __webpack_exports__.AndroidAgent;
1862
1918
  exports.AndroidDevice = __webpack_exports__.AndroidDevice;
1919
+ exports.AndroidMidsceneTools = __webpack_exports__.AndroidMidsceneTools;
1863
1920
  exports.ScrcpyDeviceAdapter = __webpack_exports__.ScrcpyDeviceAdapter;
1864
1921
  exports.agentFromAdbDevice = __webpack_exports__.agentFromAdbDevice;
1865
1922
  exports.getConnectedDevices = __webpack_exports__.getConnectedDevices;
@@ -1867,6 +1924,7 @@ exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
1867
1924
  for(var __rspack_i in __webpack_exports__)if (-1 === [
1868
1925
  "AndroidAgent",
1869
1926
  "AndroidDevice",
1927
+ "AndroidMidsceneTools",
1870
1928
  "ScrcpyDeviceAdapter",
1871
1929
  "agentFromAdbDevice",
1872
1930
  "getConnectedDevices",
@@ -7,6 +7,7 @@ import { Agent } from '@midscene/core/agent';
7
7
  import { AgentOpt } from '@midscene/core/agent';
8
8
  import { AndroidDeviceInputOpt } from '@midscene/core/device';
9
9
  import { AndroidDeviceOpt } from '@midscene/core/device';
10
+ import { BaseMidsceneTools } from '@midscene/shared/mcp';
10
11
  import { Device } from 'appium-adb';
11
12
  import { DeviceAction } from '@midscene/core';
12
13
  import type { ElementInfo } from '@midscene/shared/extractor';
@@ -14,6 +15,7 @@ import { InterfaceType } from '@midscene/core';
14
15
  import { overrideAIConfig } from '@midscene/shared/env';
15
16
  import { Point } from '@midscene/core';
16
17
  import { Size } from '@midscene/core';
18
+ import { ToolDefinition } from '@midscene/shared/mcp';
17
19
 
18
20
  declare type ActionArgs<T extends DeviceAction> = [ActionParam<T>] extends [undefined] ? [] : [ActionParam<T>];
19
21
 
@@ -212,6 +214,19 @@ export declare class AndroidDevice implements AbstractInterface {
212
214
  hideKeyboard(options?: AndroidDeviceInputOpt, timeoutMs?: number): Promise<boolean>;
213
215
  }
214
216
 
217
+ /**
218
+ * Android-specific tools manager
219
+ * Extends BaseMidsceneTools to provide Android ADB device connection tools
220
+ */
221
+ export declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent> {
222
+ protected createTemporaryDevice(): AndroidDevice;
223
+ protected ensureAgent(deviceId?: string): Promise<AndroidAgent>;
224
+ /**
225
+ * Provide Android-specific platform tools
226
+ */
227
+ protected preparePlatformTools(): ToolDefinition[];
228
+ }
229
+
215
230
  declare type DeviceActionAndroidBackButton = DeviceAction<undefined, void>;
216
231
 
217
232
  declare type DeviceActionAndroidHomeButton = DeviceAction<undefined, void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/android",
3
- "version": "1.5.3",
3
+ "version": "1.5.4-beta-20260310030546.0",
4
4
  "description": "Android automation library for Midscene",
5
5
  "keywords": [
6
6
  "Android UI automation",
@@ -41,8 +41,8 @@
41
41
  "@yume-chan/stream-extra": "^1.0.0",
42
42
  "appium-adb": "12.12.1",
43
43
  "sharp": "^0.34.3",
44
- "@midscene/core": "1.5.3",
45
- "@midscene/shared": "1.5.3"
44
+ "@midscene/core": "1.5.4-beta-20260310030546.0",
45
+ "@midscene/shared": "1.5.4-beta-20260310030546.0"
46
46
  },
47
47
  "optionalDependencies": {
48
48
  "@ffmpeg-installer/ffmpeg": "^1.1.0"
@@ -56,7 +56,7 @@
56
56
  "tsx": "^4.19.2",
57
57
  "vitest": "3.0.5",
58
58
  "zod": "3.24.3",
59
- "@midscene/playground": "1.5.3"
59
+ "@midscene/playground": "1.5.4-beta-20260310030546.0"
60
60
  },
61
61
  "license": "MIT",
62
62
  "scripts": {