appium-mcp 1.6.1 → 1.7.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-ui-utils.js","sourceRoot":"","sources":["../../src/ui/mcp-ui-utils.ts"],"names":[],"mappings":"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"}
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.6.1",
4
+ "version": "1.7.0",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -17,10 +17,10 @@
17
17
  "scripts": {
18
18
  "build": "rimraf dist && tsc && chmod +x dist/index.js && npm run copy-docs",
19
19
  "copy-docs": "mkdir -p dist/tools/documentation/uploads && cp -f src/tools/documentation/uploads/documents.json dist/tools/documentation/uploads/documents.json 2>/dev/null || true",
20
- "start": "node src/index.js",
21
- "start:stdio": "node src/index.js",
22
- "start:httpStream": "node src/index.js --httpStream",
23
- "start:httpStream:port": "node src/index.js --httpStream --port=",
20
+ "start": "node dist/index.js",
21
+ "start:stdio": "node dist/index.js",
22
+ "start:httpStream": "node dist/index.js --httpStream",
23
+ "start:httpStream:port": "node dist/index.js --httpStream --port=",
24
24
  "dev": "npx fastmcp dev src/index.js",
25
25
  "inspect": "npx fastmcp inspect src/index.js",
26
26
  "test": "NODE_OPTIONS=--experimental-vm-modules jest",
@@ -1,6 +1,11 @@
1
1
  import { FastMCP } from 'fastmcp/dist/FastMCP.js';
2
2
  import { z } from 'zod';
3
3
  import { getDriver, getPlatformName } from '../../session-store.js';
4
+ import {
5
+ createUIResource,
6
+ createAppListUI,
7
+ addUIResourceToResponse,
8
+ } from '../../ui/mcp-ui-utils.js';
4
9
 
5
10
  async function listAppsFromDevice(): Promise<any[]> {
6
11
  const driver = await getDriver();
@@ -42,7 +47,7 @@ export default function listApps(server: FastMCP): void {
42
47
  execute: async () => {
43
48
  try {
44
49
  const apps = await listAppsFromDevice();
45
- return {
50
+ const textResponse = {
46
51
  content: [
47
52
  {
48
53
  type: 'text',
@@ -50,6 +55,14 @@ export default function listApps(server: FastMCP): void {
50
55
  },
51
56
  ],
52
57
  };
58
+
59
+ // Add interactive app list UI
60
+ const uiResource = createUIResource(
61
+ `ui://appium-mcp/app-list/${Date.now()}`,
62
+ createAppListUI(apps)
63
+ );
64
+
65
+ return addUIResourceToResponse(textResponse, uiResource);
53
66
  } catch (err: any) {
54
67
  return {
55
68
  content: [
@@ -1,6 +1,11 @@
1
1
  import { FastMCP } from 'fastmcp/dist/FastMCP.js';
2
2
  import { z } from 'zod';
3
3
  import { getDriver } from '../../session-store.js';
4
+ import {
5
+ createUIResource,
6
+ createContextSwitcherUI,
7
+ addUIResourceToResponse,
8
+ } from '../../ui/mcp-ui-utils.js';
4
9
 
5
10
  export default function getContexts(server: FastMCP): void {
6
11
  server.addTool({
@@ -35,7 +40,7 @@ export default function getContexts(server: FastMCP): void {
35
40
  };
36
41
  }
37
42
 
38
- return {
43
+ const textResponse = {
39
44
  content: [
40
45
  {
41
46
  type: 'text',
@@ -43,6 +48,14 @@ export default function getContexts(server: FastMCP): void {
43
48
  },
44
49
  ],
45
50
  };
51
+
52
+ // Add interactive context switcher UI
53
+ const uiResource = createUIResource(
54
+ `ui://appium-mcp/context-switcher/${Date.now()}`,
55
+ createContextSwitcherUI(contexts, currentContext)
56
+ );
57
+
58
+ return addUIResourceToResponse(textResponse, uiResource);
46
59
  } catch (err: any) {
47
60
  return {
48
61
  content: [
@@ -1,6 +1,11 @@
1
1
  import { FastMCP } from 'fastmcp/dist/FastMCP.js';
2
2
  import { z } from 'zod';
3
3
  import { getDriver } from '../../session-store.js';
4
+ import {
5
+ createUIResource,
6
+ createPageSourceInspectorUI,
7
+ addUIResourceToResponse,
8
+ } from '../../ui/mcp-ui-utils.js';
4
9
 
5
10
  export default function getPageSource(server: FastMCP): void {
6
11
  server.addTool({
@@ -24,7 +29,7 @@ export default function getPageSource(server: FastMCP): void {
24
29
  throw new Error('Page source is empty or null');
25
30
  }
26
31
 
27
- return {
32
+ const textResponse = {
28
33
  content: [
29
34
  {
30
35
  type: 'text',
@@ -36,6 +41,14 @@ export default function getPageSource(server: FastMCP): void {
36
41
  },
37
42
  ],
38
43
  };
44
+
45
+ // Add interactive page source inspector UI
46
+ const uiResource = createUIResource(
47
+ `ui://appium-mcp/page-source-inspector/${Date.now()}`,
48
+ createPageSourceInspectorUI(pageSource)
49
+ );
50
+
51
+ return addUIResourceToResponse(textResponse, uiResource);
39
52
  } catch (err: any) {
40
53
  return {
41
54
  content: [
@@ -2,6 +2,11 @@ import { FastMCP } from 'fastmcp/dist/FastMCP.js';
2
2
  import { getDriver } from '../../session-store.js';
3
3
  import { writeFile, mkdir } from 'fs/promises';
4
4
  import { join, isAbsolute } from 'path';
5
+ import {
6
+ createUIResource,
7
+ createScreenshotViewerUI,
8
+ addUIResourceToResponse,
9
+ } from '../../ui/mcp-ui-utils.js';
5
10
 
6
11
  /**
7
12
  * Resolves the screenshot directory path.
@@ -66,7 +71,7 @@ export async function executeScreenshot(
66
71
  // Save screenshot to disk
67
72
  await deps.writeFile(filepath, screenshotBuffer);
68
73
 
69
- return {
74
+ const textResponse = {
70
75
  content: [
71
76
  {
72
77
  type: 'text',
@@ -74,6 +79,14 @@ export async function executeScreenshot(
74
79
  },
75
80
  ],
76
81
  };
82
+
83
+ // Add interactive screenshot viewer UI
84
+ const uiResource = createUIResource(
85
+ `ui://appium-mcp/screenshot-viewer/${Date.now()}`,
86
+ createScreenshotViewerUI(screenshotBase64, filepath)
87
+ );
88
+
89
+ return addUIResourceToResponse(textResponse, uiResource);
77
90
  } catch (err: any) {
78
91
  return {
79
92
  content: [
@@ -19,6 +19,11 @@ import {
19
19
  } from './select-device.js';
20
20
  import { IOSManager } from '../../devicemanager/ios-manager.js';
21
21
  import log from '../../logger.js';
22
+ import {
23
+ createUIResource,
24
+ createSessionDashboardUI,
25
+ addUIResourceToResponse,
26
+ } from '../../ui/mcp-ui-utils.js';
22
27
 
23
28
  // Define capabilities type
24
29
  interface Capabilities {
@@ -250,18 +255,39 @@ export default function createSession(server: any): void {
250
255
  const sessionId = await createDriverSession(driver, finalCapabilities);
251
256
  setSession(driver, sessionId);
252
257
 
258
+ // Safely convert sessionId to string for display
259
+ const sessionIdStr =
260
+ typeof sessionId === 'string'
261
+ ? sessionId
262
+ : String(sessionId || 'Unknown');
263
+
253
264
  log.info(
254
- `${platform.toUpperCase()} session created successfully with ID: ${sessionId}`
265
+ `${platform.toUpperCase()} session created successfully with ID: ${sessionIdStr}`
255
266
  );
256
267
 
257
- return {
268
+ const textResponse = {
258
269
  content: [
259
270
  {
260
271
  type: 'text',
261
- text: `${platform.toUpperCase()} session created successfully with ID: ${sessionId}\nPlatform: ${finalCapabilities.platformName}\nAutomation: ${finalCapabilities['appium:automationName']}\nDevice: ${finalCapabilities['appium:deviceName']}`,
272
+ text: `${platform.toUpperCase()} session created successfully with ID: ${sessionIdStr}\nPlatform: ${finalCapabilities.platformName}\nAutomation: ${finalCapabilities['appium:automationName']}\nDevice: ${finalCapabilities['appium:deviceName']}`,
262
273
  },
263
274
  ],
264
275
  };
276
+
277
+ // Add interactive session dashboard UI
278
+ const uiResource = createUIResource(
279
+ `ui://appium-mcp/session-dashboard/${sessionIdStr}`,
280
+ createSessionDashboardUI({
281
+ sessionId: sessionIdStr,
282
+ platform: finalCapabilities.platformName,
283
+ automationName: finalCapabilities['appium:automationName'],
284
+ deviceName: finalCapabilities['appium:deviceName'],
285
+ platformVersion: finalCapabilities['appium:platformVersion'],
286
+ udid: finalCapabilities['appium:udid'],
287
+ })
288
+ );
289
+
290
+ return addUIResourceToResponse(textResponse, uiResource);
265
291
  } catch (error: any) {
266
292
  log.error('Error creating session:', error);
267
293
  throw new Error(`Failed to create session: ${error.message}`);
@@ -5,6 +5,11 @@ import { ADBManager } from '../../devicemanager/adb-manager.js';
5
5
  import { IOSManager } from '../../devicemanager/ios-manager.js';
6
6
  import { z } from 'zod';
7
7
  import log from '../../logger.js';
8
+ import {
9
+ createUIResource,
10
+ createDevicePickerUI,
11
+ addUIResourceToResponse,
12
+ } from '../../ui/mcp-ui-utils.js';
8
13
 
9
14
  // Store selected device globally
10
15
  let selectedDeviceUdid: string | null = null;
@@ -92,7 +97,7 @@ function formatAndroidListResponse(devices: any[]): any {
92
97
  .map((device, index) => ` ${index + 1}. ${device.udid}`)
93
98
  .join('\n');
94
99
 
95
- return {
100
+ const textResponse = {
96
101
  content: [
97
102
  {
98
103
  type: 'text',
@@ -100,6 +105,14 @@ function formatAndroidListResponse(devices: any[]): any {
100
105
  },
101
106
  ],
102
107
  };
108
+
109
+ // Add interactive UI picker
110
+ const uiResource = createUIResource(
111
+ `ui://appium-mcp/device-picker/android-${Date.now()}`,
112
+ createDevicePickerUI(devices, 'android')
113
+ );
114
+
115
+ return addUIResourceToResponse(textResponse, uiResource);
103
116
  }
104
117
 
105
118
  /**
@@ -202,7 +215,7 @@ function formatIOSListResponse(
202
215
  )
203
216
  .join('\n');
204
217
 
205
- return {
218
+ const textResponse = {
206
219
  content: [
207
220
  {
208
221
  type: 'text',
@@ -210,6 +223,14 @@ function formatIOSListResponse(
210
223
  },
211
224
  ],
212
225
  };
226
+
227
+ // Add interactive UI picker
228
+ const uiResource = createUIResource(
229
+ `ui://appium-mcp/device-picker/ios-${iosDeviceType}-${Date.now()}`,
230
+ createDevicePickerUI(devices, 'ios', iosDeviceType)
231
+ );
232
+
233
+ return addUIResourceToResponse(textResponse, uiResource);
213
234
  }
214
235
 
215
236
  /**
@@ -13,6 +13,11 @@ import { z } from 'zod';
13
13
  import { getDriver } from '../../session-store.js';
14
14
  import { generateAllElementLocators } from '../../locators/generate-all-locators.js';
15
15
  import log from '../../logger.js';
16
+ import {
17
+ createUIResource,
18
+ createLocatorGeneratorUI,
19
+ addUIResourceToResponse,
20
+ } from '../../ui/mcp-ui-utils.js';
16
21
 
17
22
  export default function generateLocators(server: any): void {
18
23
  server.addTool({
@@ -56,7 +61,8 @@ export default function generateLocators(server: any): void {
56
61
  fetchableOnly: true,
57
62
  }
58
63
  );
59
- return {
64
+
65
+ const textResponse = {
60
66
  content: [
61
67
  {
62
68
  type: 'text',
@@ -69,6 +75,14 @@ export default function generateLocators(server: any): void {
69
75
  },
70
76
  ],
71
77
  };
78
+
79
+ // Add interactive locator generator UI
80
+ const uiResource = createUIResource(
81
+ `ui://appium-mcp/locator-generator/${Date.now()}`,
82
+ createLocatorGeneratorUI(interactableElements)
83
+ );
84
+
85
+ return addUIResourceToResponse(textResponse, uiResource);
72
86
  } catch (parseError: any) {
73
87
  log.error('Error parsing XML:', parseError);
74
88
  throw new Error(`Failed to parse XML: ${parseError.message}`);