appium-mcp 1.76.0 → 1.78.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 (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +169 -70
  3. package/dist/cli/index.d.ts +2 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +49 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/command.js +1 -1
  8. package/dist/command.js.map +1 -1
  9. package/dist/core.d.ts +12 -0
  10. package/dist/core.d.ts.map +1 -0
  11. package/dist/core.js +10 -0
  12. package/dist/core.js.map +1 -0
  13. package/dist/create-server.d.ts +50 -0
  14. package/dist/create-server.d.ts.map +1 -0
  15. package/dist/create-server.js +180 -0
  16. package/dist/create-server.js.map +1 -0
  17. package/dist/index.js +2 -36
  18. package/dist/index.js.map +1 -1
  19. package/dist/plugin.d.ts +209 -0
  20. package/dist/plugin.d.ts.map +1 -0
  21. package/dist/plugin.js +367 -0
  22. package/dist/plugin.js.map +1 -0
  23. package/dist/server.d.ts +1 -2
  24. package/dist/server.d.ts.map +1 -1
  25. package/dist/server.js +2 -67
  26. package/dist/server.js.map +1 -1
  27. package/dist/session-store.d.ts +8 -8
  28. package/dist/session-store.d.ts.map +1 -1
  29. package/dist/session-store.js +3 -2
  30. package/dist/session-store.js.map +1 -1
  31. package/dist/tests/__mocks__/@appium/support.d.ts +54 -61
  32. package/dist/tests/__mocks__/@appium/support.d.ts.map +1 -1
  33. package/dist/tests/__mocks__/@appium/support.js +42 -70
  34. package/dist/tests/__mocks__/@appium/support.js.map +1 -1
  35. package/dist/tests/create-server.test.d.ts +2 -0
  36. package/dist/tests/create-server.test.d.ts.map +1 -0
  37. package/dist/tests/create-server.test.js +253 -0
  38. package/dist/tests/create-server.test.js.map +1 -0
  39. package/dist/tests/plugin.test.d.ts +2 -0
  40. package/dist/tests/plugin.test.d.ts.map +1 -0
  41. package/dist/tests/plugin.test.js +340 -0
  42. package/dist/tests/plugin.test.js.map +1 -0
  43. package/dist/tests/tools/llm-wording.test.js +4 -1
  44. package/dist/tests/tools/llm-wording.test.js.map +1 -1
  45. package/dist/tests/verify.test.d.ts +2 -0
  46. package/dist/tests/verify.test.d.ts.map +1 -0
  47. package/dist/tests/verify.test.js +133 -0
  48. package/dist/tests/verify.test.js.map +1 -0
  49. package/dist/tests/vision-finder.test.d.ts +1 -1
  50. package/dist/tests/vision-finder.test.js +24 -6
  51. package/dist/tests/vision-finder.test.js.map +1 -1
  52. package/package.json +13 -1
  53. package/scripts/verify-names.mjs +12 -0
  54. package/server.json +2 -2
  55. package/src/cli/index.ts +58 -0
  56. package/src/command.ts +1 -1
  57. package/src/core.ts +28 -0
  58. package/src/create-server.ts +252 -0
  59. package/src/index.ts +2 -42
  60. package/src/plugin.ts +557 -0
  61. package/src/resources/submodules.zip +0 -0
  62. package/src/server.ts +2 -87
  63. package/src/session-store.ts +12 -11
@@ -1,53 +1,19 @@
1
1
  export declare const logger: {
2
2
  getLogger: (_name: string) => {
3
- debug: (_message: string, ..._args: any[]) => void;
4
- info: (_message: string, ..._args: any[]) => void;
5
- warn: (_message: string, ..._args: any[]) => void;
6
- error: (_message: string, ..._args: any[]) => void;
7
- trace: (_message: string, ..._args: any[]) => void;
3
+ debug: () => void;
4
+ info: () => void;
5
+ warn: () => void;
6
+ error: () => void;
7
+ trace: () => void;
8
8
  };
9
9
  };
10
- /**
11
- * Mock imageUtil for Jest tests.
12
- *
13
- * A single shared sharpInstance is used across all calls so tests can
14
- * inspect and override its methods (resize / jpeg / toBuffer) via
15
- * mockSharpInstance exported below.
16
- */
17
- export type MockSharpInstance = {
18
- resizeCalls: Array<[number, number]>;
19
- toBufferImpl: () => Promise<Buffer>;
20
- resize: (w: number, h: number) => MockSharpInstance;
21
- jpeg: (_opts?: unknown) => MockSharpInstance;
22
- toBuffer: () => Promise<Buffer>;
23
- reset: () => void;
24
- };
25
- /** Shared instance – tests can mutate toBufferImpl or inspect resizeCalls */
26
- export declare const mockSharpInstance: MockSharpInstance;
27
- export declare const imageUtil: {
28
- requireSharp: () => (_input: Buffer) => MockSharpInstance;
29
- };
30
- export declare const net: {
31
- downloadFile: (_remoteUrl: string, _dstPath: string, _opts?: unknown) => Promise<void>;
32
- };
33
- export declare const plist: {
34
- parsePlistFile: (_plistPath: string) => Promise<{}>;
35
- };
36
- export declare const zip: {
37
- extractAllTo: (_zipPath: string, _destDir: string, _opts?: unknown) => Promise<void>;
38
- readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
39
- toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
40
- };
41
- /**
42
- * Minimal `fs` mock that delegates to node:fs/promises so test code touching
43
- * the real filesystem continues to work.
44
- */
45
10
  export declare const fs: {
11
+ hasAccess: (p: string) => Promise<boolean>;
46
12
  exists: (p: string) => Promise<boolean>;
47
13
  readdir: (p: string) => Promise<string[]>;
48
14
  stat: (p: string) => Promise<import("node:fs").Stats>;
49
15
  readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
50
- writeFile: (p: string, data: string | Buffer) => Promise<void>;
16
+ writeFile: (p: string, data: string | Buffer, encoding?: BufferEncoding) => Promise<void>;
51
17
  unlink: (p: string) => Promise<void>;
52
18
  rename: (from: string, to: string) => Promise<void>;
53
19
  mkdir: (p: string, opts?: {
@@ -56,36 +22,43 @@ export declare const fs: {
56
22
  mkdirp: (p: string) => Promise<string | undefined>;
57
23
  mv: (from: string, to: string) => Promise<void>;
58
24
  };
25
+ export declare const imageUtil: {
26
+ requireSharp: () => never;
27
+ };
28
+ export declare const util: {
29
+ wrapElement: (elementId: string) => {
30
+ ELEMENT: string;
31
+ 'element-6066-11e4-a52e-4f735466cecf': string;
32
+ };
33
+ };
34
+ export declare const net: {
35
+ downloadFile: () => Promise<void>;
36
+ };
37
+ export declare const plist: {
38
+ parsePlistFile: () => Promise<{}>;
39
+ };
40
+ export declare const zip: {
41
+ extractAllTo: () => Promise<void>;
42
+ readEntries: () => Promise<void>;
43
+ toArchive: () => Promise<void>;
44
+ };
59
45
  declare const _default: {
60
46
  logger: {
61
47
  getLogger: (_name: string) => {
62
- debug: (_message: string, ..._args: any[]) => void;
63
- info: (_message: string, ..._args: any[]) => void;
64
- warn: (_message: string, ..._args: any[]) => void;
65
- error: (_message: string, ..._args: any[]) => void;
66
- trace: (_message: string, ..._args: any[]) => void;
48
+ debug: () => void;
49
+ info: () => void;
50
+ warn: () => void;
51
+ error: () => void;
52
+ trace: () => void;
67
53
  };
68
54
  };
69
- imageUtil: {
70
- requireSharp: () => (_input: Buffer) => MockSharpInstance;
71
- };
72
- net: {
73
- downloadFile: (_remoteUrl: string, _dstPath: string, _opts?: unknown) => Promise<void>;
74
- };
75
- plist: {
76
- parsePlistFile: (_plistPath: string) => Promise<{}>;
77
- };
78
- zip: {
79
- extractAllTo: (_zipPath: string, _destDir: string, _opts?: unknown) => Promise<void>;
80
- readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
81
- toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
82
- };
83
55
  fs: {
56
+ hasAccess: (p: string) => Promise<boolean>;
84
57
  exists: (p: string) => Promise<boolean>;
85
58
  readdir: (p: string) => Promise<string[]>;
86
59
  stat: (p: string) => Promise<import("node:fs").Stats>;
87
60
  readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
88
- writeFile: (p: string, data: string | Buffer) => Promise<void>;
61
+ writeFile: (p: string, data: string | Buffer, encoding?: BufferEncoding) => Promise<void>;
89
62
  unlink: (p: string) => Promise<void>;
90
63
  rename: (from: string, to: string) => Promise<void>;
91
64
  mkdir: (p: string, opts?: {
@@ -94,6 +67,26 @@ declare const _default: {
94
67
  mkdirp: (p: string) => Promise<string | undefined>;
95
68
  mv: (from: string, to: string) => Promise<void>;
96
69
  };
70
+ imageUtil: {
71
+ requireSharp: () => never;
72
+ };
73
+ util: {
74
+ wrapElement: (elementId: string) => {
75
+ ELEMENT: string;
76
+ 'element-6066-11e4-a52e-4f735466cecf': string;
77
+ };
78
+ };
79
+ net: {
80
+ downloadFile: () => Promise<void>;
81
+ };
82
+ plist: {
83
+ parsePlistFile: () => Promise<{}>;
84
+ };
85
+ zip: {
86
+ extractAllTo: () => Promise<void>;
87
+ readEntries: () => Promise<void>;
88
+ toArchive: () => Promise<void>;
89
+ };
97
90
  };
98
91
  export default _default;
99
92
  //# sourceMappingURL=support.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;uBACE,MAAM;0BAIH,MAAM,YAAY,GAAG,EAAE;yBAGxB,MAAM,YAAY,GAAG,EAAE;yBAGvB,MAAM,YAAY,GAAG,EAAE;0BAGtB,MAAM,YAAY,GAAG,EAAE;0BAGvB,MAAM,YAAY,GAAG,EAAE;;CAI9C,CAAC;AAEF;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACpD,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,iBAAiB,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,iBAkB/B,CAAC;AAEF,eAAO,MAAM,SAAS;yBACC,QAAQ,MAAM;CACpC,CAAC;AAEF,eAAO,MAAM,GAAG;+BAEA,MAAM,YACR,MAAM,UACR,OAAO;CAIlB,CAAC;AAEF,eAAO,MAAM,KAAK;iCACmB,MAAM;CAC1C,CAAC;AAEF,eAAO,MAAM,GAAG;6BACiB,MAAM,YAAY,MAAM,UAAU,OAAO;4BAG1C,MAAM,YAAY,OAAO;0BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;CAGpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,EAAE;gBACK,MAAM;iBACX,MAAM;cACT,MAAM;kBACF,MAAM,aAAa,cAAc;mBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;gBAEhC,MAAM;mBACH,MAAM,MAAM,MAAM;eACtB,MAAM,SAAS;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;gBAErC,MAAM;eACD,MAAM,MAAM,MAAM;CAGpC,CAAC;;;2BA9GmB,MAAM;8BAIH,MAAM,YAAY,GAAG,EAAE;6BAGxB,MAAM,YAAY,GAAG,EAAE;6BAGvB,MAAM,YAAY,GAAG,EAAE;8BAGtB,MAAM,YAAY,GAAG,EAAE;8BAGvB,MAAM,YAAY,GAAG,EAAE;;;;6BA6CxB,QAAQ,MAAM;;;mCAKrB,MAAM,YACR,MAAM,UACR,OAAO;;;qCAOkB,MAAM;;;iCAIV,MAAM,YAAY,MAAM,UAAU,OAAO;gCAG1C,MAAM,YAAY,OAAO;8BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;;;oBAUjD,MAAM;qBACX,MAAM;kBACT,MAAM;sBACF,MAAM,aAAa,cAAc;uBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;oBAEhC,MAAM;uBACH,MAAM,MAAM,MAAM;mBACtB,MAAM,SAAS;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE;oBAErC,MAAM;mBACD,MAAM,MAAM,MAAM;;;AAMrC,wBAOE"}
1
+ {"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;uBACE,MAAM;;;;;;;CAO1B,CAAC;AAEF,eAAO,MAAM,EAAE;mBACQ,MAAM;gBAQT,MAAM;iBACX,MAAM;cACT,MAAM;kBACF,MAAM,aAAa,cAAc;mBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM,aAAa,cAAc;gBAE3D,MAAM;mBACH,MAAM,MAAM,MAAM;eACtB,MAAM,SAAS;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;gBAErC,MAAM;eACD,MAAM,MAAM,MAAM;CAGpC,CAAC;AAEF,eAAO,MAAM,SAAS;;CAIrB,CAAC;AAEF,eAAO,MAAM,IAAI;6BACU,MAAM;;;;CAIhC,CAAC;AAEF,eAAO,MAAM,GAAG;;CAEf,CAAC;AAEF,eAAO,MAAM,KAAK;;CAEjB,CAAC;AAEF,eAAO,MAAM,GAAG;;;;CAIf,CAAC;;;2BA5DmB,MAAM;;;;;;;;;uBAUJ,MAAM;oBAQT,MAAM;qBACX,MAAM;kBACT,MAAM;sBACF,MAAM,aAAa,cAAc;uBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM,aAAa,cAAc;oBAE3D,MAAM;uBACH,MAAM,MAAM,MAAM;mBACtB,MAAM,SAAS;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE;oBAErC,MAAM;mBACD,MAAM,MAAM,MAAM;;;;;;iCAYV,MAAM;;;;;;;;;;;;;;;;;AAoBjC,wBAQE"}
@@ -1,79 +1,29 @@
1
- // Mock @appium/support for Jest tests
2
- // This avoids the ESM/CommonJS mismatch with uuid dependency
3
- import { promises as fsPromises, existsSync } from 'node:fs';
1
+ import { constants, existsSync, promises as fsPromises } from 'node:fs';
2
+ const noop = () => { };
4
3
  export const logger = {
5
- getLogger: (_name) =>
6
- // Simple logger implementation for tests
7
- // No-op functions that match the logger interface
8
- ({
9
- debug: (_message, ..._args) => {
10
- // Silent in tests by default
11
- },
12
- info: (_message, ..._args) => {
13
- // Silent in tests by default
14
- },
15
- warn: (_message, ..._args) => {
16
- // Silent in tests by default
17
- },
18
- error: (_message, ..._args) => {
19
- // Silent in tests by default
20
- },
21
- trace: (_message, ..._args) => {
22
- // Silent in tests by default
23
- },
4
+ getLogger: (_name) => ({
5
+ debug: noop,
6
+ info: noop,
7
+ warn: noop,
8
+ error: noop,
9
+ trace: noop,
24
10
  }),
25
11
  };
26
- /** Shared instance – tests can mutate toBufferImpl or inspect resizeCalls */
27
- export const mockSharpInstance = {
28
- resizeCalls: [],
29
- toBufferImpl: () => Promise.resolve(Buffer.from('mock-compressed-image')),
30
- resize(w, h) {
31
- this.resizeCalls.push([w, h]);
32
- return this;
33
- },
34
- jpeg(_opts) {
35
- return this;
36
- },
37
- toBuffer() {
38
- return this.toBufferImpl();
39
- },
40
- reset() {
41
- this.resizeCalls = [];
42
- this.toBufferImpl = () => Promise.resolve(Buffer.from('mock-compressed-image'));
43
- },
44
- };
45
- export const imageUtil = {
46
- requireSharp: () => (_input) => mockSharpInstance,
47
- };
48
- export const net = {
49
- downloadFile: async (_remoteUrl, _dstPath, _opts) => {
50
- // Silent in tests by default
51
- },
52
- };
53
- export const plist = {
54
- parsePlistFile: async (_plistPath) => ({}),
55
- };
56
- export const zip = {
57
- extractAllTo: async (_zipPath, _destDir, _opts) => {
58
- // Silent in tests by default
59
- },
60
- readEntries: async (_zipPath, _handler) => {
61
- // Silent in tests by default
62
- },
63
- toArchive: async (_dstPath, _src, _opts) => {
64
- // Silent in tests by default
65
- },
66
- };
67
- /**
68
- * Minimal `fs` mock that delegates to node:fs/promises so test code touching
69
- * the real filesystem continues to work.
70
- */
71
12
  export const fs = {
13
+ hasAccess: async (p) => {
14
+ try {
15
+ await fsPromises.access(p, constants.R_OK);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ },
72
22
  exists: async (p) => existsSync(p),
73
23
  readdir: (p) => fsPromises.readdir(p),
74
24
  stat: (p) => fsPromises.stat(p),
75
25
  readFile: (p, encoding) => fsPromises.readFile(p, encoding),
76
- writeFile: (p, data) => fsPromises.writeFile(p, data),
26
+ writeFile: (p, data, encoding) => fsPromises.writeFile(p, data, encoding),
77
27
  unlink: (p) => fsPromises.unlink(p),
78
28
  rename: (from, to) => fsPromises.rename(from, to),
79
29
  mkdir: (p, opts) => fsPromises.mkdir(p, opts),
@@ -82,13 +32,35 @@ export const fs = {
82
32
  await fsPromises.rename(from, to);
83
33
  },
84
34
  };
85
- // Export other commonly used utilities from @appium/support if needed
35
+ export const imageUtil = {
36
+ requireSharp: () => {
37
+ throw new Error('imageUtil.requireSharp must be mocked by the test');
38
+ },
39
+ };
40
+ export const util = {
41
+ wrapElement: (elementId) => ({
42
+ ELEMENT: elementId,
43
+ 'element-6066-11e4-a52e-4f735466cecf': elementId,
44
+ }),
45
+ };
46
+ export const net = {
47
+ downloadFile: async () => { },
48
+ };
49
+ export const plist = {
50
+ parsePlistFile: async () => ({}),
51
+ };
52
+ export const zip = {
53
+ extractAllTo: async () => { },
54
+ readEntries: async () => { },
55
+ toArchive: async () => { },
56
+ };
86
57
  export default {
87
58
  logger,
59
+ fs,
88
60
  imageUtil,
61
+ util,
89
62
  net,
90
63
  plist,
91
64
  zip,
92
- fs,
93
65
  };
94
66
  //# sourceMappingURL=support.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.test.d.ts","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,253 @@
1
+ import { afterEach, describe, expect, jest, test } from '@jest/globals';
2
+ const registeredServers = [];
3
+ const safeDeleteAllSessions = jest.fn();
4
+ let sessions = [];
5
+ class MockFastMCP {
6
+ options;
7
+ tools = [];
8
+ handlers = new Map();
9
+ constructor(options) {
10
+ this.options = options;
11
+ registeredServers.push(this);
12
+ }
13
+ addTool(toolDef) {
14
+ this.tools.push(toolDef);
15
+ }
16
+ on(eventName, handler) {
17
+ const handlers = this.handlers.get(eventName) ?? [];
18
+ handlers.push(handler);
19
+ this.handlers.set(eventName, handlers);
20
+ }
21
+ async emitTest(eventName, event) {
22
+ for (const handler of this.handlers.get(eventName) ?? []) {
23
+ await handler(event);
24
+ }
25
+ }
26
+ }
27
+ await jest.unstable_mockModule('fastmcp', () => ({
28
+ FastMCP: MockFastMCP,
29
+ }));
30
+ await jest.unstable_mockModule('../tools/index', () => ({
31
+ default: (server) => {
32
+ server.addTool({
33
+ name: 'builtin_tool',
34
+ description: 'Built-in test tool',
35
+ parameters: {},
36
+ execute: async () => ({
37
+ content: [{ type: 'text', text: 'builtin result' }],
38
+ }),
39
+ });
40
+ },
41
+ }));
42
+ await jest.unstable_mockModule('../resources/index', () => ({
43
+ default: jest.fn(),
44
+ }));
45
+ await jest.unstable_mockModule('../session-store', () => ({
46
+ getDriver: jest.fn(() => null),
47
+ getSessionId: jest.fn(() => null),
48
+ getSessionInfo: jest.fn(() => null),
49
+ listSessions: jest.fn(() => sessions),
50
+ safeDeleteAllSessions,
51
+ }));
52
+ await jest.unstable_mockModule('../logger', () => ({
53
+ default: {
54
+ debug: jest.fn(),
55
+ info: jest.fn(),
56
+ warn: jest.fn(),
57
+ error: jest.fn(),
58
+ },
59
+ }));
60
+ const { createAppiumMcpServer } = await import('../create-server.js');
61
+ afterEach(() => {
62
+ registeredServers.length = 0;
63
+ sessions = [];
64
+ safeDeleteAllSessions.mockReset();
65
+ delete process.env.APPIUM_MCP_ON_CLIENT_DISCONNECT;
66
+ });
67
+ describe('createAppiumMcpServer plugin lifecycle', () => {
68
+ test('registers plugin capabilities during construction but initializes lazily', async () => {
69
+ let registerCalled = false;
70
+ let initialized = false;
71
+ const plugin = {
72
+ name: 'lazy-plugin',
73
+ version: '1.0.0',
74
+ register(_registry, core) {
75
+ registerCalled = true;
76
+ expect(core.getSessionId()).toBeNull();
77
+ },
78
+ async initialize() {
79
+ initialized = true;
80
+ },
81
+ };
82
+ const server = createAppiumMcpServer({
83
+ plugins: [plugin],
84
+ });
85
+ expect(registerCalled).toBe(true);
86
+ expect(initialized).toBe(false);
87
+ await server.emitTest('connect', { session: 'client-1' });
88
+ expect(initialized).toBe(true);
89
+ });
90
+ test('wraps built-in tools with beforeCall and afterCall hooks', async () => {
91
+ const calls = [];
92
+ const plugin = {
93
+ name: 'hook-plugin',
94
+ version: '1.0.0',
95
+ async beforeCall(ctx) {
96
+ calls.push(`before:${ctx.toolName}`);
97
+ },
98
+ async afterCall(ctx, result) {
99
+ calls.push(`after:${ctx.toolName}`);
100
+ return {
101
+ ...result,
102
+ content: [{ type: 'text', text: 'modified builtin result' }],
103
+ };
104
+ },
105
+ };
106
+ const server = createAppiumMcpServer({
107
+ plugins: [plugin],
108
+ });
109
+ const result = (await server.tools[0].execute({}, {}));
110
+ expect(calls).toEqual(['before:builtin_tool', 'after:builtin_tool']);
111
+ expect(result.content[0]).toEqual({
112
+ type: 'text',
113
+ text: 'modified builtin result',
114
+ });
115
+ });
116
+ test('destroys plugins only after the last client disconnects', async () => {
117
+ let initializeCount = 0;
118
+ let destroyCount = 0;
119
+ const plugin = {
120
+ name: 'lifecycle-plugin',
121
+ version: '1.0.0',
122
+ async initialize() {
123
+ initializeCount += 1;
124
+ },
125
+ async destroy() {
126
+ destroyCount += 1;
127
+ },
128
+ };
129
+ const server = createAppiumMcpServer({
130
+ plugins: [plugin],
131
+ });
132
+ await server.emitTest('connect', { session: 'client-1' });
133
+ await server.emitTest('connect', { session: 'client-2' });
134
+ await server.emitTest('disconnect', { session: 'client-1' });
135
+ expect(initializeCount).toBe(1);
136
+ expect(destroyCount).toBe(0);
137
+ await server.emitTest('disconnect', { session: 'client-2' });
138
+ expect(destroyCount).toBe(1);
139
+ });
140
+ test('initializes plugins once when clients connect concurrently', async () => {
141
+ let initializeCount = 0;
142
+ let resolveInitialize;
143
+ let markInitializeStarted;
144
+ const initializeStarted = new Promise((resolve) => {
145
+ markInitializeStarted = resolve;
146
+ });
147
+ const plugin = {
148
+ name: 'concurrent-plugin',
149
+ version: '1.0.0',
150
+ async initialize() {
151
+ initializeCount += 1;
152
+ markInitializeStarted?.();
153
+ await new Promise((resolve) => {
154
+ resolveInitialize = resolve;
155
+ });
156
+ },
157
+ };
158
+ const server = createAppiumMcpServer({
159
+ plugins: [plugin],
160
+ });
161
+ const connectA = server.emitTest('connect', { session: 'client-1' });
162
+ const connectB = server.emitTest('connect', { session: 'client-2' });
163
+ await initializeStarted;
164
+ expect(initializeCount).toBe(1);
165
+ resolveInitialize?.();
166
+ await Promise.all([connectA, connectB]);
167
+ expect(initializeCount).toBe(1);
168
+ });
169
+ test('re-initializes only after an in-flight destroy finishes', async () => {
170
+ const calls = [];
171
+ let resolveDestroy;
172
+ const plugin = {
173
+ name: 'destroy-race-plugin',
174
+ version: '1.0.0',
175
+ async initialize() {
176
+ calls.push('initialize');
177
+ },
178
+ async destroy() {
179
+ calls.push('destroy-start');
180
+ await new Promise((resolve) => {
181
+ resolveDestroy = resolve;
182
+ });
183
+ calls.push('destroy-end');
184
+ },
185
+ };
186
+ const server = createAppiumMcpServer({
187
+ plugins: [plugin],
188
+ });
189
+ await server.emitTest('connect', { session: 'client-1' });
190
+ const disconnect = server.emitTest('disconnect', { session: 'client-1' });
191
+ await Promise.resolve();
192
+ const reconnect = server.emitTest('connect', { session: 'client-2' });
193
+ expect(calls).toEqual(['initialize', 'destroy-start']);
194
+ resolveDestroy?.();
195
+ await Promise.all([disconnect, reconnect]);
196
+ expect(calls).toEqual([
197
+ 'initialize',
198
+ 'destroy-start',
199
+ 'destroy-end',
200
+ 'initialize',
201
+ ]);
202
+ });
203
+ test('destroys plugins after final disconnect during pending initialization', async () => {
204
+ let initializeCount = 0;
205
+ let destroyCount = 0;
206
+ let resolveInitialize;
207
+ const plugin = {
208
+ name: 'pending-init-plugin',
209
+ version: '1.0.0',
210
+ async initialize() {
211
+ initializeCount += 1;
212
+ await new Promise((resolve) => {
213
+ resolveInitialize = resolve;
214
+ });
215
+ },
216
+ async destroy() {
217
+ destroyCount += 1;
218
+ },
219
+ };
220
+ const server = createAppiumMcpServer({
221
+ plugins: [plugin],
222
+ });
223
+ const connect = server.emitTest('connect', { session: 'client-1' });
224
+ await Promise.resolve();
225
+ const disconnect = server.emitTest('disconnect', { session: 'client-1' });
226
+ expect(initializeCount).toBe(1);
227
+ expect(destroyCount).toBe(0);
228
+ resolveInitialize?.();
229
+ await Promise.all([connect, disconnect]);
230
+ expect(destroyCount).toBe(1);
231
+ });
232
+ test('destroys plugins on final disconnect when session cleanup policy is skip', async () => {
233
+ process.env.APPIUM_MCP_ON_CLIENT_DISCONNECT = 'skip';
234
+ sessions = [{ sessionId: 'session-1', isActive: true, ownership: 'owned' }];
235
+ let destroyCount = 0;
236
+ const plugin = {
237
+ name: 'skip-policy-plugin',
238
+ version: '1.0.0',
239
+ async initialize() { },
240
+ async destroy() {
241
+ destroyCount += 1;
242
+ },
243
+ };
244
+ const server = createAppiumMcpServer({
245
+ plugins: [plugin],
246
+ });
247
+ await server.emitTest('connect', { session: 'client-1' });
248
+ await server.emitTest('disconnect', { session: 'client-1' });
249
+ expect(safeDeleteAllSessions).not.toHaveBeenCalled();
250
+ expect(destroyCount).toBe(1);
251
+ });
252
+ });
253
+ //# sourceMappingURL=create-server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-server.test.js","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../src/tests/plugin.test.ts"],"names":[],"mappings":""}