appium-mcp 1.75.5 → 1.75.7
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/CHANGELOG.md +12 -0
- package/dist/tests/tools/gestures/ai-element.test.js +13 -1
- package/dist/tests/tools/gestures/ai-element.test.js.map +1 -1
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts +2 -0
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts.map +1 -0
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js +86 -0
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js.map +1 -0
- package/dist/tests/tools/llm-wording.test.d.ts +2 -0
- package/dist/tests/tools/llm-wording.test.d.ts.map +1 -0
- package/dist/tests/tools/llm-wording.test.js +85 -0
- package/dist/tests/tools/llm-wording.test.js.map +1 -0
- package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +1 -1
- package/dist/tools/gestures/handlers/ai-element.d.ts +3 -0
- package/dist/tools/gestures/handlers/ai-element.d.ts.map +1 -1
- package/dist/tools/gestures/handlers/ai-element.js +12 -0
- package/dist/tools/gestures/handlers/ai-element.js.map +1 -1
- package/dist/tools/interactions/get-element-attribute.d.ts.map +1 -1
- package/dist/tools/interactions/get-element-attribute.js +5 -0
- package/dist/tools/interactions/get-element-attribute.js.map +1 -1
- package/dist/tools/interactions/get-text.d.ts.map +1 -1
- package/dist/tools/interactions/get-text.js +5 -0
- package/dist/tools/interactions/get-text.js.map +1 -1
- package/dist/tools/interactions/set-value.d.ts.map +1 -1
- package/dist/tools/interactions/set-value.js +7 -0
- package/dist/tools/interactions/set-value.js.map +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/tools/gestures/handlers/ai-element.ts +18 -0
- package/src/tools/interactions/get-element-attribute.ts +6 -0
- package/src/tools/interactions/get-text.ts +6 -0
- package/src/tools/interactions/set-value.ts +10 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.75.7](https://github.com/appium/appium-mcp/compare/v1.75.6...v1.75.7) (2026-05-23)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* apply npm pkg fix to tweak package.json ([#362](https://github.com/appium/appium-mcp/issues/362)) ([412cae1](https://github.com/appium/appium-mcp/commit/412cae1f722d64ee3b73a2f3f050e022607fe0c1))
|
|
6
|
+
|
|
7
|
+
## [1.75.6](https://github.com/appium/appium-mcp/compare/v1.75.5...v1.75.6) (2026-05-23)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **interactions:** reject ai-element tokens in get and set tools ([#358](https://github.com/appium/appium-mcp/issues/358)) ([ac630a3](https://github.com/appium/appium-mcp/commit/ac630a3881bc58e262bac73e8fc687e13e57c286))
|
|
12
|
+
|
|
1
13
|
## [1.75.5](https://github.com/appium/appium-mcp/compare/v1.75.4...v1.75.5) (2026-05-23)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -7,7 +7,7 @@ jest.unstable_mockModule('../../../session-store', () => ({
|
|
|
7
7
|
jest.unstable_mockModule('../../../command', () => ({
|
|
8
8
|
getElementRect: jest.fn(),
|
|
9
9
|
}));
|
|
10
|
-
const { AI_ELEMENT_PREFIX, isAiElementUUID, parseAiElement, resolveTargetRect, } = await import('../../../tools/gestures/handlers/ai-element.js');
|
|
10
|
+
const { AI_ELEMENT_PREFIX, AI_WEBDRIVER_REJECTION, isAiElementUUID, parseAiElement, resolveTargetRect, aiElementWebDriverRejectionIfNeeded, } = await import('../../../tools/gestures/handlers/ai-element.js');
|
|
11
11
|
const fakeDriver = {};
|
|
12
12
|
describe('isAiElementUUID', () => {
|
|
13
13
|
test('returns true for ai-element UUIDs', () => {
|
|
@@ -20,6 +20,18 @@ describe('isAiElementUUID', () => {
|
|
|
20
20
|
expect(isAiElementUUID(undefined)).toBe(false);
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
|
+
describe('aiElementWebDriverRejectionIfNeeded', () => {
|
|
24
|
+
test('returns isError for ai-element UUIDs', () => {
|
|
25
|
+
const result = aiElementWebDriverRejectionIfNeeded('ai-element:100,200:50,150,150,250');
|
|
26
|
+
expect(result?.isError).toBe(true);
|
|
27
|
+
const block = result?.content[0];
|
|
28
|
+
expect(block && 'text' in block && block.text).toBe(AI_WEBDRIVER_REJECTION);
|
|
29
|
+
});
|
|
30
|
+
test('returns undefined for real element ids and missing values', () => {
|
|
31
|
+
expect(aiElementWebDriverRejectionIfNeeded('aaaaaaaa-bbbb-cccc-dddd')).toBeUndefined();
|
|
32
|
+
expect(aiElementWebDriverRejectionIfNeeded(undefined)).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
23
35
|
describe('parseAiElement', () => {
|
|
24
36
|
test('parses centre + bbox into a rect that spans the bbox', () => {
|
|
25
37
|
const result = parseAiElement('ai-element:200,300:100,200,300,400');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-element.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/ai-element.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGzE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;IAC1B,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE;CAC7C,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,MAAM,EACJ,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ai-element.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/ai-element.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webdriver-ai-element-rejection.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/interactions/webdriver-ai-element-rejection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, test, expect, jest, beforeEach } from '@jest/globals';
|
|
2
|
+
jest.unstable_mockModule('../../../session-store.js', () => ({
|
|
3
|
+
getDriver: jest.fn(),
|
|
4
|
+
}));
|
|
5
|
+
jest.unstable_mockModule('../../../command.js', () => ({
|
|
6
|
+
getElementRect: jest.fn(),
|
|
7
|
+
setValue: jest.fn(),
|
|
8
|
+
getElementText: jest.fn(),
|
|
9
|
+
getElementAttribute: jest.fn(),
|
|
10
|
+
}));
|
|
11
|
+
const { getDriver } = await import('../../../session-store.js');
|
|
12
|
+
const { setValue, getElementText, getElementAttribute } = await import('../../../command.js');
|
|
13
|
+
const { AI_WEBDRIVER_REJECTION } = await import('../../../tools/gestures/handlers/ai-element.js');
|
|
14
|
+
const mockGetDriver = getDriver;
|
|
15
|
+
const mockSetValue = setValue;
|
|
16
|
+
const mockGetElementText = getElementText;
|
|
17
|
+
const mockGetElementAttribute = getElementAttribute;
|
|
18
|
+
const AI_UUID = 'ai-element:100,200:50,150,150,250';
|
|
19
|
+
const REAL_UUID = '11111111-2222-3333-4444-555555555555';
|
|
20
|
+
function textFromResult(result) {
|
|
21
|
+
const block = result.content[0];
|
|
22
|
+
return block && 'text' in block ? block.text : undefined;
|
|
23
|
+
}
|
|
24
|
+
describe('interaction tools and ai-element tokens', () => {
|
|
25
|
+
const mockServer = { addTool: jest.fn() };
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
mockGetDriver.mockReturnValue({});
|
|
28
|
+
mockSetValue.mockReset();
|
|
29
|
+
mockGetElementText.mockReset();
|
|
30
|
+
mockGetElementAttribute.mockReset();
|
|
31
|
+
});
|
|
32
|
+
async function loadTool(modulePath) {
|
|
33
|
+
const mod = await import(modulePath);
|
|
34
|
+
mod.default(mockServer);
|
|
35
|
+
return mockServer.addTool.mock.calls.at(-1)?.[0];
|
|
36
|
+
}
|
|
37
|
+
async function runTool(tool, args) {
|
|
38
|
+
return tool.execute(args, undefined);
|
|
39
|
+
}
|
|
40
|
+
test('set_value rejects ai-element without w3cActions', async () => {
|
|
41
|
+
const tool = await loadTool('../../../tools/interactions/set-value.js');
|
|
42
|
+
const result = await runTool(tool, { elementUUID: AI_UUID, text: 'hello' });
|
|
43
|
+
expect(result.isError).toBe(true);
|
|
44
|
+
expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
|
|
45
|
+
expect(mockSetValue).not.toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
test('set_value still works with w3cActions', async () => {
|
|
48
|
+
const tool = await loadTool('../../../tools/interactions/set-value.js');
|
|
49
|
+
mockSetValue.mockResolvedValueOnce(undefined);
|
|
50
|
+
const result = await runTool(tool, {
|
|
51
|
+
elementUUID: AI_UUID,
|
|
52
|
+
text: 'hello',
|
|
53
|
+
w3cActions: true,
|
|
54
|
+
});
|
|
55
|
+
expect(result.isError).toBeUndefined();
|
|
56
|
+
expect(mockSetValue).toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
test('set_value accepts a normal element id', async () => {
|
|
59
|
+
const tool = await loadTool('../../../tools/interactions/set-value.js');
|
|
60
|
+
mockSetValue.mockResolvedValueOnce(undefined);
|
|
61
|
+
const result = await runTool(tool, {
|
|
62
|
+
elementUUID: REAL_UUID,
|
|
63
|
+
text: 'hello',
|
|
64
|
+
});
|
|
65
|
+
expect(result.isError).toBeUndefined();
|
|
66
|
+
expect(mockSetValue).toHaveBeenCalledWith(expect.anything(), REAL_UUID, 'hello', undefined);
|
|
67
|
+
});
|
|
68
|
+
test('get_text rejects ai-element', async () => {
|
|
69
|
+
const tool = await loadTool('../../../tools/interactions/get-text.js');
|
|
70
|
+
const result = await runTool(tool, { elementUUID: AI_UUID });
|
|
71
|
+
expect(result.isError).toBe(true);
|
|
72
|
+
expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
|
|
73
|
+
expect(mockGetElementText).not.toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
test('get_element_attribute rejects ai-element', async () => {
|
|
76
|
+
const tool = await loadTool('../../../tools/interactions/get-element-attribute.js');
|
|
77
|
+
const result = await runTool(tool, {
|
|
78
|
+
elementUUID: AI_UUID,
|
|
79
|
+
attribute: 'enabled',
|
|
80
|
+
});
|
|
81
|
+
expect(result.isError).toBe(true);
|
|
82
|
+
expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
|
|
83
|
+
expect(mockGetElementAttribute).not.toHaveBeenCalled();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=webdriver-ai-element-rejection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webdriver-ai-element-rejection.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/interactions/webdriver-ai-element-rejection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-wording.test.d.ts","sourceRoot":"","sources":["../../../src/tests/tools/llm-wording.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, expect, jest, test } from '@jest/globals';
|
|
2
|
+
jest.unstable_mockModule('../../tools/tool-response', () => ({
|
|
3
|
+
errorResult: jest.fn((text) => ({
|
|
4
|
+
content: [{ type: 'text', text }],
|
|
5
|
+
isError: true,
|
|
6
|
+
})),
|
|
7
|
+
readWebElementId: jest.fn(),
|
|
8
|
+
resolveDriver: jest.fn(),
|
|
9
|
+
textResultWithPrimaryElementId: jest.fn(),
|
|
10
|
+
toolErrorMessage: jest.fn((err) => err instanceof Error ? err.message : String(err)),
|
|
11
|
+
}));
|
|
12
|
+
jest.unstable_mockModule('../../tools/session/attach-session', () => ({
|
|
13
|
+
attachSessionAction: jest.fn(),
|
|
14
|
+
}));
|
|
15
|
+
jest.unstable_mockModule('../../tools/session/create-session', () => ({
|
|
16
|
+
createSessionAction: jest.fn(),
|
|
17
|
+
}));
|
|
18
|
+
jest.unstable_mockModule('../../tools/session/delete-session', () => ({
|
|
19
|
+
deleteSessionAction: jest.fn(),
|
|
20
|
+
}));
|
|
21
|
+
jest.unstable_mockModule('../../tools/session/detach-session', () => ({
|
|
22
|
+
detachSessionAction: jest.fn(),
|
|
23
|
+
}));
|
|
24
|
+
jest.unstable_mockModule('../../tools/session/list-sessions', () => ({
|
|
25
|
+
listSessionsAction: jest.fn(),
|
|
26
|
+
}));
|
|
27
|
+
jest.unstable_mockModule('../../tools/session/select-session', () => ({
|
|
28
|
+
selectSessionAction: jest.fn(),
|
|
29
|
+
}));
|
|
30
|
+
function normalizeText(text) {
|
|
31
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
32
|
+
}
|
|
33
|
+
async function registerTool(modulePath) {
|
|
34
|
+
const server = { addTool: jest.fn() };
|
|
35
|
+
const { default: register } = await import(modulePath);
|
|
36
|
+
register(server);
|
|
37
|
+
return server.addTool.mock.calls.at(-1)?.[0];
|
|
38
|
+
}
|
|
39
|
+
function paramDescription(tool, name) {
|
|
40
|
+
return tool.parameters.shape[name]?.description ?? '';
|
|
41
|
+
}
|
|
42
|
+
describe('LLM-facing MCP tool wording', () => {
|
|
43
|
+
test('appium_find_element guides models away from brittle or wrong find modes', async () => {
|
|
44
|
+
const tool = await registerTool('../../tools/interactions/find.js');
|
|
45
|
+
const description = normalizeText(tool.description);
|
|
46
|
+
const strategyDescription = normalizeText(paramDescription(tool, 'strategy'));
|
|
47
|
+
const selectorDescription = normalizeText(paramDescription(tool, 'selector'));
|
|
48
|
+
expect(tool.name).toBe('appium_find_element');
|
|
49
|
+
expect(description).toMatch(/strategy and selector/i);
|
|
50
|
+
expect(description).toMatch(/accessibility id .* id .* xpath/i);
|
|
51
|
+
expect(description).toMatch(/xpath.*last resort/i);
|
|
52
|
+
expect(description).toMatch(/appium_gesture.*scroll_to_element/i);
|
|
53
|
+
expect(description).toMatch(/appium_ai.*find_element/i);
|
|
54
|
+
expect(strategyDescription).toMatch(/cross-platform.*fastest.*stable/i);
|
|
55
|
+
expect(strategyDescription).toMatch(/iOS prefer/i);
|
|
56
|
+
expect(strategyDescription).toMatch(/Android prefer/i);
|
|
57
|
+
expect(strategyDescription).toMatch(/xpath last/i);
|
|
58
|
+
expect(selectorDescription).toMatch(/Do not pass natural-language descriptions/i);
|
|
59
|
+
});
|
|
60
|
+
test('appium_session_management explains local vs remote session creation', async () => {
|
|
61
|
+
const tool = await registerTool('../../tools/session/session.js');
|
|
62
|
+
const description = normalizeText(tool.description);
|
|
63
|
+
const actionDescription = normalizeText(paramDescription(tool, 'action'));
|
|
64
|
+
const platformDescription = normalizeText(paramDescription(tool, 'platform'));
|
|
65
|
+
const remoteServerUrlDescription = normalizeText(paramDescription(tool, 'remoteServerUrl'));
|
|
66
|
+
const sessionIdDescription = normalizeText(paramDescription(tool, 'sessionId'));
|
|
67
|
+
expect(tool.name).toBe('appium_session_management');
|
|
68
|
+
expect(description).toMatch(/create.*attach.*detach.*delete.*list.*select/i);
|
|
69
|
+
expect(actionDescription).toMatch(/DEFAULT MODE/i);
|
|
70
|
+
expect(actionDescription).toMatch(/no separate Appium process is needed/i);
|
|
71
|
+
expect(actionDescription).toMatch(/select_device tool FIRST/i);
|
|
72
|
+
expect(actionDescription).toMatch(/do NOT pass remoteServerUrl/i);
|
|
73
|
+
expect(actionDescription).toMatch(/NEVER invent a localhost URL/i);
|
|
74
|
+
expect(actionDescription).toMatch(/REMOTE SERVER MODE/i);
|
|
75
|
+
expect(actionDescription).toMatch(/only when user explicitly provides/i);
|
|
76
|
+
expect(actionDescription).toMatch(/without taking ownership/i);
|
|
77
|
+
expect(actionDescription).toMatch(/without deleting the real remote session/i);
|
|
78
|
+
expect(platformDescription).toMatch(/Required for create/i);
|
|
79
|
+
expect(platformDescription).toMatch(/general.*non-Android\/iOS/i);
|
|
80
|
+
expect(remoteServerUrlDescription).toMatch(/Omit to use local server/i);
|
|
81
|
+
expect(sessionIdDescription).toMatch(/Required for attach and select/i);
|
|
82
|
+
expect(tool.annotations?.destructiveHint).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=llm-wording.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-wording.test.js","sourceRoot":"","sources":["../../../src/tests/tools/llm-wording.test.ts"],"names":[],"mappings":"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"}
|