@midscene/android 1.9.7 → 1.9.8-beta-20260618091332.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/cli.mjs +24 -8
- package/dist/es/index.mjs +23 -7
- package/dist/es/mcp-server.mjs +24 -8
- package/dist/lib/cli.js +24 -8
- package/dist/lib/index.js +23 -7
- package/dist/lib/mcp-server.js +24 -8
- package/dist/types/index.d.ts +10 -12
- package/dist/types/mcp-server.d.ts +10 -12
- package/package.json +4 -4
package/dist/es/cli.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import * as __rspack_external_node_module_ab9f2194 from "node:module";
|
|
|
4
4
|
import * as __rspack_external_node_path_c5b9b54f from "node:path";
|
|
5
5
|
import { createReportCliCommands, getMidsceneLocationSchema, z } from "@midscene/core";
|
|
6
6
|
import { reportCLIError, runToolsCLI } from "@midscene/shared/cli";
|
|
7
|
+
import { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature, shouldRebuildAgentForInitArgs } from "@midscene/shared/mcp/agent-behavior-init-args";
|
|
7
8
|
import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
|
|
8
9
|
import { Agent } from "@midscene/core/agent";
|
|
9
10
|
import { mergeAndNormalizeAppNameMapping, normalizeForComparison, repeat } from "@midscene/shared/utils";
|
|
@@ -1950,6 +1951,19 @@ function mcp_tools_define_property(obj, key, value) {
|
|
|
1950
1951
|
return obj;
|
|
1951
1952
|
}
|
|
1952
1953
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
1954
|
+
function adaptAndroidInitArgs(extracted) {
|
|
1955
|
+
if (!extracted) return;
|
|
1956
|
+
const initArgs = {
|
|
1957
|
+
...'string' == typeof extracted.deviceId ? {
|
|
1958
|
+
deviceId: extracted.deviceId
|
|
1959
|
+
} : {},
|
|
1960
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
1961
|
+
useScrcpy: extracted.useScrcpy
|
|
1962
|
+
} : {},
|
|
1963
|
+
...extractAgentBehaviorInitArgs(extracted) ?? {}
|
|
1964
|
+
};
|
|
1965
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
1966
|
+
}
|
|
1953
1967
|
class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
1954
1968
|
getCliReportSessionName() {
|
|
1955
1969
|
return 'midscene-android';
|
|
@@ -1959,7 +1973,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1959
1973
|
}
|
|
1960
1974
|
async ensureAgent(initArgs) {
|
|
1961
1975
|
const deviceId = initArgs?.deviceId;
|
|
1962
|
-
|
|
1976
|
+
const nextSignature = getAgentInitArgsSignature(initArgs);
|
|
1977
|
+
if (this.agent && shouldRebuildAgentForInitArgs(this.lastInitArgsSignature, nextSignature)) {
|
|
1963
1978
|
try {
|
|
1964
1979
|
await this.agent.destroy?.();
|
|
1965
1980
|
} catch (error) {
|
|
@@ -1972,6 +1987,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1972
1987
|
const reportOptions = this.readCliReportAgentOptions();
|
|
1973
1988
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
1974
1989
|
autoDismissKeyboard: false,
|
|
1990
|
+
...extractAgentBehaviorInitArgs(initArgs) ?? {},
|
|
1975
1991
|
...initArgs?.useScrcpy ? {
|
|
1976
1992
|
scrcpyConfig: {
|
|
1977
1993
|
enabled: true
|
|
@@ -1980,6 +1996,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1980
1996
|
...reportOptions ?? {}
|
|
1981
1997
|
});
|
|
1982
1998
|
this.agent = agent;
|
|
1999
|
+
this.lastInitArgsSignature = nextSignature;
|
|
1983
2000
|
return agent;
|
|
1984
2001
|
}
|
|
1985
2002
|
preparePlatformTools() {
|
|
@@ -2001,6 +2018,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2001
2018
|
debug('Failed to destroy agent during connect:', error);
|
|
2002
2019
|
}
|
|
2003
2020
|
this.agent = void 0;
|
|
2021
|
+
this.lastInitArgsSignature = void 0;
|
|
2004
2022
|
}
|
|
2005
2023
|
const agent = await this.ensureAgent(initArgs);
|
|
2006
2024
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2025,26 +2043,24 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2025
2043
|
];
|
|
2026
2044
|
}
|
|
2027
2045
|
constructor(...args){
|
|
2028
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2046
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2029
2047
|
namespace: 'android',
|
|
2030
2048
|
shape: {
|
|
2031
2049
|
deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2032
|
-
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2050
|
+
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2051
|
+
...agentBehaviorInitArgShape
|
|
2033
2052
|
},
|
|
2034
2053
|
cli: {
|
|
2035
2054
|
preferBareKeys: true
|
|
2036
2055
|
},
|
|
2037
|
-
adapt:
|
|
2038
|
-
deviceId: extracted?.deviceId,
|
|
2039
|
-
useScrcpy: extracted?.useScrcpy
|
|
2040
|
-
})
|
|
2056
|
+
adapt: adaptAndroidInitArgs
|
|
2041
2057
|
});
|
|
2042
2058
|
}
|
|
2043
2059
|
}
|
|
2044
2060
|
const tools = new AndroidMidsceneTools();
|
|
2045
2061
|
runToolsCLI(tools, 'midscene-android', {
|
|
2046
2062
|
stripPrefix: 'android_',
|
|
2047
|
-
version: "1.9.
|
|
2063
|
+
version: "1.9.8-beta-20260618091332.0",
|
|
2048
2064
|
extraCommands: createReportCliCommands()
|
|
2049
2065
|
}).catch((e)=>{
|
|
2050
2066
|
process.exit(reportCLIError(e));
|
package/dist/es/index.mjs
CHANGED
|
@@ -12,6 +12,7 @@ import { createImgBase64ByFormat, validateScreenshotBuffer } from "@midscene/sha
|
|
|
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 { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature, shouldRebuildAgentForInitArgs } from "@midscene/shared/mcp/agent-behavior-init-args";
|
|
15
16
|
import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
|
|
16
17
|
var __webpack_modules__ = {
|
|
17
18
|
"./src/scrcpy-manager.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
@@ -2016,6 +2017,19 @@ function mcp_tools_define_property(obj, key, value) {
|
|
|
2016
2017
|
return obj;
|
|
2017
2018
|
}
|
|
2018
2019
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
2020
|
+
function adaptAndroidInitArgs(extracted) {
|
|
2021
|
+
if (!extracted) return;
|
|
2022
|
+
const initArgs = {
|
|
2023
|
+
...'string' == typeof extracted.deviceId ? {
|
|
2024
|
+
deviceId: extracted.deviceId
|
|
2025
|
+
} : {},
|
|
2026
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
2027
|
+
useScrcpy: extracted.useScrcpy
|
|
2028
|
+
} : {},
|
|
2029
|
+
...extractAgentBehaviorInitArgs(extracted) ?? {}
|
|
2030
|
+
};
|
|
2031
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
2032
|
+
}
|
|
2019
2033
|
class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
2020
2034
|
getCliReportSessionName() {
|
|
2021
2035
|
return 'midscene-android';
|
|
@@ -2025,7 +2039,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2025
2039
|
}
|
|
2026
2040
|
async ensureAgent(initArgs) {
|
|
2027
2041
|
const deviceId = initArgs?.deviceId;
|
|
2028
|
-
|
|
2042
|
+
const nextSignature = getAgentInitArgsSignature(initArgs);
|
|
2043
|
+
if (this.agent && shouldRebuildAgentForInitArgs(this.lastInitArgsSignature, nextSignature)) {
|
|
2029
2044
|
try {
|
|
2030
2045
|
await this.agent.destroy?.();
|
|
2031
2046
|
} catch (error) {
|
|
@@ -2038,6 +2053,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2038
2053
|
const reportOptions = this.readCliReportAgentOptions();
|
|
2039
2054
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
2040
2055
|
autoDismissKeyboard: false,
|
|
2056
|
+
...extractAgentBehaviorInitArgs(initArgs) ?? {},
|
|
2041
2057
|
...initArgs?.useScrcpy ? {
|
|
2042
2058
|
scrcpyConfig: {
|
|
2043
2059
|
enabled: true
|
|
@@ -2046,6 +2062,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2046
2062
|
...reportOptions ?? {}
|
|
2047
2063
|
});
|
|
2048
2064
|
this.agent = agent;
|
|
2065
|
+
this.lastInitArgsSignature = nextSignature;
|
|
2049
2066
|
return agent;
|
|
2050
2067
|
}
|
|
2051
2068
|
preparePlatformTools() {
|
|
@@ -2067,6 +2084,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2067
2084
|
debug('Failed to destroy agent during connect:', error);
|
|
2068
2085
|
}
|
|
2069
2086
|
this.agent = void 0;
|
|
2087
|
+
this.lastInitArgsSignature = void 0;
|
|
2070
2088
|
}
|
|
2071
2089
|
const agent = await this.ensureAgent(initArgs);
|
|
2072
2090
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2091,19 +2109,17 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2091
2109
|
];
|
|
2092
2110
|
}
|
|
2093
2111
|
constructor(...args){
|
|
2094
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2112
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2095
2113
|
namespace: 'android',
|
|
2096
2114
|
shape: {
|
|
2097
2115
|
deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2098
|
-
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2116
|
+
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2117
|
+
...agentBehaviorInitArgShape
|
|
2099
2118
|
},
|
|
2100
2119
|
cli: {
|
|
2101
2120
|
preferBareKeys: true
|
|
2102
2121
|
},
|
|
2103
|
-
adapt:
|
|
2104
|
-
deviceId: extracted?.deviceId,
|
|
2105
|
-
useScrcpy: extracted?.useScrcpy
|
|
2106
|
-
})
|
|
2122
|
+
adapt: adaptAndroidInitArgs
|
|
2107
2123
|
});
|
|
2108
2124
|
}
|
|
2109
2125
|
}
|
package/dist/es/mcp-server.mjs
CHANGED
|
@@ -13,6 +13,7 @@ import { getTmpFile, sleep } from "@midscene/core/utils";
|
|
|
13
13
|
import { MIDSCENE_ADB_PATH, MIDSCENE_ADB_REMOTE_HOST, MIDSCENE_ADB_REMOTE_PORT, MIDSCENE_ANDROID_IME_STRATEGY, globalConfigManager } from "@midscene/shared/env";
|
|
14
14
|
import { createImgBase64ByFormat, validateScreenshotBuffer } from "@midscene/shared/img";
|
|
15
15
|
import { ADB as external_appium_adb_ADB } from "appium-adb";
|
|
16
|
+
import { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature, shouldRebuildAgentForInitArgs } from "@midscene/shared/mcp/agent-behavior-init-args";
|
|
16
17
|
import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
|
|
17
18
|
var __webpack_modules__ = {
|
|
18
19
|
"./src/scrcpy-manager.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
@@ -1950,6 +1951,19 @@ function mcp_tools_define_property(obj, key, value) {
|
|
|
1950
1951
|
return obj;
|
|
1951
1952
|
}
|
|
1952
1953
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
1954
|
+
function adaptAndroidInitArgs(extracted) {
|
|
1955
|
+
if (!extracted) return;
|
|
1956
|
+
const initArgs = {
|
|
1957
|
+
...'string' == typeof extracted.deviceId ? {
|
|
1958
|
+
deviceId: extracted.deviceId
|
|
1959
|
+
} : {},
|
|
1960
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
1961
|
+
useScrcpy: extracted.useScrcpy
|
|
1962
|
+
} : {},
|
|
1963
|
+
...extractAgentBehaviorInitArgs(extracted) ?? {}
|
|
1964
|
+
};
|
|
1965
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
1966
|
+
}
|
|
1953
1967
|
class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
1954
1968
|
getCliReportSessionName() {
|
|
1955
1969
|
return 'midscene-android';
|
|
@@ -1959,7 +1973,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1959
1973
|
}
|
|
1960
1974
|
async ensureAgent(initArgs) {
|
|
1961
1975
|
const deviceId = initArgs?.deviceId;
|
|
1962
|
-
|
|
1976
|
+
const nextSignature = getAgentInitArgsSignature(initArgs);
|
|
1977
|
+
if (this.agent && shouldRebuildAgentForInitArgs(this.lastInitArgsSignature, nextSignature)) {
|
|
1963
1978
|
try {
|
|
1964
1979
|
await this.agent.destroy?.();
|
|
1965
1980
|
} catch (error) {
|
|
@@ -1972,6 +1987,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1972
1987
|
const reportOptions = this.readCliReportAgentOptions();
|
|
1973
1988
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
1974
1989
|
autoDismissKeyboard: false,
|
|
1990
|
+
...extractAgentBehaviorInitArgs(initArgs) ?? {},
|
|
1975
1991
|
...initArgs?.useScrcpy ? {
|
|
1976
1992
|
scrcpyConfig: {
|
|
1977
1993
|
enabled: true
|
|
@@ -1980,6 +1996,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
1980
1996
|
...reportOptions ?? {}
|
|
1981
1997
|
});
|
|
1982
1998
|
this.agent = agent;
|
|
1999
|
+
this.lastInitArgsSignature = nextSignature;
|
|
1983
2000
|
return agent;
|
|
1984
2001
|
}
|
|
1985
2002
|
preparePlatformTools() {
|
|
@@ -2001,6 +2018,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2001
2018
|
debug('Failed to destroy agent during connect:', error);
|
|
2002
2019
|
}
|
|
2003
2020
|
this.agent = void 0;
|
|
2021
|
+
this.lastInitArgsSignature = void 0;
|
|
2004
2022
|
}
|
|
2005
2023
|
const agent = await this.ensureAgent(initArgs);
|
|
2006
2024
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2025,19 +2043,17 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
|
|
|
2025
2043
|
];
|
|
2026
2044
|
}
|
|
2027
2045
|
constructor(...args){
|
|
2028
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2046
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2029
2047
|
namespace: 'android',
|
|
2030
2048
|
shape: {
|
|
2031
2049
|
deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2032
|
-
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2050
|
+
useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2051
|
+
...agentBehaviorInitArgShape
|
|
2033
2052
|
},
|
|
2034
2053
|
cli: {
|
|
2035
2054
|
preferBareKeys: true
|
|
2036
2055
|
},
|
|
2037
|
-
adapt:
|
|
2038
|
-
deviceId: extracted?.deviceId,
|
|
2039
|
-
useScrcpy: extracted?.useScrcpy
|
|
2040
|
-
})
|
|
2056
|
+
adapt: adaptAndroidInitArgs
|
|
2041
2057
|
});
|
|
2042
2058
|
}
|
|
2043
2059
|
}
|
|
@@ -2048,7 +2064,7 @@ class AndroidMCPServer extends BaseMCPServer {
|
|
|
2048
2064
|
constructor(toolsManager){
|
|
2049
2065
|
super({
|
|
2050
2066
|
name: '@midscene/android-mcp',
|
|
2051
|
-
version: "1.9.
|
|
2067
|
+
version: "1.9.8-beta-20260618091332.0",
|
|
2052
2068
|
description: 'Control the Android device using natural language commands'
|
|
2053
2069
|
}, toolsManager);
|
|
2054
2070
|
}
|
package/dist/lib/cli.js
CHANGED
|
@@ -449,6 +449,7 @@ var __webpack_exports__ = {};
|
|
|
449
449
|
const core_namespaceObject = require("@midscene/core");
|
|
450
450
|
const cli_namespaceObject = require("@midscene/shared/cli");
|
|
451
451
|
var logger_ = __webpack_require__("@midscene/shared/logger");
|
|
452
|
+
const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
|
|
452
453
|
const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
|
|
453
454
|
const agent_namespaceObject = require("@midscene/core/agent");
|
|
454
455
|
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
@@ -1965,6 +1966,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1965
1966
|
return obj;
|
|
1966
1967
|
}
|
|
1967
1968
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
1969
|
+
function adaptAndroidInitArgs(extracted) {
|
|
1970
|
+
if (!extracted) return;
|
|
1971
|
+
const initArgs = {
|
|
1972
|
+
...'string' == typeof extracted.deviceId ? {
|
|
1973
|
+
deviceId: extracted.deviceId
|
|
1974
|
+
} : {},
|
|
1975
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
1976
|
+
useScrcpy: extracted.useScrcpy
|
|
1977
|
+
} : {},
|
|
1978
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
|
|
1979
|
+
};
|
|
1980
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
1981
|
+
}
|
|
1968
1982
|
class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
|
|
1969
1983
|
getCliReportSessionName() {
|
|
1970
1984
|
return 'midscene-android';
|
|
@@ -1974,7 +1988,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1974
1988
|
}
|
|
1975
1989
|
async ensureAgent(initArgs) {
|
|
1976
1990
|
const deviceId = initArgs?.deviceId;
|
|
1977
|
-
|
|
1991
|
+
const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
|
|
1992
|
+
if (this.agent && (0, agent_behavior_init_args_namespaceObject.shouldRebuildAgentForInitArgs)(this.lastInitArgsSignature, nextSignature)) {
|
|
1978
1993
|
try {
|
|
1979
1994
|
await this.agent.destroy?.();
|
|
1980
1995
|
} catch (error) {
|
|
@@ -1987,6 +2002,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1987
2002
|
const reportOptions = this.readCliReportAgentOptions();
|
|
1988
2003
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
1989
2004
|
autoDismissKeyboard: false,
|
|
2005
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
|
|
1990
2006
|
...initArgs?.useScrcpy ? {
|
|
1991
2007
|
scrcpyConfig: {
|
|
1992
2008
|
enabled: true
|
|
@@ -1995,6 +2011,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1995
2011
|
...reportOptions ?? {}
|
|
1996
2012
|
});
|
|
1997
2013
|
this.agent = agent;
|
|
2014
|
+
this.lastInitArgsSignature = nextSignature;
|
|
1998
2015
|
return agent;
|
|
1999
2016
|
}
|
|
2000
2017
|
preparePlatformTools() {
|
|
@@ -2016,6 +2033,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2016
2033
|
debug('Failed to destroy agent during connect:', error);
|
|
2017
2034
|
}
|
|
2018
2035
|
this.agent = void 0;
|
|
2036
|
+
this.lastInitArgsSignature = void 0;
|
|
2019
2037
|
}
|
|
2020
2038
|
const agent = await this.ensureAgent(initArgs);
|
|
2021
2039
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2040,26 +2058,24 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2040
2058
|
];
|
|
2041
2059
|
}
|
|
2042
2060
|
constructor(...args){
|
|
2043
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2061
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2044
2062
|
namespace: 'android',
|
|
2045
2063
|
shape: {
|
|
2046
2064
|
deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2047
|
-
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2065
|
+
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2066
|
+
...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
|
|
2048
2067
|
},
|
|
2049
2068
|
cli: {
|
|
2050
2069
|
preferBareKeys: true
|
|
2051
2070
|
},
|
|
2052
|
-
adapt:
|
|
2053
|
-
deviceId: extracted?.deviceId,
|
|
2054
|
-
useScrcpy: extracted?.useScrcpy
|
|
2055
|
-
})
|
|
2071
|
+
adapt: adaptAndroidInitArgs
|
|
2056
2072
|
});
|
|
2057
2073
|
}
|
|
2058
2074
|
}
|
|
2059
2075
|
const tools = new AndroidMidsceneTools();
|
|
2060
2076
|
(0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-android', {
|
|
2061
2077
|
stripPrefix: 'android_',
|
|
2062
|
-
version: "1.9.
|
|
2078
|
+
version: "1.9.8-beta-20260618091332.0",
|
|
2063
2079
|
extraCommands: (0, core_namespaceObject.createReportCliCommands)()
|
|
2064
2080
|
}).catch((e)=>{
|
|
2065
2081
|
process.exit((0, cli_namespaceObject.reportCLIError)(e));
|
package/dist/lib/index.js
CHANGED
|
@@ -2040,6 +2040,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2040
2040
|
await device.connect();
|
|
2041
2041
|
return new AndroidAgent(device, opts);
|
|
2042
2042
|
}
|
|
2043
|
+
const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
|
|
2043
2044
|
const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
|
|
2044
2045
|
function mcp_tools_define_property(obj, key, value) {
|
|
2045
2046
|
if (key in obj) Object.defineProperty(obj, key, {
|
|
@@ -2052,6 +2053,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2052
2053
|
return obj;
|
|
2053
2054
|
}
|
|
2054
2055
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
2056
|
+
function adaptAndroidInitArgs(extracted) {
|
|
2057
|
+
if (!extracted) return;
|
|
2058
|
+
const initArgs = {
|
|
2059
|
+
...'string' == typeof extracted.deviceId ? {
|
|
2060
|
+
deviceId: extracted.deviceId
|
|
2061
|
+
} : {},
|
|
2062
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
2063
|
+
useScrcpy: extracted.useScrcpy
|
|
2064
|
+
} : {},
|
|
2065
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
|
|
2066
|
+
};
|
|
2067
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
2068
|
+
}
|
|
2055
2069
|
class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
|
|
2056
2070
|
getCliReportSessionName() {
|
|
2057
2071
|
return 'midscene-android';
|
|
@@ -2061,7 +2075,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2061
2075
|
}
|
|
2062
2076
|
async ensureAgent(initArgs) {
|
|
2063
2077
|
const deviceId = initArgs?.deviceId;
|
|
2064
|
-
|
|
2078
|
+
const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
|
|
2079
|
+
if (this.agent && (0, agent_behavior_init_args_namespaceObject.shouldRebuildAgentForInitArgs)(this.lastInitArgsSignature, nextSignature)) {
|
|
2065
2080
|
try {
|
|
2066
2081
|
await this.agent.destroy?.();
|
|
2067
2082
|
} catch (error) {
|
|
@@ -2074,6 +2089,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2074
2089
|
const reportOptions = this.readCliReportAgentOptions();
|
|
2075
2090
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
2076
2091
|
autoDismissKeyboard: false,
|
|
2092
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
|
|
2077
2093
|
...initArgs?.useScrcpy ? {
|
|
2078
2094
|
scrcpyConfig: {
|
|
2079
2095
|
enabled: true
|
|
@@ -2082,6 +2098,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2082
2098
|
...reportOptions ?? {}
|
|
2083
2099
|
});
|
|
2084
2100
|
this.agent = agent;
|
|
2101
|
+
this.lastInitArgsSignature = nextSignature;
|
|
2085
2102
|
return agent;
|
|
2086
2103
|
}
|
|
2087
2104
|
preparePlatformTools() {
|
|
@@ -2103,6 +2120,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2103
2120
|
debug('Failed to destroy agent during connect:', error);
|
|
2104
2121
|
}
|
|
2105
2122
|
this.agent = void 0;
|
|
2123
|
+
this.lastInitArgsSignature = void 0;
|
|
2106
2124
|
}
|
|
2107
2125
|
const agent = await this.ensureAgent(initArgs);
|
|
2108
2126
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2127,19 +2145,17 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2127
2145
|
];
|
|
2128
2146
|
}
|
|
2129
2147
|
constructor(...args){
|
|
2130
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2148
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2131
2149
|
namespace: 'android',
|
|
2132
2150
|
shape: {
|
|
2133
2151
|
deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2134
|
-
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2152
|
+
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2153
|
+
...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
|
|
2135
2154
|
},
|
|
2136
2155
|
cli: {
|
|
2137
2156
|
preferBareKeys: true
|
|
2138
2157
|
},
|
|
2139
|
-
adapt:
|
|
2140
|
-
deviceId: extracted?.deviceId,
|
|
2141
|
-
useScrcpy: extracted?.useScrcpy
|
|
2142
|
-
})
|
|
2158
|
+
adapt: adaptAndroidInitArgs
|
|
2143
2159
|
});
|
|
2144
2160
|
}
|
|
2145
2161
|
}
|
package/dist/lib/mcp-server.js
CHANGED
|
@@ -1969,6 +1969,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1969
1969
|
await device.connect();
|
|
1970
1970
|
return new AndroidAgent(device, opts);
|
|
1971
1971
|
}
|
|
1972
|
+
const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
|
|
1972
1973
|
const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
|
|
1973
1974
|
function mcp_tools_define_property(obj, key, value) {
|
|
1974
1975
|
if (key in obj) Object.defineProperty(obj, key, {
|
|
@@ -1981,6 +1982,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1981
1982
|
return obj;
|
|
1982
1983
|
}
|
|
1983
1984
|
const debug = (0, logger_.getDebug)('mcp:android-tools');
|
|
1985
|
+
function adaptAndroidInitArgs(extracted) {
|
|
1986
|
+
if (!extracted) return;
|
|
1987
|
+
const initArgs = {
|
|
1988
|
+
...'string' == typeof extracted.deviceId ? {
|
|
1989
|
+
deviceId: extracted.deviceId
|
|
1990
|
+
} : {},
|
|
1991
|
+
...'boolean' == typeof extracted.useScrcpy ? {
|
|
1992
|
+
useScrcpy: extracted.useScrcpy
|
|
1993
|
+
} : {},
|
|
1994
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
|
|
1995
|
+
};
|
|
1996
|
+
return Object.keys(initArgs).length > 0 ? initArgs : void 0;
|
|
1997
|
+
}
|
|
1984
1998
|
class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
|
|
1985
1999
|
getCliReportSessionName() {
|
|
1986
2000
|
return 'midscene-android';
|
|
@@ -1990,7 +2004,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
1990
2004
|
}
|
|
1991
2005
|
async ensureAgent(initArgs) {
|
|
1992
2006
|
const deviceId = initArgs?.deviceId;
|
|
1993
|
-
|
|
2007
|
+
const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
|
|
2008
|
+
if (this.agent && (0, agent_behavior_init_args_namespaceObject.shouldRebuildAgentForInitArgs)(this.lastInitArgsSignature, nextSignature)) {
|
|
1994
2009
|
try {
|
|
1995
2010
|
await this.agent.destroy?.();
|
|
1996
2011
|
} catch (error) {
|
|
@@ -2003,6 +2018,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2003
2018
|
const reportOptions = this.readCliReportAgentOptions();
|
|
2004
2019
|
const agent = await agentFromAdbDevice(deviceId, {
|
|
2005
2020
|
autoDismissKeyboard: false,
|
|
2021
|
+
...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
|
|
2006
2022
|
...initArgs?.useScrcpy ? {
|
|
2007
2023
|
scrcpyConfig: {
|
|
2008
2024
|
enabled: true
|
|
@@ -2011,6 +2027,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2011
2027
|
...reportOptions ?? {}
|
|
2012
2028
|
});
|
|
2013
2029
|
this.agent = agent;
|
|
2030
|
+
this.lastInitArgsSignature = nextSignature;
|
|
2014
2031
|
return agent;
|
|
2015
2032
|
}
|
|
2016
2033
|
preparePlatformTools() {
|
|
@@ -2032,6 +2049,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2032
2049
|
debug('Failed to destroy agent during connect:', error);
|
|
2033
2050
|
}
|
|
2034
2051
|
this.agent = void 0;
|
|
2052
|
+
this.lastInitArgsSignature = void 0;
|
|
2035
2053
|
}
|
|
2036
2054
|
const agent = await this.ensureAgent(initArgs);
|
|
2037
2055
|
const screenshot = await agent.page.screenshotBase64();
|
|
@@ -2056,19 +2074,17 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2056
2074
|
];
|
|
2057
2075
|
}
|
|
2058
2076
|
constructor(...args){
|
|
2059
|
-
super(...args), mcp_tools_define_property(this, "initArgSpec", {
|
|
2077
|
+
super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
|
|
2060
2078
|
namespace: 'android',
|
|
2061
2079
|
shape: {
|
|
2062
2080
|
deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
|
|
2063
|
-
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
|
|
2081
|
+
useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
|
|
2082
|
+
...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
|
|
2064
2083
|
},
|
|
2065
2084
|
cli: {
|
|
2066
2085
|
preferBareKeys: true
|
|
2067
2086
|
},
|
|
2068
|
-
adapt:
|
|
2069
|
-
deviceId: extracted?.deviceId,
|
|
2070
|
-
useScrcpy: extracted?.useScrcpy
|
|
2071
|
-
})
|
|
2087
|
+
adapt: adaptAndroidInitArgs
|
|
2072
2088
|
});
|
|
2073
2089
|
}
|
|
2074
2090
|
}
|
|
@@ -2079,7 +2095,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
|
|
|
2079
2095
|
constructor(toolsManager){
|
|
2080
2096
|
super({
|
|
2081
2097
|
name: '@midscene/android-mcp',
|
|
2082
|
-
version: "1.9.
|
|
2098
|
+
version: "1.9.8-beta-20260618091332.0",
|
|
2083
2099
|
description: 'Control the Android device using natural language commands'
|
|
2084
2100
|
}, toolsManager);
|
|
2085
2101
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { ActionReturn } from '@midscene/core';
|
|
|
4
4
|
import { ADB } from 'appium-adb';
|
|
5
5
|
import type { Adb } from '@yume-chan/adb';
|
|
6
6
|
import { Agent } from '@midscene/core/agent';
|
|
7
|
+
import { AgentBehaviorInitArgs } from '@midscene/shared/mcp/agent-behavior-init-args';
|
|
7
8
|
import { AgentOpt } from '@midscene/core/agent';
|
|
8
9
|
import { AndroidDeviceInputOpt } from '@midscene/core/device';
|
|
9
10
|
import { AndroidDeviceOpt } from '@midscene/core/device';
|
|
@@ -234,24 +235,21 @@ export declare class AndroidDevice implements AbstractInterface {
|
|
|
234
235
|
hideKeyboard(options?: AndroidDeviceInputOpt, timeoutMs?: number): Promise<boolean>;
|
|
235
236
|
}
|
|
236
237
|
|
|
238
|
+
declare type AndroidInitArgs = AgentBehaviorInitArgs & {
|
|
239
|
+
deviceId?: string;
|
|
240
|
+
useScrcpy?: boolean;
|
|
241
|
+
};
|
|
242
|
+
|
|
237
243
|
/**
|
|
238
244
|
* Android-specific tools manager
|
|
239
245
|
* Extends BaseMidsceneTools to provide Android ADB device connection tools
|
|
240
246
|
*/
|
|
241
|
-
export declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, {
|
|
242
|
-
|
|
243
|
-
useScrcpy?: boolean;
|
|
244
|
-
}> {
|
|
247
|
+
export declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, AndroidInitArgs> {
|
|
248
|
+
private lastInitArgsSignature?;
|
|
245
249
|
protected getCliReportSessionName(): string;
|
|
246
|
-
protected readonly initArgSpec: InitArgSpec<
|
|
247
|
-
deviceId?: string;
|
|
248
|
-
useScrcpy?: boolean;
|
|
249
|
-
}>;
|
|
250
|
+
protected readonly initArgSpec: InitArgSpec<AndroidInitArgs>;
|
|
250
251
|
protected createTemporaryDevice(): AndroidDevice;
|
|
251
|
-
protected ensureAgent(initArgs?:
|
|
252
|
-
deviceId?: string;
|
|
253
|
-
useScrcpy?: boolean;
|
|
254
|
-
}): Promise<AndroidAgent>;
|
|
252
|
+
protected ensureAgent(initArgs?: AndroidInitArgs): Promise<AndroidAgent>;
|
|
255
253
|
/**
|
|
256
254
|
* Provide Android-specific platform tools
|
|
257
255
|
*/
|
|
@@ -3,6 +3,7 @@ import type { ActionParam } from '@midscene/core';
|
|
|
3
3
|
import type { ActionReturn } from '@midscene/core';
|
|
4
4
|
import { ADB } from 'appium-adb';
|
|
5
5
|
import { Agent } from '@midscene/core/agent';
|
|
6
|
+
import { AgentBehaviorInitArgs } from '@midscene/shared/mcp/agent-behavior-init-args';
|
|
6
7
|
import { AgentOpt } from '@midscene/core/agent';
|
|
7
8
|
import { AndroidDeviceInputOpt } from '@midscene/core/device';
|
|
8
9
|
import { AndroidDeviceOpt } from '@midscene/core/device';
|
|
@@ -226,6 +227,11 @@ declare class AndroidDevice implements AbstractInterface {
|
|
|
226
227
|
hideKeyboard(options?: AndroidDeviceInputOpt, timeoutMs?: number): Promise<boolean>;
|
|
227
228
|
}
|
|
228
229
|
|
|
230
|
+
declare type AndroidInitArgs = AgentBehaviorInitArgs & {
|
|
231
|
+
deviceId?: string;
|
|
232
|
+
useScrcpy?: boolean;
|
|
233
|
+
};
|
|
234
|
+
|
|
229
235
|
/**
|
|
230
236
|
* Android MCP Server
|
|
231
237
|
* Provides MCP tools for Android automation through ADB
|
|
@@ -239,20 +245,12 @@ export declare class AndroidMCPServer extends BaseMCPServer {
|
|
|
239
245
|
* Android-specific tools manager
|
|
240
246
|
* Extends BaseMidsceneTools to provide Android ADB device connection tools
|
|
241
247
|
*/
|
|
242
|
-
declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, {
|
|
243
|
-
|
|
244
|
-
useScrcpy?: boolean;
|
|
245
|
-
}> {
|
|
248
|
+
declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, AndroidInitArgs> {
|
|
249
|
+
private lastInitArgsSignature?;
|
|
246
250
|
protected getCliReportSessionName(): string;
|
|
247
|
-
protected readonly initArgSpec: InitArgSpec<
|
|
248
|
-
deviceId?: string;
|
|
249
|
-
useScrcpy?: boolean;
|
|
250
|
-
}>;
|
|
251
|
+
protected readonly initArgSpec: InitArgSpec<AndroidInitArgs>;
|
|
251
252
|
protected createTemporaryDevice(): AndroidDevice;
|
|
252
|
-
protected ensureAgent(initArgs?:
|
|
253
|
-
deviceId?: string;
|
|
254
|
-
useScrcpy?: boolean;
|
|
255
|
-
}): Promise<AndroidAgent>;
|
|
253
|
+
protected ensureAgent(initArgs?: AndroidInitArgs): Promise<AndroidAgent>;
|
|
256
254
|
/**
|
|
257
255
|
* Provide Android-specific platform tools
|
|
258
256
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midscene/android",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.8-beta-20260618091332.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/web-infra-dev/midscene.git",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"@yume-chan/stream-extra": "2.1.0",
|
|
47
47
|
"appium-adb": "12.12.1",
|
|
48
48
|
"sharp": "^0.34.3",
|
|
49
|
-
"@midscene/core": "1.9.
|
|
50
|
-
"@midscene/shared": "1.9.
|
|
49
|
+
"@midscene/core": "1.9.8-beta-20260618091332.0",
|
|
50
|
+
"@midscene/shared": "1.9.8-beta-20260618091332.0"
|
|
51
51
|
},
|
|
52
52
|
"optionalDependencies": {
|
|
53
53
|
"@ffmpeg-installer/ffmpeg": "^1.1.0"
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"undici": "^6.0.0",
|
|
62
62
|
"vitest": "3.0.5",
|
|
63
63
|
"zod": "^3.25.1",
|
|
64
|
-
"@midscene/playground": "1.9.
|
|
64
|
+
"@midscene/playground": "1.9.8-beta-20260618091332.0"
|
|
65
65
|
},
|
|
66
66
|
"license": "MIT",
|
|
67
67
|
"scripts": {
|