appium-mcp 1.6.0 → 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.
- package/.github/dependabot.yml +17 -0
- package/.github/workflows/ci.yml +7 -3
- package/.github/workflows/pr-title.yml +4 -9
- package/.github/workflows/publish.yml +4 -4
- package/CHANGELOG.md +12 -0
- package/dist/tools/app-management/list-apps.js +5 -1
- package/dist/tools/app-management/list-apps.js.map +1 -1
- package/dist/tools/context/get-contexts.js +5 -1
- package/dist/tools/context/get-contexts.js.map +1 -1
- package/dist/tools/interactions/get-page-source.js +5 -1
- package/dist/tools/interactions/get-page-source.js.map +1 -1
- package/dist/tools/interactions/screenshot.js +5 -1
- package/dist/tools/interactions/screenshot.js.map +1 -1
- package/dist/tools/session/create-session.js +18 -3
- package/dist/tools/session/create-session.js.map +1 -1
- package/dist/tools/session/select-device.js +9 -2
- package/dist/tools/session/select-device.js.map +1 -1
- package/dist/tools/test-generation/locators.js +5 -1
- package/dist/tools/test-generation/locators.js.map +1 -1
- package/dist/ui/mcp-ui-utils.d.ts +111 -0
- package/dist/ui/mcp-ui-utils.js +1542 -0
- package/dist/ui/mcp-ui-utils.js.map +1 -0
- package/package.json +5 -5
- package/src/tools/app-management/list-apps.ts +14 -1
- package/src/tools/context/get-contexts.ts +14 -1
- package/src/tools/interactions/get-page-source.ts +14 -1
- package/src/tools/interactions/screenshot.ts +14 -1
- package/src/tools/session/create-session.ts +29 -3
- package/src/tools/session/select-device.ts +23 -2
- package/src/tools/test-generation/locators.ts +15 -1
- package/src/ui/mcp-ui-utils.ts +1630 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-ui-utils.js","sourceRoot":"","sources":["../../src/ui/mcp-ui-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,WAAmB;IASnB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,GAAG;YACH,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,WAAW;SAClB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAKE,EACF,QAA2B,EAC3B,UAAiC;IAEjC,MAAM,eAAe,GACnB,QAAQ,KAAK,KAAK,IAAI,UAAU;QAC9B,CAAC,CAAC,UAAU,KAAK,WAAW;YAC1B,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,aAAa;QACjB,CAAC,CAAC,iBAAiB,CAAC;IAExB,MAAM,WAAW,GAAG,OAAO;SACxB,GAAG,CACF,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;0CACiB,MAAM,CAAC,IAAI,iBAAiB,KAAK;;cAE7D,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI;UAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE;;;0CAGrE,MAAM,CAAC,IAAI;UAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;;iEAEV,MAAM,CAAC,IAAI;;;;GAIzE,CACE;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;2BAMkB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoHpB,eAAe;iBACpB,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;QAGhE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iDAAiD;;;;;;;;;;;yBAWnE,QAAQ;cACnB,UAAU,CAAC,CAAC,CAAC,gBAAgB,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;GAkB3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,gBAAwB,EACxB,QAAgB;IAEhB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA2HwB,QAAQ;;;;;;;;wCAQD,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA0C/B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;GAuBnE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAOxC;IACC,qCAAqC;IACrC,MAAM,YAAY,GAChB,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;QACvC,CAAC,CAAC,WAAW,CAAC,SAAS;QACvB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;IAEjD,gEAAgE;IAChE,MAAM,gBAAgB,GACpB,YAAY,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK;QACtC,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAuHU,gBAAgB;;;;mBAIhB,WAAW,CAAC,QAAQ;;;;mBAIpB,WAAW,CAAC,cAAc;;UAGnC,WAAW,CAAC,UAAU;QACpB,CAAC,CAAC;;;mBAGK,WAAW,CAAC,UAAU;;SAEhC;QACG,CAAC,CAAC,EACN;UAEE,WAAW,CAAC,eAAe;QACzB,CAAC,CAAC;;;mBAGK,WAAW,CAAC,eAAe;;SAErC;QACG,CAAC,CAAC,EACN;UAEE,WAAW,CAAC,IAAI;QACd,CAAC,CAAC;;;kDAGoC,WAAW,CAAC,IAAI;;SAEzD;QACG,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEL,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,QASE;IAEF,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CACF,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;4CACkB,KAAK;;cAEnC,OAAO,CAAC,OAAO;;YAEjB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,EAAE;YAC/E,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;YACzE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,EAAE;;;QAGnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,kDAAkD,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;QACxF,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,0DAA0D,OAAO,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,EAAE;QAC9G,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,+DAA+D,OAAO,CAAC,UAAU,aAAa,CAAC,CAAC,CAAC,EAAE;;UAEtH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC/B,GAAG,CACF,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;qCAED,QAAQ;qCACR,QAAQ;6DACgB,QAAQ,QAAQ,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;SAEjG,CACE;SACA,IAAI,CAAC,EAAE,CAAC;;;GAGhB,CACE;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgIQ,QAAQ,CAAC,MAAM,wBAAwB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;QAGhF,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B;;;;;;;;;;;;;;;;;;;GAmBpE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,UAAkB;IAC5D,+BAA+B;IAC/B,MAAM,aAAa,GAAG,UAAU;SAC7B,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAoGkB,UAAU,CAAC,MAAM;;;;;;;;;;+CAUG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAsC5B,aAAa;;;;;;;;;;;;GAY1C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAkB,EAClB,cAA6B;IAE7B,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CACF,OAAO,CAAC,EAAE,CAAC;+BACc,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;mCACtC,OAAO;;cAE5B,OAAO;UACX,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,EAAE;;;UAG5E,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;;oFAEiB,OAAO;UACjF,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;;;GAGxD,CACE;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0GQ,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;QAGnE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B;;;;;;;;;;;;;;;;;;GAkBxE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAsD;IAEtD,MAAM,QAAQ,GAAG,IAAI;SAClB,GAAG,CACF,GAAG,CAAC,EAAE,CAAC;0CAC6B,GAAG,CAAC,WAAW;;cAE3C,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,WAAW;;;6CAGC,GAAG,CAAC,WAAW;;;gEAGI,GAAG,CAAC,WAAW;mEACZ,GAAG,CAAC,WAAW;gEAClB,GAAG,CAAC,WAAW;;;GAG5E,CACE;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAyHU,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;;;;QAKzD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DxD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,WAAmB,MAAM;IAEzB,+BAA+B;IAC/B,MAAM,WAAW,GAAG,IAAI;SACrB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA4F4B,QAAQ;oDACO,IAAI,CAAC,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;;;;;;;;;iDAStD,WAAW;;;;;;;;;;;;;;;;+BAgB7B,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;GAsB/D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAA6D,EAC7D,UAA+C;IAE/C,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;KAC3C,CAAC;AACJ,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.
|
|
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
|
|
21
|
-
"start:stdio": "node
|
|
22
|
-
"start:httpStream": "node
|
|
23
|
-
"start:httpStream:port": "node
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: ${
|
|
265
|
+
`${platform.toUpperCase()} session created successfully with ID: ${sessionIdStr}`
|
|
255
266
|
);
|
|
256
267
|
|
|
257
|
-
|
|
268
|
+
const textResponse = {
|
|
258
269
|
content: [
|
|
259
270
|
{
|
|
260
271
|
type: 'text',
|
|
261
|
-
text: `${platform.toUpperCase()} session created successfully with ID: ${
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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}`);
|