appium-mcp 1.72.0 → 1.72.2

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +51 -15
  3. package/dist/tools/ai/ai.d.ts +3 -0
  4. package/dist/tools/ai/ai.d.ts.map +1 -0
  5. package/dist/tools/ai/ai.js +30 -0
  6. package/dist/tools/ai/ai.js.map +1 -0
  7. package/dist/tools/ai/config.d.ts +15 -0
  8. package/dist/tools/ai/config.d.ts.map +1 -0
  9. package/dist/tools/ai/config.js +31 -0
  10. package/dist/tools/ai/config.js.map +1 -0
  11. package/dist/tools/ai/handlers/find-element.d.ts +5 -0
  12. package/dist/tools/ai/handlers/find-element.d.ts.map +1 -0
  13. package/dist/tools/ai/handlers/find-element.js +46 -0
  14. package/dist/tools/ai/handlers/find-element.js.map +1 -0
  15. package/dist/tools/ai/schema.d.ts +12 -0
  16. package/dist/tools/ai/schema.d.ts.map +1 -0
  17. package/dist/tools/ai/schema.js +20 -0
  18. package/dist/tools/ai/schema.js.map +1 -0
  19. package/dist/tools/gestures/handlers/tap.d.ts.map +1 -1
  20. package/dist/tools/gestures/handlers/tap.js +7 -0
  21. package/dist/tools/gestures/handlers/tap.js.map +1 -1
  22. package/dist/tools/gestures/schema.d.ts +1 -1
  23. package/dist/tools/gestures/schema.d.ts.map +1 -1
  24. package/dist/tools/gestures/schema.js +14 -7
  25. package/dist/tools/gestures/schema.js.map +1 -1
  26. package/dist/tools/index.d.ts.map +1 -1
  27. package/dist/tools/index.js +11 -0
  28. package/dist/tools/index.js.map +1 -1
  29. package/dist/tools/interactions/find.d.ts +1 -3
  30. package/dist/tools/interactions/find.d.ts.map +1 -1
  31. package/dist/tools/interactions/find.js +27 -85
  32. package/dist/tools/interactions/find.js.map +1 -1
  33. package/dist/tools/ios/prepare-ios-real-device.d.ts +5 -5
  34. package/dist/tools/ios/prepare-ios-real-device.d.ts.map +1 -1
  35. package/dist/tools/ios/prepare-ios-real-device.js +46 -45
  36. package/dist/tools/ios/prepare-ios-real-device.js.map +1 -1
  37. package/dist/tools/test-generation/generate-tests.js +1 -1
  38. package/dist/tools/test-generation/generate-tests.js.map +1 -1
  39. package/package.json +1 -1
  40. package/server.json +2 -2
  41. package/src/resources/submodules.zip +0 -0
  42. package/src/tools/README.md +3 -2
  43. package/src/tools/ai/ai.ts +36 -0
  44. package/src/tools/ai/config.ts +35 -0
  45. package/src/tools/ai/handlers/find-element.ts +74 -0
  46. package/src/tools/ai/schema.ts +30 -0
  47. package/src/tools/gestures/handlers/tap.ts +9 -0
  48. package/src/tools/gestures/schema.ts +17 -7
  49. package/src/tools/index.ts +14 -0
  50. package/src/tools/interactions/find.ts +33 -119
  51. package/src/tools/ios/prepare-ios-real-device.ts +58 -67
  52. package/src/tools/test-generation/generate-tests.ts +1 -1
@@ -1,41 +1,30 @@
1
1
  import { z } from 'zod';
2
- import { getScreenshot } from '../../command.js';
3
- import { imageUtil } from '@appium/support';
4
- import { AIVisionFinder } from '../../ai-finder/vision-finder.js';
5
- import log from '../../logger.js';
6
2
  import { resolveDriver, textResultWithPrimaryElementId, errorResult, toolErrorMessage, readWebElementId, } from '../tool-response.js';
7
- // Module-level singleton: ensures the LRU cache persists across tool calls.
8
- // Creating a new AIVisionFinder() on every call would reset the cache each time.
9
- let _finderInstance = null;
10
- function getAIVisionFinder() {
11
- if (!_finderInstance) {
12
- _finderInstance = new AIVisionFinder();
13
- }
14
- return _finderInstance;
15
- }
16
3
  export const findElementSchema = z.object({
17
- strategy: z.enum([
18
- 'xpath',
4
+ strategy: z
5
+ .enum([
6
+ 'accessibility id',
19
7
  'id',
8
+ '-ios predicate string',
9
+ '-ios class chain',
10
+ '-android uiautomator',
11
+ 'xpath',
20
12
  'name',
21
13
  'class name',
22
- 'accessibility id',
23
14
  'css selector',
24
- '-android uiautomator',
25
- '-ios predicate string',
26
- '-ios class chain',
27
- 'ai_instruction', // NEW: AI-based natural language finding
28
- ]),
29
- selector: z
30
- .string()
31
- .optional()
32
- .describe('The selector to find the element. ' +
33
- 'REQUIRED for all traditional strategies (xpath, id, name, class name, accessibility id, css selector, -android uiautomator, -ios predicate string, -ios class chain). ' +
34
- 'NOT required when strategy is "ai_instruction" use ai_instruction field instead.'),
35
- ai_instruction: z
36
- .string()
37
- .optional()
38
- .describe('Natural language instruction for AI-based element finding (required when strategy is ai_instruction)'),
15
+ ])
16
+ .describe(`Locator strategy. Try in priority order: ` +
17
+ `(1) accessibility id [cross-platform, fastest, most stable], ` +
18
+ `(2) id [Android resource-id; iOS aliases accessibility id], ` +
19
+ `(3) -ios predicate string [iOS native, fast], ` +
20
+ `(4) -ios class chain [iOS native, hierarchy queries], ` +
21
+ `(5) -android uiautomator [Android native, expressive UiSelector], ` +
22
+ `(6) xpath [LAST RESORT — slow on iOS XCUITest, brittle to layout changes], ` +
23
+ `(7) name [legacy; often aliased on iOS], ` +
24
+ `(8) class name [too generic, usually multi-match], ` +
25
+ `(9) css selector [webview/hybrid contexts only]. ` +
26
+ `Platform tips: iOS prefer (1)→(3)→(4); Android prefer (1)→(2)→(5); xpath last on both.`),
27
+ selector: z.string().describe('The selector to find the element.'),
39
28
  sessionId: z
40
29
  .string()
41
30
  .optional()
@@ -46,21 +35,9 @@ export default function findElement(server) {
46
35
  name: 'appium_find_element',
47
36
  description: `Find a specific element by strategy and selector which will return a uuid that can be used for interactions.
48
37
 
49
- **Traditional Mode**: Use strategy + selector (xpath, id, accessibility id, etc.)
50
- **AI Mode**: Use strategy='ai_instruction' + ai_instruction="natural language description"
38
+ [PRIORITY 2: Use this to search for a target element.]
51
39
 
52
- [PRIORITY 2: Use this to search for a target element by xpath, id, accessibility id, etc.]
53
-
54
- **AI Mode Examples**:
55
- - ai_instruction: "yellow search hotel button"
56
- - ai_instruction: "username input field at top"
57
- - ai_instruction: "settings icon in top-right corner"
58
-
59
- **Environment Variables Required for AI Mode**:
60
- - AI_VISION_API_BASE_URL: Vision model API endpoint (required)
61
- - AI_VISION_API_KEY: API authentication key (required)
62
- - AI_VISION_MODEL: Model name (optional, defaults to Qwen3-VL-235B-A22B-Instruct)
63
- - AI_VISION_COORD_TYPE: Coordinate type (optional, defaults to normalized)
40
+ **Strategy priority**: accessibility id > id > platform-native (\`-ios predicate string\` / \`-ios class chain\` on iOS, \`-android uiautomator\` on Android) > xpath (last resort — slow & brittle). See the \`strategy\` parameter for the full ranking.
64
41
 
65
42
  **Scrolling until an element appears**: use \`appium_gesture\` with \`action=scroll_to_element\` (same strategy + selector), not this tool.`,
66
43
  parameters: findElementSchema,
@@ -75,50 +52,15 @@ export default function findElement(server) {
75
52
  }
76
53
  const { driver } = resolved;
77
54
  try {
78
- // Route 1: Traditional locator strategy
79
- if (args.strategy !== 'ai_instruction') {
80
- if (!args.selector) {
81
- throw new Error('selector is required for traditional locator strategies');
82
- }
83
- const element = await driver.findElement(args.strategy, args.selector);
84
- const elementId = readWebElementId(element);
85
- if (!elementId) {
86
- throw new Error('Element was returned without a valid element ID');
87
- }
88
- return textResultWithPrimaryElementId(elementId, `Successfully found element ${args.selector} with strategy ${args.strategy}.`);
89
- }
90
- // Route 2: AI vision-based finding
91
- if (!args.ai_instruction) {
92
- throw new Error('ai_instruction is required when strategy is ai_instruction. ' +
93
- 'Example: { strategy: "ai_instruction", ai_instruction: "yellow search button at bottom" }');
94
- }
95
- log.info(`Finding element using AI with instruction: "${args.ai_instruction}"`);
96
- // Step 1: Capture screenshot
97
- const screenshotBase64 = await getScreenshot(driver);
98
- // Step 2: Get image dimensions using @appium/support
99
- const imageBuffer = Buffer.from(screenshotBase64, 'base64');
100
- const sharp = imageUtil.requireSharp();
101
- const metadata = await sharp(imageBuffer).metadata();
102
- if (!metadata.width || !metadata.height) {
103
- throw new Error('Failed to get image dimensions from screenshot');
104
- }
105
- const { width, height } = metadata;
106
- // Step 3: Find element using AI (singleton to preserve LRU cache across calls)
107
- const finder = getAIVisionFinder();
108
- const result = await finder.findElement(screenshotBase64, args.ai_instruction, width, height);
109
- // Step 4: Create special elementUUID containing coordinates
110
- // Format: "ai-element:{x},{y}:{bbox}"
111
- const elementUUID = `ai-element:${result.center.x},${result.center.y}:${result.bbox.join(',')}`;
112
- // Step 5: Build response text with optional annotated image path
113
- let detail = `Successfully found "${result.target}" at coordinates (${result.center.x}, ${result.center.y}) using AI vision.`;
114
- if (result.annotatedImagePath) {
115
- detail += ` Vision image: ${result.annotatedImagePath}`;
55
+ const element = await driver.findElement(args.strategy, args.selector);
56
+ const elementId = readWebElementId(element);
57
+ if (!elementId) {
58
+ throw new Error('Element was returned without a valid element ID');
116
59
  }
117
- return textResultWithPrimaryElementId(elementUUID, detail);
60
+ return textResultWithPrimaryElementId(elementId, `Successfully found element ${args.selector} with strategy ${args.strategy}.`);
118
61
  }
119
62
  catch (err) {
120
63
  const errorMessage = toolErrorMessage(err);
121
- log.error('Failed to find element:', errorMessage);
122
64
  return errorResult(`Failed to find element. Error: ${errorMessage}`);
123
65
  }
124
66
  },
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/tools/interactions/find.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/tools/interactions/find.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC;QACJ,kBAAkB;QAClB,IAAI;QACJ,uBAAuB;QACvB,kBAAkB;QAClB,sBAAsB;QACtB,OAAO;QACP,MAAM;QACN,YAAY;QACZ,cAAc;KACf,CAAC;SACD,QAAQ,CACP,2CAA2C;QACzC,+DAA+D;QAC/D,8DAA8D;QAC9D,gDAAgD;QAChD,wDAAwD;QACxD,oEAAoE;QACpE,6EAA6E;QAC7E,2CAA2C;QAC3C,qDAAqD;QACrD,mDAAmD;QACnD,wFAAwF,CAC3F;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClE,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4DAA4D,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,MAAe;IACjD,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE;;;;;;4IAM2H;QACxI,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAuC,EACvC,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvE,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,8BAA8B,CACnC,SAAS,EACT,8BAA8B,IAAI,CAAC,QAAQ,kBAAkB,IAAI,CAAC,QAAQ,GAAG,CAC9E,CAAC;YACJ,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC3C,OAAO,WAAW,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -3,11 +3,11 @@
3
3
  *
4
4
  * Two-mode flow:
5
5
  * - Discovery (no provisioningProfileUuid given): returns the list of available
6
- * .mobileprovision profiles so the LLM can ask the user which to use plus
7
- * whether the underlying account is free or enterprise.
8
- * - Build (provisioningProfileUuid + isFreeAccount given): chains
9
- * download matching WDA release package IPA applesign. Each step is
10
- * cached so re-runs are fast.
6
+ * .mobileprovision profiles so the LLM can ask the user which to use.
7
+ * - Build (provisioningProfileUuid given): chains download matching WDA release
8
+ * package IPA applesign. Download and unsigned IPA are cached per WDA
9
+ * version; the signed IPA is rebuilt every call so profile/cert changes never
10
+ * serve a stale signature.
11
11
  *
12
12
  * After a successful run, create_session calls should pass the returned
13
13
  * `capabilitiesHint` so Appium installs and launches the signed prebuilt WDA
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-ios-real-device.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAoctD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsElE"}
1
+ {"version":3,"file":"prepare-ios-real-device.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAictD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAgElE"}
@@ -11,6 +11,8 @@ import { IOSManager } from '../../devicemanager/ios-manager.js';
11
11
  import log from '../../logger.js';
12
12
  import { textResult } from '../tool-response.js';
13
13
  import { resolveAppiumMcpCachePath } from '../../utils/paths.js';
14
+ // default signing bundle ID when the chosen provisioning profile is a wildcard ('*')
15
+ const WDA_RUNNER_BUNDLE_ID_FOR_XCTEST = 'com.facebook.WebDriverAgentRunner.xctrunner';
14
16
  // ── Provisioning profile discovery ──
15
17
  async function fileExists(filePath) {
16
18
  try {
@@ -45,6 +47,7 @@ async function listProvisioningProfiles() {
45
47
  const mp = provision.readFromFile(fullPath);
46
48
  // The provision Name typically formats as "iOS Team Provisioning Profile: <bundleId>"
47
49
  const bundleIdFromName = mp.Name.split(':')[1]?.trim() ?? '';
50
+ const isWildcard = bundleIdFromName === '*';
48
51
  return {
49
52
  uuid: mp.UUID,
50
53
  name: mp.Name,
@@ -54,6 +57,11 @@ async function listProvisioningProfiles() {
54
57
  expiresAt: mp.ExpirationDate
55
58
  ? new Date(mp.ExpirationDate).toISOString()
56
59
  : undefined,
60
+ // Wildcards work too, we substitute a concrete .xctrunner bundle ID at sign time.
61
+ // Specific profiles must already end in .xctrunner since the xcuitest driver re-appends
62
+ // that suffix on launch (see appium-webdriveragent/lib/constants.ts DEFAULT_TEST_BUNDLE_SUFFIX).
63
+ recommendedForWda: isWildcard || bundleIdFromName.endsWith('.xctrunner'),
64
+ isWildcard,
57
65
  };
58
66
  });
59
67
  }
@@ -114,12 +122,16 @@ async function packageAppAsIpa(appPath, outIpaPath) {
114
122
  await rm(stagingDir, { recursive: true, force: true });
115
123
  }
116
124
  // ── Bundle ID extraction (from the signed IPA) ──
117
- async function signIpa(ipaPath, profile, isFreeAccount) {
125
+ async function signIpa(ipaPath, profile) {
126
+ // For wildcard profiles, applesign needs a concrete value, substitute the canonical WDA Runner bundle ID,
127
+ // which the xcuitest driver expects to find at launch.
128
+ const targetBundleId = profile.isWildcard
129
+ ? WDA_RUNNER_BUNDLE_ID_FOR_XCTEST
130
+ : profile.bundleId.trim();
118
131
  const opts = {
119
132
  file: ipaPath,
120
133
  mobileprovision: profile.filePath,
121
- // Free accounts must override the bundle id to match the personal team prefix
122
- bundleid: isFreeAccount ? profile.bundleId.trim() : '',
134
+ bundleid: targetBundleId,
123
135
  withGetTaskAllow: true,
124
136
  withoutPlugins: true,
125
137
  };
@@ -215,8 +227,7 @@ async function runPipeline(inputs) {
215
227
  const versionRoot = resolveAppiumMcpCachePath('wda-real', wdaVersion);
216
228
  const downloadDir = path.join(versionRoot, 'downloaded');
217
229
  const unsignedIpaPath = path.join(versionRoot, 'Payload.ipa');
218
- const flag = inputs.isFreeAccount ? 'free' : 'ent';
219
- const signedDir = path.join(versionRoot, 'signed', `${profile.uuid}-${flag}`);
230
+ const signedDir = path.join(versionRoot, 'signed', profile.uuid);
220
231
  const stagedIpaPath = path.join(signedDir, 'Payload.ipa');
221
232
  const resignedIpaPath = path.join(signedDir, 'Payload-resigned.ipa');
222
233
  // ── Step 2: Download matching WDA release (cached) ──
@@ -269,33 +280,26 @@ async function runPipeline(inputs) {
269
280
  result.wda_package = { status: 'failed', detail: err.message };
270
281
  return result;
271
282
  }
272
- // ── Step 4: Resign (cached per profile) ──
283
+ // ── Step 4: Resign (always re-sign; no cache) ──
273
284
  let bundleId;
274
285
  try {
275
- if (!inputs.forceRebuild && (await fileExists(resignedIpaPath))) {
276
- bundleId = await extractBundleIdFromIpa(resignedIpaPath);
277
- result.wda_sign = {
278
- status: 'skipped',
279
- detail: `Reusing cached signed IPA at ${resignedIpaPath} (bundleId=${bundleId})`,
280
- };
281
- }
282
- else {
283
- await mkdir(signedDir, { recursive: true });
284
- // applesign mutates / writes alongside the input IPA; copy fresh into the per-profile dir first
285
- await cp(unsignedIpaPath, stagedIpaPath);
286
- log.info(`Signing IPA with profile ${profile.uuid} (free=${inputs.isFreeAccount})...`);
287
- const producedPath = await signIpa(stagedIpaPath, profile, inputs.isFreeAccount);
288
- // signIpa returns "<basename>-resigned.ipa" alongside the staged copy — that
289
- // already matches resignedIpaPath, but assert to be defensive.
290
- if (path.resolve(producedPath) !== path.resolve(resignedIpaPath)) {
291
- await cp(producedPath, resignedIpaPath);
292
- }
293
- bundleId = await extractBundleIdFromIpa(resignedIpaPath);
294
- result.wda_sign = {
295
- status: 'completed',
296
- detail: `Signed IPA at ${resignedIpaPath} (bundleId=${bundleId})`,
297
- };
286
+ // Wipe any prior signed artifacts for this profile so applesign starts clean.
287
+ await rm(signedDir, { recursive: true, force: true });
288
+ await mkdir(signedDir, { recursive: true });
289
+ // applesign mutates / writes alongside the input IPA; copy fresh into the per-profile dir first
290
+ await cp(unsignedIpaPath, stagedIpaPath);
291
+ log.info(`Signing IPA with profile ${profile.uuid} (wildcard=${profile.isWildcard})...`);
292
+ const producedPath = await signIpa(stagedIpaPath, profile);
293
+ // signIpa returns "<basename>-resigned.ipa" alongside the staged copy — that
294
+ // already matches resignedIpaPath, but assert to be defensive.
295
+ if (path.resolve(producedPath) !== path.resolve(resignedIpaPath)) {
296
+ await cp(producedPath, resignedIpaPath);
298
297
  }
298
+ bundleId = await extractBundleIdFromIpa(resignedIpaPath);
299
+ result.wda_sign = {
300
+ status: 'completed',
301
+ detail: `Signed IPA at ${resignedIpaPath} (bundleId=${bundleId})`,
302
+ };
299
303
  }
300
304
  catch (err) {
301
305
  result.wda_sign = { status: 'failed', detail: err.message };
@@ -320,24 +324,20 @@ const prepareRealDeviceSchema = z.object({
320
324
  .string()
321
325
  .optional()
322
326
  .describe('UUID of the .mobileprovision profile to sign WDA with. If omitted, the tool returns the list of available profiles so you can ask the user to pick one.'),
323
- isFreeAccount: z
324
- .boolean()
325
- .optional()
326
- .describe('Required when provisioningProfileUuid is given. true if the profile belongs to a free Apple ID (7-day expiry, no team prefix), false for a paid/enterprise team. Ask the user — do not infer from the UUID.'),
327
327
  forceRebuild: z
328
328
  .boolean()
329
329
  .optional()
330
- .describe('If true, ignore cached WDA download and signed IPA and start clean. Default: false.'),
330
+ .describe('If true, ignore the cached WDA download and unsigned IPA and start clean. The signed IPA is always rebuilt regardless. Default: false.'),
331
331
  });
332
332
  export default function prepareIosRealDevice(server) {
333
333
  server.addTool({
334
334
  name: 'appium_prepare_ios_real_device',
335
335
  description: 'Prepare an iOS real device for Appium testing in a single call. Two-mode flow: ' +
336
336
  '(1) Call without provisioningProfileUuid to receive the list of available .mobileprovision profiles — ' +
337
- 'present them to the user and confirm whether the chosen profile belongs to a free Apple ID or a paid/enterprise team. ' +
338
- '(2) Call again with the chosen UUID and isFreeAccount to download the matching WebDriverAgent release, package it as an IPA, ' +
339
- 'and resign it with the chosen profile. ' +
340
- 'Each step is cached so repeat runs are fast. ' +
337
+ 'present them to the user (highlight any with recommendedForWda=true) and ask them to pick one. ' +
338
+ '(2) Call again with the chosen UUID to download the matching WebDriverAgent release, package it as an IPA, ' +
339
+ 'and resign it with the chosen profile (wildcard "*" profiles are supported — a concrete WDA bundle ID is substituted at sign time). ' +
340
+ 'WDA download and unsigned IPA are cached per WDA version; the signed IPA is rebuilt every call. ' +
341
341
  'Pass the returned capabilitiesHint to create_session so Appium installs and launches the signed prebuilt WDA instead of rebuilding. ' +
342
342
  'Requires macOS, Xcode 16+, and a paired developer-mode device.',
343
343
  parameters: prepareRealDeviceSchema,
@@ -349,25 +349,26 @@ export default function prepareIosRealDevice(server) {
349
349
  if (process.platform !== 'darwin') {
350
350
  throw new Error('iOS real-device preparation is only supported on macOS');
351
351
  }
352
- const { udid, provisioningProfileUuid, isFreeAccount, forceRebuild = false, } = args;
352
+ const { udid, provisioningProfileUuid, forceRebuild = false } = args;
353
353
  // Discovery mode: no profile chosen yet — return profile list for selection.
354
354
  if (!provisioningProfileUuid) {
355
355
  const profiles = await listProvisioningProfiles();
356
+ const recommended = profiles.filter((p) => p.recommendedForWda);
356
357
  return textResult(JSON.stringify({
357
358
  mode: 'discovery',
358
359
  udid,
359
360
  profiles,
360
- instructions: "Present the profiles to the user and ask them to (a) pick one by UUID and (b) confirm whether the profile's Apple ID is free (7-day expiry) or paid/enterprise. Then call this tool again with provisioningProfileUuid and isFreeAccount.",
361
+ recommendedProfiles: recommended.length > 0 ? recommended : undefined,
362
+ instructions: 'Prefer profiles with recommendedForWda=true. These are profiles whose bundle ID either ends in .xctrunner ' +
363
+ '(matches what the xcuitest driver re-appends at launch) or is a wildcard "*" (we substitute a concrete WDA bundle ID at sign time). ' +
364
+ 'Present the profiles to the user, highlight the recommended ones, and ask them to pick one by UUID. ' +
365
+ 'Then call this tool again with provisioningProfileUuid.',
361
366
  }, null, 2));
362
367
  }
363
- if (isFreeAccount === undefined) {
364
- throw new Error('isFreeAccount is required when provisioningProfileUuid is provided. Ask the user whether the chosen profile belongs to a free Apple ID or a paid/enterprise team.');
365
- }
366
- log.info(`Preparing iOS real device ${udid} with profile ${provisioningProfileUuid} (free=${isFreeAccount}, forceRebuild=${forceRebuild})`);
368
+ log.info(`Preparing iOS real device ${udid} with profile ${provisioningProfileUuid} (forceRebuild=${forceRebuild})`);
367
369
  const result = await runPipeline({
368
370
  udid,
369
371
  provisioningProfileUuid,
370
- isFreeAccount,
371
372
  forceRebuild,
372
373
  });
373
374
  return textResult(JSON.stringify({ mode: 'build', ...result }, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-ios-real-device.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prepare-ios-real-device.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export default function generateTest(server) {
14
14
  `2. prepare_ios_simulator or appium_prepare_ios_real_device — only when iOS local setup requires it; otherwise skip.`,
15
15
  `3. appium_session_management with action=create — start a driver session (match platform to select_device unless using remote server mode).`,
16
16
  `4. appium_app_lifecycle or other session tools as needed (e.g. activate app, deep link) — only if the scenario requires it.`,
17
- `5. Discover the target element — prefer appium_get_active_element when the focused field is enough; otherwise appium_find_element (strategy + selector, or ai_instruction when appropriate). Use generate_locators only for broad inspection/debugging, not for every step.`,
17
+ `5. Discover the target element — prefer appium_get_active_element when the focused field is enough; otherwise appium_find_element (strategy + selector). If the appium_ai tool is registered (vision-based fallback, opt-in via AI_VISION_ENABLED), use it only when no stable locator works. Use generate_locators only for broad inspection/debugging, not for every step.`,
18
18
  `6. Interact using the same tool names the server exposes, for example:`,
19
19
  ` - appium_gesture with action=tap (or double_tap, long_press, scroll, swipe, scroll_to_element, pinch_zoom) — use the element id from appium_find_element when required`,
20
20
  ` - appium_set_value — type into an element; optionally appium_mobile_press_key for special keys`,
@@ -1 +1 @@
1
- {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/tools/test-generation/generate-tests.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAe;IAClD,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAE,EAAE,CACnD;QACE,iBAAiB;QACjB,qCAAqC;QACrC,4EAA4E;QAC5E,EAAE;QACF,uDAAuD;QACvD,uKAAuK;QACvK,qHAAqH;QACrH,6IAA6I;QAC7I,6HAA6H;QAC7H,6QAA6Q;QAC7Q,wEAAwE;QACxE,2KAA2K;QAC3K,mGAAmG;QACnG,wFAAwF;QACxF,iNAAiN;QACjN,EAAE;QACF,uLAAuL;QACvL,sDAAsD;QACtD,+IAA+I;QAC/I,sFAAsF;QACtF,2EAA2E;QAC3E,2GAA2G;QAC3G,2GAA2G;QAC3G,wDAAwD;QACxD,oFAAoF;QACpF,6JAA6J;QAC7J,QAAQ;QACR,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEf,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,oVAAoV;QACtV,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAwC,EACxC,QAA6C,EACrB,EAAE,CAC1B,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KAClD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/tools/test-generation/generate-tests.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAe;IAClD,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAE,EAAE,CACnD;QACE,iBAAiB;QACjB,qCAAqC;QACrC,4EAA4E;QAC5E,EAAE;QACF,uDAAuD;QACvD,uKAAuK;QACvK,qHAAqH;QACrH,6IAA6I;QAC7I,6HAA6H;QAC7H,8WAA8W;QAC9W,wEAAwE;QACxE,2KAA2K;QAC3K,mGAAmG;QACnG,wFAAwF;QACxF,iNAAiN;QACjN,EAAE;QACF,uLAAuL;QACvL,sDAAsD;QACtD,+IAA+I;QAC/I,sFAAsF;QACtF,2EAA2E;QAC3E,2GAA2G;QAC3G,2GAA2G;QAC3G,wDAAwD;QACxD,oFAAoF;QACpF,6JAA6J;QAC7J,QAAQ;QACR,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEf,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,oVAAoV;QACtV,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAwC,EACxC,QAA6C,EACrB,EAAE,CAC1B,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KAClD,CAAC,CAAC;AACL,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.72.0",
4
+ "version": "1.72.2",
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.72.0",
6
+ "version": "1.72.2",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "appium-mcp",
11
- "version": "1.72.0",
11
+ "version": "1.72.2",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  }
Binary file
@@ -19,7 +19,7 @@ This directory contains all MCP tools available in MCP Appium.
19
19
  ### iOS Setup (`ios/`)
20
20
 
21
21
  - `prepare-ios-simulator.ts` - Boot simulator, download, install and launch WebDriverAgent in a single call
22
- - `prepare-ios-real-device.ts` - Download the matching WDA release and resign it with a local provisioning profile. Discovery mode (no UUID) lists available `.mobileprovision` profiles; build mode (UUID + `isFreeAccount`) runs the signing pipeline with per-version/per-profile caching and returns `usePreinstalledWDA` + `prebuiltWDAPath` capabilities so Appium installs and launches WDA during session startup.
22
+ - `prepare-ios-real-device.ts` - Download the matching WDA release and resign it with a local provisioning profile. Discovery mode (no UUID) lists available `.mobileprovision` profiles (including wildcard ones, flagged as `recommendedForWda`); build mode (UUID) runs the signing pipeline. WDA download and unsigned IPA are cached per WDA version; the signed IPA is rebuilt every call so profile/cert rotation never serves a stale signature. Returns `usePreinstalledWDA` + `prebuiltWDAPath` capabilities so Appium installs and launches WDA during session startup.
23
23
 
24
24
  ### Navigation (`navigations/`)
25
25
 
@@ -51,7 +51,8 @@ When searching for elements, follow this priority order for efficiency:
51
51
  - Best for: Finding what element currently has focus
52
52
 
53
53
  2. **`appium_find_element`** (PRIORITY 2) - Use this to search for a specific target element
54
- - Specify strategy (xpath, id, accessibility id, etc.) and selector
54
+ - Specify strategy and selector
55
+ - Strategy priority: `accessibility id` > `id` > platform-native (`-ios predicate string` / `-ios class chain` on iOS, `-android uiautomator` on Android) > `xpath` (last resort)
55
56
  - Returns specific element UUID
56
57
  - Best for: Targeting a known element
57
58
 
@@ -0,0 +1,36 @@
1
+ import type { ContentResult, FastMCP } from 'fastmcp';
2
+ import { resolveDriver } from '../tool-response.js';
3
+ import { AI_ACTIONS, aiSchema, type AIArgs } from './schema.js';
4
+ import { handleFindElement } from './handlers/find-element.js';
5
+
6
+ export default function ai(server: FastMCP): void {
7
+ server.addTool({
8
+ name: 'appium_ai',
9
+ description:
10
+ `Vision-based AI capabilities (FALLBACK - use only when traditional tools cannot locate the element). ` +
11
+ `Use 'action' to choose: ${AI_ACTIONS.join(', ')}. ` +
12
+ `find_element: locate an element from a natural-language description; returns a coordinate UUID (ai-element:x,y:bbox) usable with appium_gesture. ` +
13
+ `Prefer appium_find_element with xpath/id/accessibility id/text first. ` +
14
+ `Reach for this tool only when the element has no stable identifier, the page source is unavailable, or you need to locate by purely visual cues (color, position, icon).`,
15
+ parameters: aiSchema,
16
+ annotations: {
17
+ readOnlyHint: true,
18
+ openWorldHint: true,
19
+ },
20
+ execute: async (
21
+ args: AIArgs,
22
+ _context: Record<string, unknown> | undefined
23
+ ): Promise<ContentResult> => {
24
+ const resolved = resolveDriver(args.sessionId);
25
+ if (!resolved.ok) {
26
+ return resolved.result;
27
+ }
28
+ const { driver } = resolved;
29
+
30
+ switch (args.action) {
31
+ case 'find_element':
32
+ return handleFindElement(driver, args);
33
+ }
34
+ },
35
+ });
36
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * AI tool enablement and configuration.
3
+ *
4
+ * The AI tool is gated behind AI_VISION_ENABLED to prevent the LLM from
5
+ * defaulting to vision-based finding when a traditional locator would work,
6
+ * and to keep cost/latency surprises out of the default experience.
7
+ *
8
+ * Contract:
9
+ * - AI_VISION_ENABLED !== 'true' → tool is not registered.
10
+ * - AI_VISION_ENABLED === 'true' → AI_VISION_API_BASE_URL and
11
+ * AI_VISION_API_KEY MUST be set, or server startup fails fast.
12
+ */
13
+
14
+ const ENABLED_FLAG = 'AI_VISION_ENABLED';
15
+ const REQUIRED_WHEN_ENABLED = [
16
+ 'AI_VISION_API_BASE_URL',
17
+ 'AI_VISION_API_KEY',
18
+ ] as const;
19
+
20
+ export function isAIEnabled(): boolean {
21
+ return process.env[ENABLED_FLAG]?.toLowerCase() === 'true';
22
+ }
23
+
24
+ export function assertAIConfig(): void {
25
+ if (!isAIEnabled()) {
26
+ return;
27
+ }
28
+ const missing = REQUIRED_WHEN_ENABLED.filter((name) => !process.env[name]);
29
+ if (missing.length > 0) {
30
+ throw new Error(
31
+ `${ENABLED_FLAG}=true but required env vars are missing: ${missing.join(', ')}. ` +
32
+ `Set them or unset ${ENABLED_FLAG} to disable the AI tool.`
33
+ );
34
+ }
35
+ }