appium-mcp 1.86.7 → 1.86.9

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/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [1.86.9](https://github.com/appium/appium-mcp/compare/v1.86.8...v1.86.9) (2026-06-30)
2
+
3
+ ## [1.86.8](https://github.com/appium/appium-mcp/compare/v1.86.7...v1.86.8) (2026-06-30)
4
+
1
5
  ## [1.86.7](https://github.com/appium/appium-mcp/compare/v1.86.6...v1.86.7) (2026-06-29)
2
6
 
3
7
  ## [1.86.6](https://github.com/appium/appium-mcp/compare/v1.86.5...v1.86.6) (2026-06-29)
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-ios-simulator.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-simulator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AA+btD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsCjE"}
1
+ {"version":3,"file":"prepare-ios-simulator.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-simulator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAwftD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsCjE"}
@@ -7,6 +7,7 @@ import { Simctl } from 'node-simctl';
7
7
  import { IOSManager } from '../../devicemanager/ios-manager.js';
8
8
  import log from '../../logger.js';
9
9
  import { textResult } from '../tool-response.js';
10
+ import { findFreePort, releaseReservedPort } from '../../utils/ports.js';
10
11
  import { resolveAppiumMcpCachePath } from '../../utils/paths.js';
11
12
  async function fileExists(filePath) {
12
13
  return await fs.hasAccess(filePath);
@@ -65,8 +66,39 @@ async function getLatestWDAVersionFromCache() {
65
66
  async function installAppOnSimulator(appPath, simulatorUdid) {
66
67
  await exec('xcrun', ['simctl', 'install', simulatorUdid, appPath]);
67
68
  }
68
- async function launchAppOnSimulator(bundleId, simulatorUdid) {
69
- await exec('xcrun', ['simctl', 'launch', simulatorUdid, bundleId]);
69
+ async function launchAppOnSimulator(bundleId, simulatorUdid, wdaPort) {
70
+ // simctl forwards env vars prefixed with SIMCTL_CHILD_ to the launched app.
71
+ // WDA reads USE_PORT to choose which local port to listen on inside the
72
+ // simulator, so each simulator's WDA can run on its own port instead of all
73
+ // colliding on the default 8100.
74
+ await exec('xcrun', ['simctl', 'launch', simulatorUdid, bundleId], {
75
+ env: { ...process.env, SIMCTL_CHILD_USE_PORT: String(wdaPort) },
76
+ });
77
+ }
78
+ async function terminateAppOnSimulator(bundleId, simulatorUdid) {
79
+ try {
80
+ await exec('xcrun', ['simctl', 'terminate', simulatorUdid, bundleId]);
81
+ }
82
+ catch {
83
+ // Nothing running to terminate — ignore.
84
+ }
85
+ }
86
+ /** Poll WDA's /status until it responds or the attempt budget is exhausted. */
87
+ async function waitForWdaReady(port) {
88
+ const url = `http://127.0.0.1:${port}/status`;
89
+ for (let attempt = 0; attempt < 30; attempt++) {
90
+ try {
91
+ const res = await fetch(url, { signal: AbortSignal.timeout(2000) });
92
+ if (res.ok) {
93
+ return true;
94
+ }
95
+ }
96
+ catch {
97
+ // Not up yet — retry.
98
+ }
99
+ await new Promise((resolve) => setTimeout(resolve, 1000));
100
+ }
101
+ return false;
70
102
  }
71
103
  async function getAppBundleId(appPath) {
72
104
  const manifest = (await plist.parsePlistFile(path.join(appPath, 'Info.plist')));
@@ -190,29 +222,47 @@ async function resolveWdaAppPath(forceRefreshWda, platform = 'ios') {
190
222
  async function installWdaStep(result, udid, wdaAppPath) {
191
223
  try {
192
224
  const wdaState = await getWDAState(udid);
193
- // Check if already running
225
+ const bundleId = await getAppBundleId(wdaAppPath);
226
+ // Install if not already installed.
227
+ if (!wdaState.installed) {
228
+ log.info(`Installing WDA on simulator ${udid}...`);
229
+ await installAppOnSimulator(wdaAppPath, udid);
230
+ }
231
+ // XCUITest won't reuse a WDA it didn't start (its connection factory needs
232
+ // wdaLocalPort free), so the session connects to this instance via the
233
+ // returned webDriverAgentUrl instead. Launch on a freshly allocated port so
234
+ // each simulator gets its own — terminate any prior instance first so the
235
+ // port we report is the one actually serving.
194
236
  if (wdaState.running) {
237
+ log.info(`Terminating existing WDA (${bundleId}) before relaunch...`);
238
+ await terminateAppOnSimulator(bundleId, udid);
239
+ }
240
+ const wdaPort = await findFreePort();
241
+ let ready = false;
242
+ try {
243
+ log.info(`Launching WDA (${bundleId}) on port ${wdaPort}...`);
244
+ await launchAppOnSimulator(bundleId, udid, wdaPort);
245
+ ready = await waitForWdaReady(wdaPort);
246
+ }
247
+ finally {
248
+ // Once WDA has bound the port the OS guards it; on failure it's free again.
249
+ // Either way the reservation has served its purpose — release it.
250
+ releaseReservedPort(wdaPort);
251
+ }
252
+ if (!ready) {
195
253
  result.wda_install = {
196
- status: 'skipped',
197
- detail: 'WDA is already running on the simulator',
254
+ status: 'failed',
255
+ detail: `WDA launched on port ${wdaPort} but did not become ready`,
198
256
  };
199
- result.ready = true;
200
257
  return;
201
258
  }
202
- // Install if not already installed
203
- if (!wdaState.installed) {
204
- log.info(`Installing WDA on simulator ${udid}...`);
205
- await installAppOnSimulator(wdaAppPath, udid);
206
- }
207
- // Launch
208
- const bundleId = await getAppBundleId(wdaAppPath);
209
- log.info(`Launching WDA with bundle ID: ${bundleId}`);
210
- await launchAppOnSimulator(bundleId, udid);
259
+ const webDriverAgentUrl = `http://127.0.0.1:${wdaPort}`;
260
+ result.wdaLocalPort = wdaPort;
261
+ result.webDriverAgentUrl = webDriverAgentUrl;
262
+ result.capabilitiesHint = { 'appium:webDriverAgentUrl': webDriverAgentUrl };
211
263
  result.wda_install = {
212
264
  status: 'completed',
213
- detail: wdaState.installed
214
- ? `WDA already installed, launched (${bundleId})`
215
- : `WDA installed and launched (${bundleId})`,
265
+ detail: `WDA ${wdaState.installed ? 'already installed, ' : ''}launched and ready on ${webDriverAgentUrl}`,
216
266
  };
217
267
  result.ready = true;
218
268
  }
@@ -327,7 +377,7 @@ const prepareIosSimulatorSchema = z.object({
327
377
  export default function prepareIosSimulator(server) {
328
378
  server.addTool({
329
379
  name: 'prepare_ios_simulator',
330
- description: 'Prepare an iOS/tvOS simulator for Appium testing in a single call. Automatically boots the simulator, downloads prebuilt WDA (if not cached), and installs/launches WDA. Each step is skipped if already satisfied. Use skipWda=true to only boot without WDA. Set APPIUM_MCP_WDA_APP_PATH to an absolute path to a pre-extracted WebDriverAgentRunner-Runner.app to skip download entirely (useful in environments where external downloads are blocked).',
380
+ description: 'Prepare an iOS/tvOS simulator for Appium testing in a single call. Automatically boots the simulator, downloads prebuilt WDA (if not cached), and installs/launches WDA on a free per-simulator port (so multiple simulators can run in parallel without colliding on the default 8100). Pass the returned capabilitiesHint (appium:webDriverAgentUrl) to appium_session_management (action=create) so the session reuses this running WDA instead of trying to start its own. Use skipWda=true to only boot without WDA. Set APPIUM_MCP_WDA_APP_PATH to an absolute path to a pre-extracted WebDriverAgentRunner-Runner.app to skip download entirely (useful in environments where external downloads are blocked).',
331
381
  parameters: prepareIosSimulatorSchema,
332
382
  annotations: {
333
383
  readOnlyHint: false,
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-ios-simulator.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-simulator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prepare-ios-simulator.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-simulator.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,23 @@ interface Capabilities {
18
18
  * Remove empty string values from capabilities object
19
19
  */
20
20
  export declare function filterEmptyCapabilities(capabilities: Capabilities): Capabilities;
21
+ /**
22
+ * Auto-allocate driver ports for an embedded (local) session.
23
+ *
24
+ * Purely additive: only fills a port capability the caller (config or custom
25
+ * caps) hasn't already set, so any explicitly provided value is preserved. This
26
+ * keeps concurrent embedded sessions from binding the drivers' shared default
27
+ * ports. No-op for remote sessions, where ports belong to the remote host.
28
+ *
29
+ * Returns the capabilities plus the list of ports this call reserved, so the
30
+ * caller can release them via {@link releaseReservedPorts} once session creation
31
+ * settles (the reservation only needs to guard the creation window). Caller-set
32
+ * ports are not in `allocatedPorts` — they were never reserved by us.
33
+ */
34
+ export declare function assignEmbeddedDriverPorts(platform: 'android' | 'ios', capabilities: Capabilities): Promise<{
35
+ capabilities: Capabilities;
36
+ allocatedPorts: number[];
37
+ }>;
21
38
  /**
22
39
  * Build Android capabilities by merging defaults, config, device selection, and custom capabilities
23
40
  */
@@ -1 +1 @@
1
- {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAepD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,wCAAyC,CAAC;AAG5E,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AASD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,GACzB,YAAY,CAQd;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,YAAY,CAwCd;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,EAChD,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,GAAG,SAAS,CAe3B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAKN;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,aAAa,CAAC,CAmIzB;AA+FD,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgBpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,wCAAyC,CAAC;AAG5E,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AASD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,GACzB,YAAY,CAQd;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,SAAS,GAAG,KAAK,EAC3B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6BnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,YAAY,CAwCd;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,EAChD,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,GAAG,SAAS,CAe3B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAKN;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,aAAa,CAAC,CA+IzB;AA+FD,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { fs } from '@appium/support';
2
2
  import { URL } from 'node:url';
3
3
  import { getPortFromUrl } from '../../utils/url.js';
4
+ import { findFreePort, releaseReservedPorts } from '../../utils/ports.js';
4
5
  import { AndroidUiautomator2Driver } from 'appium-uiautomator2-driver';
5
6
  import { XCUITestDriver } from 'appium-xcuitest-driver';
6
7
  import { setSession, listSessions } from '../../session-store.js';
@@ -30,6 +31,58 @@ export function filterEmptyCapabilities(capabilities) {
30
31
  });
31
32
  return filtered;
32
33
  }
34
+ /**
35
+ * Driver port capabilities to auto-allocate per platform for embedded sessions.
36
+ *
37
+ * Each embedded Appium driver defaults these to a fixed port (Android
38
+ * `systemPort` 8200 / `mjpegServerPort` 7810, iOS `wdaLocalPort` 8100), so two
39
+ * sessions created in the same process collide unless they get distinct ports.
40
+ * Remote callers can't pick free ports on the host, so we must do it server-side
41
+ * where the drivers actually run.
42
+ */
43
+ const EMBEDDED_PORT_CAPABILITIES = {
44
+ android: ['appium:systemPort', 'appium:mjpegServerPort'],
45
+ ios: ['appium:wdaLocalPort', 'appium:mjpegServerPort'],
46
+ };
47
+ /**
48
+ * Auto-allocate driver ports for an embedded (local) session.
49
+ *
50
+ * Purely additive: only fills a port capability the caller (config or custom
51
+ * caps) hasn't already set, so any explicitly provided value is preserved. This
52
+ * keeps concurrent embedded sessions from binding the drivers' shared default
53
+ * ports. No-op for remote sessions, where ports belong to the remote host.
54
+ *
55
+ * Returns the capabilities plus the list of ports this call reserved, so the
56
+ * caller can release them via {@link releaseReservedPorts} once session creation
57
+ * settles (the reservation only needs to guard the creation window). Caller-set
58
+ * ports are not in `allocatedPorts` — they were never reserved by us.
59
+ */
60
+ export async function assignEmbeddedDriverPorts(platform, capabilities) {
61
+ const result = { ...capabilities };
62
+ const allocatedPorts = [];
63
+ // When the session points at an externally-managed WDA (e.g. a simulator's
64
+ // WDA already launched by prepare_ios_simulator), that WDA owns its ports.
65
+ // wdaLocalPort/mjpegServerPort would be ignored, so don't reserve them.
66
+ if (platform === 'ios' && result['appium:webDriverAgentUrl']) {
67
+ return { capabilities: result, allocatedPorts };
68
+ }
69
+ try {
70
+ for (const cap of EMBEDDED_PORT_CAPABILITIES[platform]) {
71
+ if (result[cap] == null || result[cap] === '') {
72
+ const port = await findFreePort();
73
+ result[cap] = port;
74
+ allocatedPorts.push(port);
75
+ log.debug(`Auto-allocated ${cap}=${port} for embedded ${platform} session`);
76
+ }
77
+ }
78
+ return { capabilities: result, allocatedPorts };
79
+ }
80
+ catch (err) {
81
+ // If we reserved any ports before failing, release them to avoid leaking.
82
+ releaseReservedPorts(allocatedPorts);
83
+ throw err;
84
+ }
85
+ }
33
86
  /**
34
87
  * Build Android capabilities by merging defaults, config, device selection, and custom capabilities
35
88
  */
@@ -247,9 +300,19 @@ export async function createSessionAction(args) {
247
300
  if (platform === 'general') {
248
301
  return errorResult('platform=general requires remoteServerUrl.');
249
302
  }
303
+ const allocation = await assignEmbeddedDriverPorts(platform, finalCapabilities);
304
+ finalCapabilities = allocation.capabilities;
250
305
  const driver = createDriverForPlatform(platform);
251
306
  log.info(`Sending session with ${driver.constructor.name}`);
252
- sessionId = await createDriverSession(driver, finalCapabilities);
307
+ try {
308
+ sessionId = await createDriverSession(driver, finalCapabilities);
309
+ }
310
+ finally {
311
+ // Release the reservations now that creation has settled: on success
312
+ // Appium has bound the ports (the OS prevents reuse); on failure they're
313
+ // free again. Either way the creation window they guarded is over.
314
+ releaseReservedPorts(allocation.allocatedPorts);
315
+ }
253
316
  await setSession(driver, sessionId, finalCapabilities, 'owned');
254
317
  }
255
318
  const sessionIdStr = typeof sessionId === 'string'
@@ -1 +1 @@
1
- {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Allocate a free TCP port that has not already been handed out by this process.
3
+ *
4
+ * Used to assign driver ports (e.g. `systemPort`, `wdaLocalPort`,
5
+ * `mjpegServerPort`) for embedded sessions so that parallel sessions running in
6
+ * the same MCP process don't collide on the drivers' fixed default ports.
7
+ *
8
+ * @param maxAttempts - How many times to retry if the OS hands back a port we
9
+ * have already reserved for another session.
10
+ */
11
+ export declare function findFreePort(maxAttempts?: number): Promise<number>;
12
+ /**
13
+ * Release a port previously reserved by {@link findFreePort} so it can be reused.
14
+ *
15
+ * Call this once session creation settles: on success the driver has bound the
16
+ * port (the OS itself now prevents reuse), and on failure the port is genuinely
17
+ * free again — either way the reservation has served its only purpose of guarding
18
+ * the creation window, and keeping it would leak the entry and waste the port.
19
+ */
20
+ export declare function releaseReservedPort(port: number): void;
21
+ /** Release several reserved ports at once (see {@link releaseReservedPort}). */
22
+ export declare function releaseReservedPorts(ports: Iterable<number>): void;
23
+ /** Snapshot of currently-reserved ports — for diagnostics and tests. */
24
+ export declare function reservedPortCount(): number;
25
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/utils/ports.ts"],"names":[],"mappings":"AAsCA;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,WAAW,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAIlE;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,78 @@
1
+ import net from 'node:net';
2
+ /**
3
+ * Ports handed out by {@link findFreePort} during the lifetime of this process.
4
+ *
5
+ * Binding to port 0 asks the OS for a free port, but the OS releases it the
6
+ * instant we close the probe socket. Two session creations running in parallel
7
+ * can therefore be assigned the same "free" port before either driver actually
8
+ * binds it. Tracking what we've already handed out lets concurrent embedded
9
+ * sessions get distinct ports even within that race window.
10
+ */
11
+ const reservedPorts = new Set();
12
+ /**
13
+ * Ask the OS for a currently-free TCP port by binding to port 0 on loopback.
14
+ */
15
+ function probeEphemeralPort() {
16
+ return new Promise((resolve, reject) => {
17
+ const server = net.createServer();
18
+ server.unref();
19
+ server.once('error', reject);
20
+ server.listen(0, '127.0.0.1', () => {
21
+ const address = server.address();
22
+ const port = address && typeof address === 'object' ? address.port : undefined;
23
+ server.close((closeErr) => {
24
+ if (closeErr) {
25
+ reject(closeErr);
26
+ }
27
+ else if (!port) {
28
+ reject(new Error('Failed to determine a free port'));
29
+ }
30
+ else {
31
+ resolve(port);
32
+ }
33
+ });
34
+ });
35
+ });
36
+ }
37
+ /**
38
+ * Allocate a free TCP port that has not already been handed out by this process.
39
+ *
40
+ * Used to assign driver ports (e.g. `systemPort`, `wdaLocalPort`,
41
+ * `mjpegServerPort`) for embedded sessions so that parallel sessions running in
42
+ * the same MCP process don't collide on the drivers' fixed default ports.
43
+ *
44
+ * @param maxAttempts - How many times to retry if the OS hands back a port we
45
+ * have already reserved for another session.
46
+ */
47
+ export async function findFreePort(maxAttempts = 50) {
48
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
49
+ const port = await probeEphemeralPort();
50
+ if (!reservedPorts.has(port)) {
51
+ reservedPorts.add(port);
52
+ return port;
53
+ }
54
+ }
55
+ throw new Error(`Unable to allocate a free port after ${maxAttempts} attempts`);
56
+ }
57
+ /**
58
+ * Release a port previously reserved by {@link findFreePort} so it can be reused.
59
+ *
60
+ * Call this once session creation settles: on success the driver has bound the
61
+ * port (the OS itself now prevents reuse), and on failure the port is genuinely
62
+ * free again — either way the reservation has served its only purpose of guarding
63
+ * the creation window, and keeping it would leak the entry and waste the port.
64
+ */
65
+ export function releaseReservedPort(port) {
66
+ reservedPorts.delete(port);
67
+ }
68
+ /** Release several reserved ports at once (see {@link releaseReservedPort}). */
69
+ export function releaseReservedPorts(ports) {
70
+ for (const port of ports) {
71
+ reservedPorts.delete(port);
72
+ }
73
+ }
74
+ /** Snapshot of currently-reserved ports — for diagnostics and tests. */
75
+ export function reservedPortCount() {
76
+ return reservedPorts.size;
77
+ }
78
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/utils/ports.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;AAExC;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GACR,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACxB,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;qBAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAW,GAAG,EAAE;IACjD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,wCAAwC,WAAW,WAAW,CAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,KAAuB;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "appium-mcp",
3
3
  "mcpName": "io.github.appium/appium-mcp",
4
- "version": "1.86.7",
4
+ "version": "1.86.9",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
package/server.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "name": "io.github.appium/appium-mcp",
4
4
  "title": "MCP Appium - Mobile Development and Automation Server",
5
5
  "description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
6
- "version": "1.86.7",
6
+ "version": "1.86.9",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "appium-mcp",
11
- "version": "1.86.7",
11
+ "version": "1.86.9",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  }
@@ -13,6 +13,7 @@ import { Simctl } from 'node-simctl';
13
13
  import { IOSManager } from '../../devicemanager/ios-manager.js';
14
14
  import log from '../../logger.js';
15
15
  import { textResult } from '../tool-response.js';
16
+ import { findFreePort, releaseReservedPort } from '../../utils/ports.js';
16
17
  import { resolveAppiumMcpCachePath } from '../../utils/paths.js';
17
18
 
18
19
  type StepStatus = 'completed' | 'skipped' | 'failed';
@@ -29,6 +30,9 @@ interface PrepareResult {
29
30
  ready: boolean;
30
31
  udid: string;
31
32
  wdaAppPath?: string;
33
+ wdaLocalPort?: number;
34
+ webDriverAgentUrl?: string;
35
+ capabilitiesHint?: Record<string, any>;
32
36
  }
33
37
 
34
38
  // ── Filesystem helpers ──
@@ -119,10 +123,45 @@ async function installAppOnSimulator(
119
123
  }
120
124
 
121
125
  async function launchAppOnSimulator(
126
+ bundleId: string,
127
+ simulatorUdid: string,
128
+ wdaPort: number
129
+ ): Promise<void> {
130
+ // simctl forwards env vars prefixed with SIMCTL_CHILD_ to the launched app.
131
+ // WDA reads USE_PORT to choose which local port to listen on inside the
132
+ // simulator, so each simulator's WDA can run on its own port instead of all
133
+ // colliding on the default 8100.
134
+ await exec('xcrun', ['simctl', 'launch', simulatorUdid, bundleId], {
135
+ env: { ...process.env, SIMCTL_CHILD_USE_PORT: String(wdaPort) },
136
+ });
137
+ }
138
+
139
+ async function terminateAppOnSimulator(
122
140
  bundleId: string,
123
141
  simulatorUdid: string
124
142
  ): Promise<void> {
125
- await exec('xcrun', ['simctl', 'launch', simulatorUdid, bundleId]);
143
+ try {
144
+ await exec('xcrun', ['simctl', 'terminate', simulatorUdid, bundleId]);
145
+ } catch {
146
+ // Nothing running to terminate — ignore.
147
+ }
148
+ }
149
+
150
+ /** Poll WDA's /status until it responds or the attempt budget is exhausted. */
151
+ async function waitForWdaReady(port: number): Promise<boolean> {
152
+ const url = `http://127.0.0.1:${port}/status`;
153
+ for (let attempt = 0; attempt < 30; attempt++) {
154
+ try {
155
+ const res = await fetch(url, { signal: AbortSignal.timeout(2000) });
156
+ if (res.ok) {
157
+ return true;
158
+ }
159
+ } catch {
160
+ // Not up yet — retry.
161
+ }
162
+ await new Promise((resolve) => setTimeout(resolve, 1000));
163
+ }
164
+ return false;
126
165
  }
127
166
 
128
167
  async function getAppBundleId(appPath: string): Promise<string> {
@@ -294,33 +333,51 @@ async function installWdaStep(
294
333
  ): Promise<void> {
295
334
  try {
296
335
  const wdaState = await getWDAState(udid);
336
+ const bundleId = await getAppBundleId(wdaAppPath);
297
337
 
298
- // Check if already running
299
- if (wdaState.running) {
300
- result.wda_install = {
301
- status: 'skipped',
302
- detail: 'WDA is already running on the simulator',
303
- };
304
- result.ready = true;
305
- return;
306
- }
307
-
308
- // Install if not already installed
338
+ // Install if not already installed.
309
339
  if (!wdaState.installed) {
310
340
  log.info(`Installing WDA on simulator ${udid}...`);
311
341
  await installAppOnSimulator(wdaAppPath, udid);
312
342
  }
313
343
 
314
- // Launch
315
- const bundleId = await getAppBundleId(wdaAppPath);
316
- log.info(`Launching WDA with bundle ID: ${bundleId}`);
317
- await launchAppOnSimulator(bundleId, udid);
344
+ // XCUITest won't reuse a WDA it didn't start (its connection factory needs
345
+ // wdaLocalPort free), so the session connects to this instance via the
346
+ // returned webDriverAgentUrl instead. Launch on a freshly allocated port so
347
+ // each simulator gets its own — terminate any prior instance first so the
348
+ // port we report is the one actually serving.
349
+ if (wdaState.running) {
350
+ log.info(`Terminating existing WDA (${bundleId}) before relaunch...`);
351
+ await terminateAppOnSimulator(bundleId, udid);
352
+ }
353
+
354
+ const wdaPort = await findFreePort();
355
+ let ready = false;
356
+ try {
357
+ log.info(`Launching WDA (${bundleId}) on port ${wdaPort}...`);
358
+ await launchAppOnSimulator(bundleId, udid, wdaPort);
359
+ ready = await waitForWdaReady(wdaPort);
360
+ } finally {
361
+ // Once WDA has bound the port the OS guards it; on failure it's free again.
362
+ // Either way the reservation has served its purpose — release it.
363
+ releaseReservedPort(wdaPort);
364
+ }
365
+
366
+ if (!ready) {
367
+ result.wda_install = {
368
+ status: 'failed',
369
+ detail: `WDA launched on port ${wdaPort} but did not become ready`,
370
+ };
371
+ return;
372
+ }
318
373
 
374
+ const webDriverAgentUrl = `http://127.0.0.1:${wdaPort}`;
375
+ result.wdaLocalPort = wdaPort;
376
+ result.webDriverAgentUrl = webDriverAgentUrl;
377
+ result.capabilitiesHint = { 'appium:webDriverAgentUrl': webDriverAgentUrl };
319
378
  result.wda_install = {
320
379
  status: 'completed',
321
- detail: wdaState.installed
322
- ? `WDA already installed, launched (${bundleId})`
323
- : `WDA installed and launched (${bundleId})`,
380
+ detail: `WDA ${wdaState.installed ? 'already installed, ' : ''}launched and ready on ${webDriverAgentUrl}`,
324
381
  };
325
382
  result.ready = true;
326
383
  } catch (error: any) {
@@ -454,7 +511,7 @@ export default function prepareIosSimulator(server: FastMCP): void {
454
511
  server.addTool({
455
512
  name: 'prepare_ios_simulator',
456
513
  description:
457
- 'Prepare an iOS/tvOS simulator for Appium testing in a single call. Automatically boots the simulator, downloads prebuilt WDA (if not cached), and installs/launches WDA. Each step is skipped if already satisfied. Use skipWda=true to only boot without WDA. Set APPIUM_MCP_WDA_APP_PATH to an absolute path to a pre-extracted WebDriverAgentRunner-Runner.app to skip download entirely (useful in environments where external downloads are blocked).',
514
+ 'Prepare an iOS/tvOS simulator for Appium testing in a single call. Automatically boots the simulator, downloads prebuilt WDA (if not cached), and installs/launches WDA on a free per-simulator port (so multiple simulators can run in parallel without colliding on the default 8100). Pass the returned capabilitiesHint (appium:webDriverAgentUrl) to appium_session_management (action=create) so the session reuses this running WDA instead of trying to start its own. Use skipWda=true to only boot without WDA. Set APPIUM_MCP_WDA_APP_PATH to an absolute path to a pre-extracted WebDriverAgentRunner-Runner.app to skip download entirely (useful in environments where external downloads are blocked).',
458
515
  parameters: prepareIosSimulatorSchema,
459
516
  annotations: {
460
517
  readOnlyHint: false,
@@ -1,6 +1,7 @@
1
1
  import { fs } from '@appium/support';
2
2
  import { URL } from 'node:url';
3
3
  import { getPortFromUrl } from '../../utils/url.js';
4
+ import { findFreePort, releaseReservedPorts } from '../../utils/ports.js';
4
5
  import { AndroidUiautomator2Driver } from 'appium-uiautomator2-driver';
5
6
  import { XCUITestDriver } from 'appium-xcuitest-driver';
6
7
  import { setSession, listSessions } from '../../session-store.js';
@@ -58,6 +59,67 @@ export function filterEmptyCapabilities(
58
59
  return filtered;
59
60
  }
60
61
 
62
+ /**
63
+ * Driver port capabilities to auto-allocate per platform for embedded sessions.
64
+ *
65
+ * Each embedded Appium driver defaults these to a fixed port (Android
66
+ * `systemPort` 8200 / `mjpegServerPort` 7810, iOS `wdaLocalPort` 8100), so two
67
+ * sessions created in the same process collide unless they get distinct ports.
68
+ * Remote callers can't pick free ports on the host, so we must do it server-side
69
+ * where the drivers actually run.
70
+ */
71
+ const EMBEDDED_PORT_CAPABILITIES: Record<'android' | 'ios', string[]> = {
72
+ android: ['appium:systemPort', 'appium:mjpegServerPort'],
73
+ ios: ['appium:wdaLocalPort', 'appium:mjpegServerPort'],
74
+ };
75
+
76
+ /**
77
+ * Auto-allocate driver ports for an embedded (local) session.
78
+ *
79
+ * Purely additive: only fills a port capability the caller (config or custom
80
+ * caps) hasn't already set, so any explicitly provided value is preserved. This
81
+ * keeps concurrent embedded sessions from binding the drivers' shared default
82
+ * ports. No-op for remote sessions, where ports belong to the remote host.
83
+ *
84
+ * Returns the capabilities plus the list of ports this call reserved, so the
85
+ * caller can release them via {@link releaseReservedPorts} once session creation
86
+ * settles (the reservation only needs to guard the creation window). Caller-set
87
+ * ports are not in `allocatedPorts` — they were never reserved by us.
88
+ */
89
+ export async function assignEmbeddedDriverPorts(
90
+ platform: 'android' | 'ios',
91
+ capabilities: Capabilities
92
+ ): Promise<{ capabilities: Capabilities; allocatedPorts: number[] }> {
93
+ const result = { ...capabilities };
94
+ const allocatedPorts: number[] = [];
95
+
96
+ // When the session points at an externally-managed WDA (e.g. a simulator's
97
+ // WDA already launched by prepare_ios_simulator), that WDA owns its ports.
98
+ // wdaLocalPort/mjpegServerPort would be ignored, so don't reserve them.
99
+ if (platform === 'ios' && result['appium:webDriverAgentUrl']) {
100
+ return { capabilities: result, allocatedPorts };
101
+ }
102
+
103
+ try {
104
+ for (const cap of EMBEDDED_PORT_CAPABILITIES[platform]) {
105
+ if (result[cap] == null || result[cap] === '') {
106
+ const port = await findFreePort();
107
+ result[cap] = port;
108
+ allocatedPorts.push(port);
109
+ log.debug(
110
+ `Auto-allocated ${cap}=${port} for embedded ${platform} session`
111
+ );
112
+ }
113
+ }
114
+
115
+ return { capabilities: result, allocatedPorts };
116
+ } catch (err) {
117
+ // If we reserved any ports before failing, release them to avoid leaking.
118
+ releaseReservedPorts(allocatedPorts);
119
+ throw err;
120
+ }
121
+ }
122
+
61
123
  /**
62
124
  * Build Android capabilities by merging defaults, config, device selection, and custom capabilities
63
125
  */
@@ -361,9 +423,21 @@ export async function createSessionAction(args: {
361
423
  if (platform === 'general') {
362
424
  return errorResult('platform=general requires remoteServerUrl.');
363
425
  }
426
+ const allocation = await assignEmbeddedDriverPorts(
427
+ platform,
428
+ finalCapabilities
429
+ );
430
+ finalCapabilities = allocation.capabilities;
364
431
  const driver = createDriverForPlatform(platform);
365
432
  log.info(`Sending session with ${driver.constructor.name}`);
366
- sessionId = await createDriverSession(driver, finalCapabilities);
433
+ try {
434
+ sessionId = await createDriverSession(driver, finalCapabilities);
435
+ } finally {
436
+ // Release the reservations now that creation has settled: on success
437
+ // Appium has bound the ports (the OS prevents reuse); on failure they're
438
+ // free again. Either way the creation window they guarded is over.
439
+ releaseReservedPorts(allocation.allocatedPorts);
440
+ }
367
441
  await setSession(driver, sessionId, finalCapabilities, 'owned');
368
442
  }
369
443
 
@@ -0,0 +1,84 @@
1
+ import net from 'node:net';
2
+
3
+ /**
4
+ * Ports handed out by {@link findFreePort} during the lifetime of this process.
5
+ *
6
+ * Binding to port 0 asks the OS for a free port, but the OS releases it the
7
+ * instant we close the probe socket. Two session creations running in parallel
8
+ * can therefore be assigned the same "free" port before either driver actually
9
+ * binds it. Tracking what we've already handed out lets concurrent embedded
10
+ * sessions get distinct ports even within that race window.
11
+ */
12
+ const reservedPorts = new Set<number>();
13
+
14
+ /**
15
+ * Ask the OS for a currently-free TCP port by binding to port 0 on loopback.
16
+ */
17
+ function probeEphemeralPort(): Promise<number> {
18
+ return new Promise((resolve, reject) => {
19
+ const server = net.createServer();
20
+ server.unref();
21
+ server.once('error', reject);
22
+ server.listen(0, '127.0.0.1', () => {
23
+ const address = server.address();
24
+ const port =
25
+ address && typeof address === 'object' ? address.port : undefined;
26
+ server.close((closeErr) => {
27
+ if (closeErr) {
28
+ reject(closeErr);
29
+ } else if (!port) {
30
+ reject(new Error('Failed to determine a free port'));
31
+ } else {
32
+ resolve(port);
33
+ }
34
+ });
35
+ });
36
+ });
37
+ }
38
+
39
+ /**
40
+ * Allocate a free TCP port that has not already been handed out by this process.
41
+ *
42
+ * Used to assign driver ports (e.g. `systemPort`, `wdaLocalPort`,
43
+ * `mjpegServerPort`) for embedded sessions so that parallel sessions running in
44
+ * the same MCP process don't collide on the drivers' fixed default ports.
45
+ *
46
+ * @param maxAttempts - How many times to retry if the OS hands back a port we
47
+ * have already reserved for another session.
48
+ */
49
+ export async function findFreePort(maxAttempts = 50): Promise<number> {
50
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
51
+ const port = await probeEphemeralPort();
52
+ if (!reservedPorts.has(port)) {
53
+ reservedPorts.add(port);
54
+ return port;
55
+ }
56
+ }
57
+ throw new Error(
58
+ `Unable to allocate a free port after ${maxAttempts} attempts`
59
+ );
60
+ }
61
+
62
+ /**
63
+ * Release a port previously reserved by {@link findFreePort} so it can be reused.
64
+ *
65
+ * Call this once session creation settles: on success the driver has bound the
66
+ * port (the OS itself now prevents reuse), and on failure the port is genuinely
67
+ * free again — either way the reservation has served its only purpose of guarding
68
+ * the creation window, and keeping it would leak the entry and waste the port.
69
+ */
70
+ export function releaseReservedPort(port: number): void {
71
+ reservedPorts.delete(port);
72
+ }
73
+
74
+ /** Release several reserved ports at once (see {@link releaseReservedPort}). */
75
+ export function releaseReservedPorts(ports: Iterable<number>): void {
76
+ for (const port of ports) {
77
+ reservedPorts.delete(port);
78
+ }
79
+ }
80
+
81
+ /** Snapshot of currently-reserved ports — for diagnostics and tests. */
82
+ export function reservedPortCount(): number {
83
+ return reservedPorts.size;
84
+ }