appium-desktop-driver 1.2.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.
Files changed (208) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +609 -0
  3. package/ROADMAP.md +175 -0
  4. package/build/lib/commands/actions.d.ts +12 -0
  5. package/build/lib/commands/actions.d.ts.map +1 -0
  6. package/build/lib/commands/actions.js +242 -0
  7. package/build/lib/commands/actions.js.map +1 -0
  8. package/build/lib/commands/app.d.ts +18 -0
  9. package/build/lib/commands/app.d.ts.map +1 -0
  10. package/build/lib/commands/app.js +280 -0
  11. package/build/lib/commands/app.js.map +1 -0
  12. package/build/lib/commands/device.d.ts +11 -0
  13. package/build/lib/commands/device.d.ts.map +1 -0
  14. package/build/lib/commands/device.js +236 -0
  15. package/build/lib/commands/device.js.map +1 -0
  16. package/build/lib/commands/element.d.ts +16 -0
  17. package/build/lib/commands/element.d.ts.map +1 -0
  18. package/build/lib/commands/element.js +233 -0
  19. package/build/lib/commands/element.js.map +1 -0
  20. package/build/lib/commands/extension.d.ts +124 -0
  21. package/build/lib/commands/extension.d.ts.map +1 -0
  22. package/build/lib/commands/extension.js +715 -0
  23. package/build/lib/commands/extension.js.map +1 -0
  24. package/build/lib/commands/functions.d.ts +3 -0
  25. package/build/lib/commands/functions.d.ts.map +1 -0
  26. package/build/lib/commands/functions.js +194 -0
  27. package/build/lib/commands/functions.js.map +1 -0
  28. package/build/lib/commands/index.d.ts +178 -0
  29. package/build/lib/commands/index.d.ts.map +1 -0
  30. package/build/lib/commands/index.js +54 -0
  31. package/build/lib/commands/index.js.map +1 -0
  32. package/build/lib/commands/powershell.d.ts +6 -0
  33. package/build/lib/commands/powershell.d.ts.map +1 -0
  34. package/build/lib/commands/powershell.js +202 -0
  35. package/build/lib/commands/powershell.js.map +1 -0
  36. package/build/lib/commands/screen-recorder.d.ts +40 -0
  37. package/build/lib/commands/screen-recorder.d.ts.map +1 -0
  38. package/build/lib/commands/screen-recorder.js +183 -0
  39. package/build/lib/commands/screen-recorder.js.map +1 -0
  40. package/build/lib/commands/system.d.ts +4 -0
  41. package/build/lib/commands/system.d.ts.map +1 -0
  42. package/build/lib/commands/system.js +8 -0
  43. package/build/lib/commands/system.js.map +1 -0
  44. package/build/lib/constants.d.ts +3 -0
  45. package/build/lib/constants.d.ts.map +1 -0
  46. package/build/lib/constants.js +6 -0
  47. package/build/lib/constants.js.map +1 -0
  48. package/build/lib/constraints.d.ts +58 -0
  49. package/build/lib/constraints.d.ts.map +1 -0
  50. package/build/lib/constraints.js +60 -0
  51. package/build/lib/constraints.js.map +1 -0
  52. package/build/lib/driver.d.ts +36 -0
  53. package/build/lib/driver.d.ts.map +1 -0
  54. package/build/lib/driver.js +209 -0
  55. package/build/lib/driver.js.map +1 -0
  56. package/build/lib/enums.d.ts +89 -0
  57. package/build/lib/enums.d.ts.map +1 -0
  58. package/build/lib/enums.js +83 -0
  59. package/build/lib/enums.js.map +1 -0
  60. package/build/lib/mcp/appium-manager.d.ts +8 -0
  61. package/build/lib/mcp/appium-manager.d.ts.map +1 -0
  62. package/build/lib/mcp/appium-manager.js +160 -0
  63. package/build/lib/mcp/appium-manager.js.map +1 -0
  64. package/build/lib/mcp/config.d.ts +7 -0
  65. package/build/lib/mcp/config.d.ts.map +1 -0
  66. package/build/lib/mcp/config.js +14 -0
  67. package/build/lib/mcp/config.js.map +1 -0
  68. package/build/lib/mcp/constants.d.ts +3 -0
  69. package/build/lib/mcp/constants.d.ts.map +1 -0
  70. package/build/lib/mcp/constants.js +6 -0
  71. package/build/lib/mcp/constants.js.map +1 -0
  72. package/build/lib/mcp/errors.d.ts +2 -0
  73. package/build/lib/mcp/errors.d.ts.map +1 -0
  74. package/build/lib/mcp/errors.js +10 -0
  75. package/build/lib/mcp/errors.js.map +1 -0
  76. package/build/lib/mcp/index.d.ts +3 -0
  77. package/build/lib/mcp/index.d.ts.map +1 -0
  78. package/build/lib/mcp/index.js +113 -0
  79. package/build/lib/mcp/index.js.map +1 -0
  80. package/build/lib/mcp/session.d.ts +24 -0
  81. package/build/lib/mcp/session.d.ts.map +1 -0
  82. package/build/lib/mcp/session.js +77 -0
  83. package/build/lib/mcp/session.js.map +1 -0
  84. package/build/lib/mcp/tools/advanced.d.ts +4 -0
  85. package/build/lib/mcp/tools/advanced.d.ts.map +1 -0
  86. package/build/lib/mcp/tools/advanced.js +119 -0
  87. package/build/lib/mcp/tools/advanced.js.map +1 -0
  88. package/build/lib/mcp/tools/app.d.ts +4 -0
  89. package/build/lib/mcp/tools/app.d.ts.map +1 -0
  90. package/build/lib/mcp/tools/app.js +64 -0
  91. package/build/lib/mcp/tools/app.js.map +1 -0
  92. package/build/lib/mcp/tools/clipboard.d.ts +4 -0
  93. package/build/lib/mcp/tools/clipboard.d.ts.map +1 -0
  94. package/build/lib/mcp/tools/clipboard.js +41 -0
  95. package/build/lib/mcp/tools/clipboard.js.map +1 -0
  96. package/build/lib/mcp/tools/find.d.ts +4 -0
  97. package/build/lib/mcp/tools/find.d.ts.map +1 -0
  98. package/build/lib/mcp/tools/find.js +119 -0
  99. package/build/lib/mcp/tools/find.js.map +1 -0
  100. package/build/lib/mcp/tools/index.d.ts +4 -0
  101. package/build/lib/mcp/tools/index.d.ts.map +1 -0
  102. package/build/lib/mcp/tools/index.js +24 -0
  103. package/build/lib/mcp/tools/index.js.map +1 -0
  104. package/build/lib/mcp/tools/inspect.d.ts +4 -0
  105. package/build/lib/mcp/tools/inspect.d.ts.map +1 -0
  106. package/build/lib/mcp/tools/inspect.js +106 -0
  107. package/build/lib/mcp/tools/inspect.js.map +1 -0
  108. package/build/lib/mcp/tools/interact.d.ts +4 -0
  109. package/build/lib/mcp/tools/interact.d.ts.map +1 -0
  110. package/build/lib/mcp/tools/interact.js +121 -0
  111. package/build/lib/mcp/tools/interact.js.map +1 -0
  112. package/build/lib/mcp/tools/patterns.d.ts +4 -0
  113. package/build/lib/mcp/tools/patterns.d.ts.map +1 -0
  114. package/build/lib/mcp/tools/patterns.js +136 -0
  115. package/build/lib/mcp/tools/patterns.js.map +1 -0
  116. package/build/lib/mcp/tools/session.d.ts +4 -0
  117. package/build/lib/mcp/tools/session.d.ts.map +1 -0
  118. package/build/lib/mcp/tools/session.js +55 -0
  119. package/build/lib/mcp/tools/session.js.map +1 -0
  120. package/build/lib/mcp/tools/window.d.ts +4 -0
  121. package/build/lib/mcp/tools/window.d.ts.map +1 -0
  122. package/build/lib/mcp/tools/window.js +134 -0
  123. package/build/lib/mcp/tools/window.js.map +1 -0
  124. package/build/lib/powershell/common.d.ts +39 -0
  125. package/build/lib/powershell/common.d.ts.map +1 -0
  126. package/build/lib/powershell/common.js +121 -0
  127. package/build/lib/powershell/common.js.map +1 -0
  128. package/build/lib/powershell/conditions.d.ts +24 -0
  129. package/build/lib/powershell/conditions.d.ts.map +1 -0
  130. package/build/lib/powershell/conditions.js +131 -0
  131. package/build/lib/powershell/conditions.js.map +1 -0
  132. package/build/lib/powershell/converter.d.ts +3 -0
  133. package/build/lib/powershell/converter.d.ts.map +1 -0
  134. package/build/lib/powershell/converter.js +273 -0
  135. package/build/lib/powershell/converter.js.map +1 -0
  136. package/build/lib/powershell/core.d.ts +8 -0
  137. package/build/lib/powershell/core.d.ts.map +1 -0
  138. package/build/lib/powershell/core.js +30 -0
  139. package/build/lib/powershell/core.js.map +1 -0
  140. package/build/lib/powershell/elements.d.ts +70 -0
  141. package/build/lib/powershell/elements.d.ts.map +1 -0
  142. package/build/lib/powershell/elements.js +523 -0
  143. package/build/lib/powershell/elements.js.map +1 -0
  144. package/build/lib/powershell/index.d.ts +8 -0
  145. package/build/lib/powershell/index.d.ts.map +1 -0
  146. package/build/lib/powershell/index.js +24 -0
  147. package/build/lib/powershell/index.js.map +1 -0
  148. package/build/lib/powershell/regex.d.ts +19 -0
  149. package/build/lib/powershell/regex.d.ts.map +1 -0
  150. package/build/lib/powershell/regex.js +68 -0
  151. package/build/lib/powershell/regex.js.map +1 -0
  152. package/build/lib/powershell/types.d.ts +155 -0
  153. package/build/lib/powershell/types.d.ts.map +1 -0
  154. package/build/lib/powershell/types.js +141 -0
  155. package/build/lib/powershell/types.js.map +1 -0
  156. package/build/lib/util.d.ts +17 -0
  157. package/build/lib/util.d.ts.map +1 -0
  158. package/build/lib/util.js +76 -0
  159. package/build/lib/util.js.map +1 -0
  160. package/build/lib/winapi/types/index.d.ts +8 -0
  161. package/build/lib/winapi/types/index.d.ts.map +1 -0
  162. package/build/lib/winapi/types/index.js +24 -0
  163. package/build/lib/winapi/types/index.js.map +1 -0
  164. package/build/lib/winapi/types/input.d.ts +11 -0
  165. package/build/lib/winapi/types/input.d.ts.map +1 -0
  166. package/build/lib/winapi/types/input.js +12 -0
  167. package/build/lib/winapi/types/input.js.map +1 -0
  168. package/build/lib/winapi/types/keyeventf.d.ts +13 -0
  169. package/build/lib/winapi/types/keyeventf.d.ts.map +1 -0
  170. package/build/lib/winapi/types/keyeventf.js +14 -0
  171. package/build/lib/winapi/types/keyeventf.js.map +1 -0
  172. package/build/lib/winapi/types/mouseeventf.d.ts +34 -0
  173. package/build/lib/winapi/types/mouseeventf.d.ts.map +1 -0
  174. package/build/lib/winapi/types/mouseeventf.js +37 -0
  175. package/build/lib/winapi/types/mouseeventf.js.map +1 -0
  176. package/build/lib/winapi/types/scancode.d.ts +95 -0
  177. package/build/lib/winapi/types/scancode.d.ts.map +1 -0
  178. package/build/lib/winapi/types/scancode.js +96 -0
  179. package/build/lib/winapi/types/scancode.js.map +1 -0
  180. package/build/lib/winapi/types/systemmetric.d.ts +214 -0
  181. package/build/lib/winapi/types/systemmetric.d.ts.map +1 -0
  182. package/build/lib/winapi/types/systemmetric.js +215 -0
  183. package/build/lib/winapi/types/systemmetric.js.map +1 -0
  184. package/build/lib/winapi/types/virtualkey.d.ts +353 -0
  185. package/build/lib/winapi/types/virtualkey.d.ts.map +1 -0
  186. package/build/lib/winapi/types/virtualkey.js +354 -0
  187. package/build/lib/winapi/types/virtualkey.js.map +1 -0
  188. package/build/lib/winapi/types/xmousebutton.d.ts +7 -0
  189. package/build/lib/winapi/types/xmousebutton.d.ts.map +1 -0
  190. package/build/lib/winapi/types/xmousebutton.js +8 -0
  191. package/build/lib/winapi/types/xmousebutton.js.map +1 -0
  192. package/build/lib/winapi/user32.d.ts +56 -0
  193. package/build/lib/winapi/user32.d.ts.map +1 -0
  194. package/build/lib/winapi/user32.js +592 -0
  195. package/build/lib/winapi/user32.js.map +1 -0
  196. package/build/lib/xpath/core.d.ts +8 -0
  197. package/build/lib/xpath/core.d.ts.map +1 -0
  198. package/build/lib/xpath/core.js +593 -0
  199. package/build/lib/xpath/core.js.map +1 -0
  200. package/build/lib/xpath/functions.d.ts +4 -0
  201. package/build/lib/xpath/functions.d.ts.map +1 -0
  202. package/build/lib/xpath/functions.js +271 -0
  203. package/build/lib/xpath/functions.js.map +1 -0
  204. package/build/lib/xpath/index.d.ts +3 -0
  205. package/build/lib/xpath/index.d.ts.map +1 -0
  206. package/build/lib/xpath/index.js +19 -0
  207. package/build/lib/xpath/index.js.map +1 -0
  208. package/package.json +71 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerFindTools = registerFindTools;
4
+ const zod_1 = require("zod");
5
+ const errors_js_1 = require("../errors.js");
6
+ const constants_js_1 = require("../constants.js");
7
+ const STRATEGIES = ['accessibility id', 'name', 'id', 'xpath', 'class name', 'tag name', '-windows uiautomation'];
8
+ // 'id' is documented as an alias for 'accessibility id' (UIA AutomationId).
9
+ // All other strategies are forwarded verbatim to the Appium/WinAppDriver protocol.
10
+ function resolveStrategy(strategy) {
11
+ return strategy === 'id' ? 'accessibility id' : strategy;
12
+ }
13
+ const STRATEGY_DESCRIPTIONS = {
14
+ 'accessibility id': 'Maps to UIA AutomationId — most stable selector, preferred for test automation. Use when the element has a non-empty AutomationId.',
15
+ 'name': 'Maps to UIA Name property (visible label/title). Reliable when text is static and not locale-dependent.',
16
+ 'id': 'Alias for accessibility id — maps to UIA AutomationId.',
17
+ 'xpath': 'Evaluates XPath against the live UIA tree. Use as fallback when no stable AutomationId or Name exists. Example: //Button[@Name="OK"]',
18
+ 'class name': 'Maps to UIA ClassName — rarely unique on its own; use to narrow results when combined with other strategies.',
19
+ 'tag name': 'Maps to UIA ControlType (e.g. "Button", "Edit", "TextBlock"). Rarely unique; useful for finding all elements of a type.',
20
+ '-windows uiautomation': 'Raw UIA condition expression for advanced compound queries.',
21
+ };
22
+ const StrategyEnum = zod_1.z.enum(STRATEGIES);
23
+ const FIND_STRATEGY_PRIORITY = [
24
+ 'Preferred strategy order for reliable automation:',
25
+ '1) "accessibility id" (AutomationId) — most stable, use whenever available',
26
+ '2) "name" — good for static labels not subject to localization',
27
+ '3) "xpath" — flexible fallback, e.g. //Button[@Name="OK"]',
28
+ '4) other strategies — use only when the above are unavailable.',
29
+ 'After interacting with an element you plan to use in generated test code, call get_element_info to capture the best locator.',
30
+ ].join(' ');
31
+ function registerFindTools(server, session) {
32
+ server.registerTool('find_element', {
33
+ description: `Find a single UI element in the current app window. Returns an element ID string to pass to other tools. Returns an error if not found. ${FIND_STRATEGY_PRIORITY}`,
34
+ inputSchema: {
35
+ strategy: StrategyEnum.describe('Locator strategy. ' +
36
+ Object.entries(STRATEGY_DESCRIPTIONS).map(([k, v]) => `"${k}": ${v}`).join(' | ')),
37
+ selector: zod_1.z.string().min(1).describe('The selector value for the chosen strategy'),
38
+ },
39
+ annotations: { readOnlyHint: true },
40
+ }, async ({ strategy, selector }) => {
41
+ try {
42
+ const driver = session.getDriver();
43
+ const rawEl = await driver.findElement(resolveStrategy(strategy), selector);
44
+ return { content: [{ type: 'text', text: rawEl[constants_js_1.ELEMENT_KEY] }] };
45
+ }
46
+ catch (err) {
47
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
48
+ }
49
+ });
50
+ server.registerTool('find_elements', {
51
+ description: `Find all UI elements matching the selector. Returns a JSON array of element ID strings. ${FIND_STRATEGY_PRIORITY}`,
52
+ inputSchema: {
53
+ strategy: StrategyEnum.describe('Locator strategy. ' +
54
+ Object.entries(STRATEGY_DESCRIPTIONS).map(([k, v]) => `"${k}": ${v}`).join(' | ')),
55
+ selector: zod_1.z.string().min(1).describe('The selector value for the chosen strategy'),
56
+ },
57
+ annotations: { readOnlyHint: true },
58
+ }, async ({ strategy, selector }) => {
59
+ try {
60
+ const driver = session.getDriver();
61
+ const rawEls = await driver.findElements(resolveStrategy(strategy), selector);
62
+ const ids = rawEls.map((el) => el[constants_js_1.ELEMENT_KEY]);
63
+ return { content: [{ type: 'text', text: JSON.stringify(ids) }] };
64
+ }
65
+ catch (err) {
66
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
67
+ }
68
+ });
69
+ server.registerTool('find_child_element', {
70
+ description: `Find a child element within a parent element. Returns an element ID string. ${FIND_STRATEGY_PRIORITY}`,
71
+ inputSchema: {
72
+ parentElementId: zod_1.z.string().min(1).describe('Element ID of the parent to search within'),
73
+ strategy: StrategyEnum.describe('Locator strategy. ' +
74
+ Object.entries(STRATEGY_DESCRIPTIONS).map(([k, v]) => `"${k}": ${v}`).join(' | ')),
75
+ selector: zod_1.z.string().min(1).describe('The selector value for the chosen strategy'),
76
+ },
77
+ annotations: { readOnlyHint: true },
78
+ }, async ({ parentElementId, strategy, selector }) => {
79
+ try {
80
+ const driver = session.getDriver();
81
+ const rawEl = await driver.findElementFromElement(parentElementId, resolveStrategy(strategy), selector);
82
+ return { content: [{ type: 'text', text: rawEl[constants_js_1.ELEMENT_KEY] }] };
83
+ }
84
+ catch (err) {
85
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
86
+ }
87
+ });
88
+ server.registerTool('wait_for_element', {
89
+ description: `Wait for a UI element to appear within a configurable timeout, then return its element ID. Useful after dialog opens, page transitions, or loading spinners disappear. ${FIND_STRATEGY_PRIORITY}`,
90
+ inputSchema: {
91
+ strategy: StrategyEnum.describe('Locator strategy. ' +
92
+ Object.entries(STRATEGY_DESCRIPTIONS).map(([k, v]) => `"${k}": ${v}`).join(' | ')),
93
+ selector: zod_1.z.string().min(1).describe('The selector value for the chosen strategy'),
94
+ timeoutMs: zod_1.z.number().int().min(0).default(5000).describe('Maximum time in milliseconds to wait for the element'),
95
+ pollIntervalMs: zod_1.z.number().int().min(50).default(200).describe('How often to retry in milliseconds'),
96
+ },
97
+ annotations: { readOnlyHint: true },
98
+ }, async ({ strategy, selector, timeoutMs, pollIntervalMs }) => {
99
+ const driver = session.getDriver();
100
+ const effectiveStrategy = resolveStrategy(strategy);
101
+ const deadline = Date.now() + timeoutMs;
102
+ while (true) {
103
+ try {
104
+ const rawEl = await driver.findElement(effectiveStrategy, selector);
105
+ return { content: [{ type: 'text', text: rawEl[constants_js_1.ELEMENT_KEY] }] };
106
+ }
107
+ catch {
108
+ if (Date.now() >= deadline) {
109
+ return {
110
+ isError: true,
111
+ content: [{ type: 'text', text: `Element not found within ${timeoutMs}ms: ${strategy}="${selector}"` }],
112
+ };
113
+ }
114
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
115
+ }
116
+ }
117
+ });
118
+ }
119
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../../lib/mcp/tools/find.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AppiumSession } from '../session.js';
3
+ export declare function registerAllTools(server: McpServer, session: AppiumSession): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAWnD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAUhF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAllTools = registerAllTools;
4
+ const session_js_1 = require("./session.js");
5
+ const find_js_1 = require("./find.js");
6
+ const interact_js_1 = require("./interact.js");
7
+ const inspect_js_1 = require("./inspect.js");
8
+ const window_js_1 = require("./window.js");
9
+ const advanced_js_1 = require("./advanced.js");
10
+ const patterns_js_1 = require("./patterns.js");
11
+ const app_js_1 = require("./app.js");
12
+ const clipboard_js_1 = require("./clipboard.js");
13
+ function registerAllTools(server, session) {
14
+ (0, session_js_1.registerSessionTools)(server, session);
15
+ (0, find_js_1.registerFindTools)(server, session);
16
+ (0, interact_js_1.registerInteractTools)(server, session);
17
+ (0, inspect_js_1.registerInspectTools)(server, session);
18
+ (0, window_js_1.registerWindowTools)(server, session);
19
+ (0, advanced_js_1.registerAdvancedTools)(server, session);
20
+ (0, patterns_js_1.registerPatternTools)(server, session);
21
+ (0, app_js_1.registerAppTools)(server, session);
22
+ (0, clipboard_js_1.registerClipboardTools)(server, session);
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/mcp/tools/index.ts"],"names":[],"mappings":";;AAYA,4CAUC;AApBD,6CAAoD;AACpD,uCAA8C;AAC9C,+CAAsD;AACtD,6CAAoD;AACpD,2CAAkD;AAClD,+CAAsD;AACtD,+CAAqD;AACrD,qCAA4C;AAC5C,iDAAwD;AAExD,SAAgB,gBAAgB,CAAC,MAAiB,EAAE,OAAsB;IACtE,IAAA,iCAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,2BAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,IAAA,mCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAA,iCAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,+BAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAA,mCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAA,kCAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,yBAAgB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAA,qCAAsB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AppiumSession } from '../session.js';
3
+ export declare function registerInspectTools(server: McpServer, session: AppiumSession): void;
4
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../../lib/mcp/tools/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAsFnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAkDpF"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerInspectTools = registerInspectTools;
4
+ const zod_1 = require("zod");
5
+ const errors_js_1 = require("../errors.js");
6
+ const constants_js_1 = require("../constants.js");
7
+ /**
8
+ * Build a ranked list of suggested selectors for test automation.
9
+ * Priority: accessibility id (AutomationId) > name > xpath combos.
10
+ */
11
+ function buildSuggestedSelectors(props) {
12
+ const suggestions = [];
13
+ // Derive the XPath tag name from ControlType (strip "ControlType." prefix if present)
14
+ const tag = props.controlType?.replace(/^ControlType\./, '') ?? null;
15
+ // 1. AutomationId via accessibility id — most reliable
16
+ if (props.automationId?.trim()) {
17
+ suggestions.push({
18
+ strategy: 'accessibility id',
19
+ selector: props.automationId,
20
+ reliability: 'high',
21
+ note: 'AutomationId — stable across locales and UI layout changes. Preferred for .NET: driver.FindElement(MobileBy.AccessibilityId("' + props.automationId + '"))',
22
+ });
23
+ }
24
+ // 2. XPath with AutomationId — explicit type + stable id
25
+ if (tag && props.automationId?.trim()) {
26
+ suggestions.push({
27
+ strategy: 'xpath',
28
+ selector: `//${tag}[@AutomationId="${props.automationId}"]`,
29
+ reliability: 'high',
30
+ note: 'XPath using AutomationId — use when you also want to assert the control type',
31
+ });
32
+ }
33
+ // 3. Name via name strategy — medium reliability (may change with locale)
34
+ if (props.name?.trim()) {
35
+ suggestions.push({
36
+ strategy: 'name',
37
+ selector: props.name,
38
+ reliability: 'medium',
39
+ note: 'Element Name — may change with localization or dynamic text. .NET: driver.FindElement(MobileBy.Name("' + props.name + '"))',
40
+ });
41
+ }
42
+ // 4. XPath with Name + ControlType
43
+ if (tag && props.name?.trim()) {
44
+ suggestions.push({
45
+ strategy: 'xpath',
46
+ selector: `//${tag}[@Name="${props.name}"]`,
47
+ reliability: 'medium',
48
+ note: 'XPath using Name — readable but locale-sensitive',
49
+ });
50
+ }
51
+ // 5. ClassName as fallback (rarely unique on its own)
52
+ if (props.className?.trim()) {
53
+ suggestions.push({
54
+ strategy: 'class name',
55
+ selector: props.className,
56
+ reliability: 'low',
57
+ note: 'ClassName — often shared by many elements; combine with other strategies in XPath',
58
+ });
59
+ }
60
+ return suggestions;
61
+ }
62
+ function registerInspectTools(server, session) {
63
+ server.registerTool('get_element_info', {
64
+ description: [
65
+ 'Retrieve all key UIA properties of an element and get ranked selector suggestions for test automation.',
66
+ 'Returns: Name, AutomationId, ClassName, ControlType, IsEnabled, and a prioritized list of selectors.',
67
+ 'ALWAYS call this after find_element when generating automated test code — it gives you the best locator to use.',
68
+ 'Selector reliability order: accessibility id (AutomationId) = highest → name → xpath → class name = lowest.',
69
+ 'For .NET/C# Appium: use MobileBy.AccessibilityId(automationId) when AutomationId is non-empty.',
70
+ ].join(' '),
71
+ inputSchema: {
72
+ elementId: zod_1.z.string().min(1).describe('Element ID returned by find_element'),
73
+ },
74
+ annotations: { readOnlyHint: true },
75
+ }, async ({ elementId }) => {
76
+ try {
77
+ const driver = session.getDriver();
78
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
79
+ // Fetch all relevant UIA properties in parallel
80
+ const [name, automationId, className, controlType, isEnabled] = await Promise.all([
81
+ el.getAttribute('Name').catch(() => null),
82
+ el.getAttribute('AutomationId').catch(() => null),
83
+ el.getAttribute('ClassName').catch(() => null),
84
+ el.getAttribute('ControlType').catch(() => null),
85
+ el.getAttribute('IsEnabled').catch(() => null),
86
+ ]);
87
+ const props = {
88
+ name: name || null,
89
+ automationId: automationId || null,
90
+ className: className || null,
91
+ controlType: controlType || null,
92
+ isEnabled: isEnabled || null,
93
+ };
94
+ const result = {
95
+ elementId,
96
+ ...props,
97
+ suggestedSelectors: buildSuggestedSelectors(props),
98
+ };
99
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
100
+ }
101
+ catch (err) {
102
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
103
+ }
104
+ });
105
+ }
106
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../../lib/mcp/tools/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AppiumSession } from '../session.js';
3
+ export declare function registerInteractTools(server: McpServer, session: AppiumSession): void;
4
+ //# sourceMappingURL=interact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact.d.ts","sourceRoot":"","sources":["../../../../lib/mcp/tools/interact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA2IrF"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerInteractTools = registerInteractTools;
4
+ const zod_1 = require("zod");
5
+ const errors_js_1 = require("../errors.js");
6
+ const constants_js_1 = require("../constants.js");
7
+ const elementIdSchema = zod_1.z.string().min(1).describe('Element ID returned by find_element');
8
+ function registerInteractTools(server, session) {
9
+ server.registerTool('click_element', {
10
+ description: 'Click a UI element by its element ID.',
11
+ inputSchema: { elementId: elementIdSchema },
12
+ annotations: { destructiveHint: false },
13
+ }, async ({ elementId }) => {
14
+ try {
15
+ const driver = session.getDriver();
16
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
17
+ await el.click();
18
+ return { content: [{ type: 'text', text: 'clicked' }] };
19
+ }
20
+ catch (err) {
21
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
22
+ }
23
+ });
24
+ server.registerTool('set_value', {
25
+ description: 'Set the text value of an input element (clears first then types).',
26
+ inputSchema: {
27
+ elementId: elementIdSchema,
28
+ value: zod_1.z.string().describe('The text value to set'),
29
+ },
30
+ annotations: { destructiveHint: false },
31
+ }, async ({ elementId, value }) => {
32
+ try {
33
+ const driver = session.getDriver();
34
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
35
+ await el.setValue(value);
36
+ return { content: [{ type: 'text', text: 'value set' }] };
37
+ }
38
+ catch (err) {
39
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
40
+ }
41
+ });
42
+ server.registerTool('clear_element', {
43
+ description: 'Clear the text content of an input element.',
44
+ inputSchema: { elementId: elementIdSchema },
45
+ annotations: { destructiveHint: false },
46
+ }, async ({ elementId }) => {
47
+ try {
48
+ const driver = session.getDriver();
49
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
50
+ await el.clearValue();
51
+ return { content: [{ type: 'text', text: 'cleared' }] };
52
+ }
53
+ catch (err) {
54
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
55
+ }
56
+ });
57
+ server.registerTool('get_text', {
58
+ description: 'Get the visible text content of a UI element.',
59
+ inputSchema: { elementId: elementIdSchema },
60
+ annotations: { readOnlyHint: true },
61
+ }, async ({ elementId }) => {
62
+ try {
63
+ const driver = session.getDriver();
64
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
65
+ const text = await el.getText();
66
+ return { content: [{ type: 'text', text }] };
67
+ }
68
+ catch (err) {
69
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
70
+ }
71
+ });
72
+ server.registerTool('get_attribute', {
73
+ description: 'Get an attribute or property of a UI element. Common attributes: Name, AutomationId, ClassName, IsEnabled, IsOffscreen, ControlType, Value.Value. Returns an empty string when the attribute is absent.',
74
+ inputSchema: {
75
+ elementId: elementIdSchema,
76
+ attribute: zod_1.z.string().min(1).describe('Attribute name, e.g. "Name", "IsEnabled", "ControlType"'),
77
+ },
78
+ annotations: { readOnlyHint: true },
79
+ }, async ({ elementId, attribute }) => {
80
+ try {
81
+ const driver = session.getDriver();
82
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
83
+ const value = await el.getAttribute(attribute);
84
+ return { content: [{ type: 'text', text: value ?? '' }] };
85
+ }
86
+ catch (err) {
87
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
88
+ }
89
+ });
90
+ server.registerTool('is_element_displayed', {
91
+ description: 'Check whether a UI element is visible on screen (not off-screen).',
92
+ inputSchema: { elementId: elementIdSchema },
93
+ annotations: { readOnlyHint: true },
94
+ }, async ({ elementId }) => {
95
+ try {
96
+ const driver = session.getDriver();
97
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
98
+ const displayed = await el.isDisplayed();
99
+ return { content: [{ type: 'text', text: String(displayed) }] };
100
+ }
101
+ catch (err) {
102
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
103
+ }
104
+ });
105
+ server.registerTool('is_element_enabled', {
106
+ description: 'Check whether a UI element is enabled and interactable.',
107
+ inputSchema: { elementId: elementIdSchema },
108
+ annotations: { readOnlyHint: true },
109
+ }, async ({ elementId }) => {
110
+ try {
111
+ const driver = session.getDriver();
112
+ const el = await driver.$({ [constants_js_1.ELEMENT_KEY]: elementId });
113
+ const enabled = await el.isEnabled();
114
+ return { content: [{ type: 'text', text: String(enabled) }] };
115
+ }
116
+ catch (err) {
117
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=interact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact.js","sourceRoot":"","sources":["../../../../lib/mcp/tools/interact.ts"],"names":[],"mappings":";;AAQA,sDA2IC;AAlJD,6BAAwB;AAExB,4CAA2C;AAC3C,kDAA8C;AAE9C,MAAM,eAAe,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC;AAE1F,SAAgB,qBAAqB,CAAC,MAAiB,EAAE,OAAsB;IAC3E,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,WAAW,EAAE,uCAAuC;QACpD,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;QAC3C,WAAW,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;KAC1C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,WAAW,EACX;QACI,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE;YACT,SAAS,EAAE,eAAe;YAC1B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACtD;QACD,WAAW,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;KAC1C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,WAAW,EAAE,6CAA6C;QAC1D,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;QAC3C,WAAW,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;KAC1C,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,UAAU,EACV;QACI,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;QAC3C,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACtC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,WAAW,EAAE,yMAAyM;QACtN,WAAW,EAAE;YACT,SAAS,EAAE,eAAe;YAC1B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yDAAyD,CAAC;SACnG;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACtC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,sBAAsB,EACtB;QACI,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;QAC3C,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACtC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,oBAAoB,EACpB;QACI,WAAW,EAAE,yDAAyD;QACtE,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;QAC3C,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACtC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AppiumSession } from '../session.js';
3
+ export declare function registerPatternTools(server: McpServer, session: AppiumSession): void;
4
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../lib/mcp/tools/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAkKpF"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPatternTools = registerPatternTools;
4
+ const zod_1 = require("zod");
5
+ const errors_js_1 = require("../errors.js");
6
+ const elementIdSchema = zod_1.z.string().min(1).describe('Element ID returned by find_element');
7
+ const elementIdInput = { elementId: elementIdSchema };
8
+ function registerPatternTools(server, session) {
9
+ server.registerTool('invoke_element', {
10
+ description: 'Invoke the default action of an element via the UIA Invoke pattern (e.g. click a button programmatically without mouse input).',
11
+ inputSchema: elementIdInput,
12
+ }, async ({ elementId }) => {
13
+ try {
14
+ const driver = session.getDriver();
15
+ await driver.executeScript('windows: invoke', [{ elementId }]);
16
+ return { content: [{ type: 'text', text: 'invoked' }] };
17
+ }
18
+ catch (err) {
19
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
20
+ }
21
+ });
22
+ server.registerTool('expand_element', {
23
+ description: 'Expand a collapsible element (tree node, combo box, menu) via the UIA ExpandCollapse pattern.',
24
+ inputSchema: elementIdInput,
25
+ annotations: { idempotentHint: true },
26
+ }, async ({ elementId }) => {
27
+ try {
28
+ const driver = session.getDriver();
29
+ await driver.executeScript('windows: expand', [{ elementId }]);
30
+ return { content: [{ type: 'text', text: 'expanded' }] };
31
+ }
32
+ catch (err) {
33
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
34
+ }
35
+ });
36
+ server.registerTool('collapse_element', {
37
+ description: 'Collapse an expanded element via the UIA ExpandCollapse pattern.',
38
+ inputSchema: elementIdInput,
39
+ annotations: { idempotentHint: true },
40
+ }, async ({ elementId }) => {
41
+ try {
42
+ const driver = session.getDriver();
43
+ await driver.executeScript('windows: collapse', [{ elementId }]);
44
+ return { content: [{ type: 'text', text: 'collapsed' }] };
45
+ }
46
+ catch (err) {
47
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
48
+ }
49
+ });
50
+ server.registerTool('toggle_element', {
51
+ description: 'Toggle a checkbox or toggle button via the UIA Toggle pattern. To confirm the resulting state, call get_toggle_state after this.',
52
+ inputSchema: elementIdInput,
53
+ }, async ({ elementId }) => {
54
+ try {
55
+ const driver = session.getDriver();
56
+ await driver.executeScript('windows: toggle', [{ elementId }]);
57
+ return { content: [{ type: 'text', text: 'toggled' }] };
58
+ }
59
+ catch (err) {
60
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
61
+ }
62
+ });
63
+ server.registerTool('get_toggle_state', {
64
+ description: 'Get the toggle state of a checkbox or toggle button via the UIA Toggle pattern. Returns "On", "Off", or "Indeterminate".',
65
+ inputSchema: elementIdInput,
66
+ annotations: { readOnlyHint: true },
67
+ }, async ({ elementId }) => {
68
+ try {
69
+ const driver = session.getDriver();
70
+ const result = await driver.executeScript('windows: getToggleState', [{ elementId }]);
71
+ return { content: [{ type: 'text', text: String(result) }] };
72
+ }
73
+ catch (err) {
74
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
75
+ }
76
+ });
77
+ server.registerTool('set_element_value', {
78
+ description: 'Set the value of an element via the UIA Value or RangeValue pattern (e.g. sliders, spin boxes).',
79
+ inputSchema: {
80
+ elementId: elementIdSchema,
81
+ value: zod_1.z.string().describe('The value to set'),
82
+ },
83
+ annotations: { destructiveHint: false },
84
+ }, async ({ elementId, value }) => {
85
+ try {
86
+ const driver = session.getDriver();
87
+ await driver.executeScript('windows: setValue', [{ elementId, value }]);
88
+ return { content: [{ type: 'text', text: 'value set' }] };
89
+ }
90
+ catch (err) {
91
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
92
+ }
93
+ });
94
+ server.registerTool('get_element_value', {
95
+ description: 'Get the value of an element via the UIA Value pattern.',
96
+ inputSchema: elementIdInput,
97
+ annotations: { readOnlyHint: true },
98
+ }, async ({ elementId }) => {
99
+ try {
100
+ const driver = session.getDriver();
101
+ const result = await driver.executeScript('windows: getValue', [{ elementId }]);
102
+ return { content: [{ type: 'text', text: String(result) }] };
103
+ }
104
+ catch (err) {
105
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
106
+ }
107
+ });
108
+ server.registerTool('focus_element', {
109
+ description: 'Set focus to an element via the UIA Focus pattern (windows: setFocus). Required before keyboard-driven interactions such as send_keys on a specific control.',
110
+ inputSchema: elementIdInput,
111
+ annotations: { idempotentHint: true },
112
+ }, async ({ elementId }) => {
113
+ try {
114
+ const driver = session.getDriver();
115
+ await driver.executeScript('windows: setFocus', [{ elementId }]);
116
+ return { content: [{ type: 'text', text: 'focused' }] };
117
+ }
118
+ catch (err) {
119
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
120
+ }
121
+ });
122
+ server.registerTool('select_item', {
123
+ description: 'Select an item in a list box, tab control, or combo box via the UIA SelectionItem pattern (windows: select). Use when click does not trigger selection.',
124
+ inputSchema: elementIdInput,
125
+ }, async ({ elementId }) => {
126
+ try {
127
+ const driver = session.getDriver();
128
+ await driver.executeScript('windows: select', [{ elementId }]);
129
+ return { content: [{ type: 'text', text: 'selected' }] };
130
+ }
131
+ catch (err) {
132
+ return { isError: true, content: [{ type: 'text', text: (0, errors_js_1.formatError)(err) }] };
133
+ }
134
+ });
135
+ }
136
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../lib/mcp/tools/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { AppiumSession } from '../session.js';
3
+ export declare function registerSessionTools(server: McpServer, session: AppiumSession): void;
4
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../lib/mcp/tools/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+DpF"}