appium-mcp 1.88.4 → 1.89.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/CHANGELOG.md +12 -0
- package/README.md +2 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -3
- package/dist/schema.js.map +1 -1
- package/dist/telemetry/wrapOperations.d.ts +8 -0
- package/dist/telemetry/wrapOperations.d.ts.map +1 -1
- package/dist/telemetry/wrapOperations.js +97 -2
- package/dist/telemetry/wrapOperations.js.map +1 -1
- package/dist/tools/app-management/app.d.ts.map +1 -1
- package/dist/tools/app-management/app.js +15 -37
- package/dist/tools/app-management/app.js.map +1 -1
- package/dist/tools/app-management/permissions.d.ts.map +1 -1
- package/dist/tools/app-management/permissions.js +3 -5
- package/dist/tools/app-management/permissions.js.map +1 -1
- package/dist/tools/interactions/screen-recording.d.ts.map +1 -1
- package/dist/tools/interactions/screen-recording.js +3 -8
- package/dist/tools/interactions/screen-recording.js.map +1 -1
- package/package.json +1 -1
- package/scripts/audit-tool-footprint.mjs +1 -1
- package/server.json +2 -2
- package/src/schema.ts +1 -3
- package/src/telemetry/wrapOperations.ts +109 -2
- package/src/tools/app-management/app.ts +15 -45
- package/src/tools/app-management/permissions.ts +3 -7
- package/src/tools/interactions/screen-recording.ts +3 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.89.0](https://github.com/appium/appium-mcp/compare/v1.88.5...v1.89.0) (2026-07-26)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* add payload-free tool result size telemetry ([#476](https://github.com/appium/appium-mcp/issues/476)) ([ca0262d](https://github.com/appium/appium-mcp/commit/ca0262d38a18747f08c1f08c94099c7b82150272))
|
|
6
|
+
|
|
7
|
+
## [1.88.5](https://github.com/appium/appium-mcp/compare/v1.88.4...v1.88.5) (2026-07-26)
|
|
8
|
+
|
|
9
|
+
### Performance Improvements
|
|
10
|
+
|
|
11
|
+
* cap tool discovery at 45k characters ([#475](https://github.com/appium/appium-mcp/issues/475)) ([2624412](https://github.com/appium/appium-mcp/commit/2624412367e5a2e4cd5ababc15a9fb4c2ffc25c9))
|
|
12
|
+
|
|
1
13
|
## [1.88.4](https://github.com/appium/appium-mcp/compare/v1.88.3...v1.88.4) (2026-07-25)
|
|
2
14
|
|
|
3
15
|
### Miscellaneous Chores
|
package/README.md
CHANGED
|
@@ -189,6 +189,8 @@ OTEL_TRACES_SAMPLER=parentbased_always_on
|
|
|
189
189
|
|
|
190
190
|
When enabled, appium-mcp creates spans for MCP tool calls, prompt loads, resource reads, and resource template reads. Error status is recorded for thrown operation errors and MCP tool results marked with `isError`. Span attributes intentionally avoid raw screenshots, XML page source, prompts, credentials, and other high-cardinality or sensitive payloads.
|
|
191
191
|
|
|
192
|
+
Tool spans include payload-free result-size attributes: `mcp.tool.result.content_count`, `content_types`, `text_chars`, `resource_count`, `resource_text_chars`, `image_count`, `audio_count`, `base64_chars`, and `base64_bytes_estimate` (all prefixed with `mcp.tool.result.`). `content_types` contains only known MCP types or `other`; payload values, resource URIs, MIME types, and unknown type strings are never recorded. Sizes are counted directly from known result fields without serializing or copying the complete result.
|
|
193
|
+
|
|
192
194
|
For local trace inspection, use the Jaeger setup in `tools/telemetry`:
|
|
193
195
|
|
|
194
196
|
```bash
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,iBAAiB,aAA8D,CAAC"}
|
package/dist/schema.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export const elementUUIDScheme = z
|
|
3
|
-
.string()
|
|
4
|
-
.describe('The uuid of the element returned by appium_find_element to click');
|
|
2
|
+
export const elementUUIDScheme = z.string().describe('Element ID from appium_find_element.');
|
|
5
3
|
//# sourceMappingURL=schema.js.map
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC"}
|
|
@@ -25,6 +25,14 @@ export declare function installTelemetryWrappers(server: FastMCP): void;
|
|
|
25
25
|
* @returns A new tool definition with telemetry spans around the execute function.
|
|
26
26
|
*/
|
|
27
27
|
export declare function wrapToolWithTelemetry(toolDef: ToolDef): ToolDef;
|
|
28
|
+
/**
|
|
29
|
+
* Builds payload-free size attributes for a tool result.
|
|
30
|
+
*
|
|
31
|
+
* This intentionally counts known MCP content fields directly instead of
|
|
32
|
+
* serializing the whole result. Large page sources, UI HTML, and base64 data
|
|
33
|
+
* therefore are not copied or recorded in telemetry.
|
|
34
|
+
*/
|
|
35
|
+
export declare function safeToolResultSizeAttributes(result: unknown): Record<string, number | string[]>;
|
|
28
36
|
export declare function safeInputValueAttributes(args: unknown): Record<string, string | number | boolean | string[]>;
|
|
29
37
|
export {};
|
|
30
38
|
//# sourceMappingURL=wrapOperations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapOperations.d.ts","sourceRoot":"","sources":["../../src/telemetry/wrapOperations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAMrC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"wrapOperations.d.ts","sourceRoot":"","sources":["../../src/telemetry/wrapOperations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAMrC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAYjD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAsB/D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAwE/F;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAmB5G"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { isSensitiveKey } from '../utils/sensitive.js';
|
|
8
8
|
import { isArgumentValueTelemetryEnabled, safeAttributeValue, safeInputKeys, safeSessionId } from './attributes.js';
|
|
9
9
|
import { getActiveSpan, SpanStatusCode, withSpan } from './tracer.js';
|
|
10
|
+
const SAFE_TOOL_CONTENT_TYPES = new Set(['audio', 'image', 'resource', 'resource_link', 'text']);
|
|
10
11
|
/**
|
|
11
12
|
* Installs telemetry wrappers on the given FastMCP server instance. This should be
|
|
12
13
|
* called early in the server setup process, before registering any tools, prompts,
|
|
@@ -50,14 +51,88 @@ export function wrapToolWithTelemetry(toolDef) {
|
|
|
50
51
|
...toolDef,
|
|
51
52
|
execute: async (args, context) => withSpan(`tools/call ${toolName}`, toolAttributes(toolName, args), async () => {
|
|
52
53
|
const result = await execute(args, context);
|
|
54
|
+
const span = getActiveSpan();
|
|
55
|
+
span?.setAttributes(safeToolResultSizeAttributes(result));
|
|
53
56
|
if (isErrorResult(result)) {
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
span?.setStatus({ code: SpanStatusCode.ERROR });
|
|
58
|
+
span?.setAttribute('mcp.tool.result.is_error', true);
|
|
56
59
|
}
|
|
57
60
|
return result;
|
|
58
61
|
}),
|
|
59
62
|
};
|
|
60
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Builds payload-free size attributes for a tool result.
|
|
66
|
+
*
|
|
67
|
+
* This intentionally counts known MCP content fields directly instead of
|
|
68
|
+
* serializing the whole result. Large page sources, UI HTML, and base64 data
|
|
69
|
+
* therefore are not copied or recorded in telemetry.
|
|
70
|
+
*/
|
|
71
|
+
export function safeToolResultSizeAttributes(result) {
|
|
72
|
+
if (typeof result === 'string') {
|
|
73
|
+
return { 'mcp.tool.result.text_chars': result.length };
|
|
74
|
+
}
|
|
75
|
+
if (!isRecord(result) || !Array.isArray(result.content)) {
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
const contentTypes = new Set();
|
|
79
|
+
let textChars = 0;
|
|
80
|
+
let resourceCount = 0;
|
|
81
|
+
let resourceTextChars = 0;
|
|
82
|
+
let imageCount = 0;
|
|
83
|
+
let audioCount = 0;
|
|
84
|
+
let base64Chars = 0;
|
|
85
|
+
let base64BytesEstimate = 0;
|
|
86
|
+
for (const content of result.content) {
|
|
87
|
+
if (!isRecord(content)) {
|
|
88
|
+
contentTypes.add('other');
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const contentType = typeof content.type === 'string' && SAFE_TOOL_CONTENT_TYPES.has(content.type) ? content.type : 'other';
|
|
92
|
+
contentTypes.add(contentType);
|
|
93
|
+
if (contentType === 'text' && typeof content.text === 'string') {
|
|
94
|
+
textChars += content.text.length;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (contentType === 'image' || contentType === 'audio') {
|
|
98
|
+
if (contentType === 'image') {
|
|
99
|
+
imageCount += 1;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
audioCount += 1;
|
|
103
|
+
}
|
|
104
|
+
if (typeof content.data === 'string') {
|
|
105
|
+
base64Chars += content.data.length;
|
|
106
|
+
base64BytesEstimate += estimateBase64DecodedBytes(content.data);
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (contentType === 'resource') {
|
|
111
|
+
resourceCount += 1;
|
|
112
|
+
if (isRecord(content.resource)) {
|
|
113
|
+
if (typeof content.resource.text === 'string') {
|
|
114
|
+
resourceTextChars += content.resource.text.length;
|
|
115
|
+
}
|
|
116
|
+
if (typeof content.resource.blob === 'string') {
|
|
117
|
+
base64Chars += content.resource.blob.length;
|
|
118
|
+
base64BytesEstimate += estimateBase64DecodedBytes(content.resource.blob);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const attributes = {
|
|
124
|
+
'mcp.tool.result.content_count': result.content.length,
|
|
125
|
+
'mcp.tool.result.content_types': [...contentTypes].sort(),
|
|
126
|
+
'mcp.tool.result.text_chars': textChars,
|
|
127
|
+
'mcp.tool.result.resource_count': resourceCount,
|
|
128
|
+
'mcp.tool.result.resource_text_chars': resourceTextChars,
|
|
129
|
+
'mcp.tool.result.image_count': imageCount,
|
|
130
|
+
'mcp.tool.result.audio_count': audioCount,
|
|
131
|
+
'mcp.tool.result.base64_chars': base64Chars,
|
|
132
|
+
'mcp.tool.result.base64_bytes_estimate': base64BytesEstimate,
|
|
133
|
+
};
|
|
134
|
+
return attributes;
|
|
135
|
+
}
|
|
61
136
|
export function safeInputValueAttributes(args) {
|
|
62
137
|
if (!isArgumentValueTelemetryEnabled()) {
|
|
63
138
|
return {};
|
|
@@ -150,4 +225,24 @@ function inputKeyAttributes(args) {
|
|
|
150
225
|
function isErrorResult(result) {
|
|
151
226
|
return (!!result && typeof result === 'object' && 'isError' in result && result.isError === true);
|
|
152
227
|
}
|
|
228
|
+
function isRecord(value) {
|
|
229
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
230
|
+
}
|
|
231
|
+
function estimateBase64DecodedBytes(value) {
|
|
232
|
+
const commaIndex = value.indexOf(',');
|
|
233
|
+
const hasDataUriPrefix = commaIndex >= 7 && value.slice(commaIndex - 7, commaIndex).toLowerCase() === ';base64';
|
|
234
|
+
const contentStart = hasDataUriPrefix ? commaIndex + 1 : 0;
|
|
235
|
+
const encodedLength = value.length - contentStart;
|
|
236
|
+
if (encodedLength <= 0) {
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
let padding = 0;
|
|
240
|
+
if (value.endsWith('==')) {
|
|
241
|
+
padding = 2;
|
|
242
|
+
}
|
|
243
|
+
else if (value.endsWith('=')) {
|
|
244
|
+
padding = 1;
|
|
245
|
+
}
|
|
246
|
+
return Math.max(0, Math.floor((encodedLength * 3) / 4) - padding);
|
|
247
|
+
}
|
|
153
248
|
//# sourceMappingURL=wrapOperations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapOperations.js","sourceRoot":"","sources":["../../src/telemetry/wrapOperations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAC,+BAA+B,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAC,MAAM,aAAa,CAAC;AAYpE;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAe;IACtD,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAuB,CAAC;IAE1E,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,eAAe,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAuB,CAAC;IAE/G,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAyB,CAAC;QAChF,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,SAAoB,EAAE,EAAE,CAC3C,iBAAiB,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAyB,CAAC;IACnF,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC7C,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAA2B,CAAC;QACtF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,WAAwB,EAAE,EAAE,CACjD,mBAAmB,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAA2B,CAAC;IAC3F,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;QACrD,MAAM,2BAA2B,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAmC,CAAC;QAC9G,MAAM,CAAC,mBAAmB,GAAG,CAAC,CAAC,mBAAwC,EAAE,EAAE,CACzE,2BAA2B,CACzB,iCAAiC,CAAC,mBAAmB,CAAC,CACvD,CAAmC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAkC,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC;IAEhD,OAAO;QACL,GAAG,OAAO;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC/B,QAAQ,CAAC,cAAc,QAAQ,EAAE,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,aAAa,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"wrapOperations.js","sourceRoot":"","sources":["../../src/telemetry/wrapOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAgBpD,QAAA,MAAM,WAAW,uIAWP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAgBpD,QAAA,MAAM,WAAW,uIAWP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AA8BrD,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA4EjD"}
|
|
@@ -26,54 +26,32 @@ const APP_ACTIONS = [
|
|
|
26
26
|
const schema = z.object({
|
|
27
27
|
action: z
|
|
28
28
|
.enum(APP_ACTIONS)
|
|
29
|
-
.describe('
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'uninstall: remove from device (requires id or name; optional keepData for Android). ' +
|
|
34
|
-
'list: list installed apps (optional applicationType for iOS). ' +
|
|
35
|
-
'is_installed: check if app is installed (requires id or name). ' +
|
|
29
|
+
.describe('activate: foreground app; terminate: stop app; is_installed: check installation; ' +
|
|
30
|
+
'clear: clear app data without uninstalling (all require id or name). ' +
|
|
31
|
+
'install: requires path. uninstall: requires id/name; Android keepData is optional. ' +
|
|
32
|
+
'list: optional iOS applicationType. ' +
|
|
36
33
|
'query_state: get state 0=not installed,1=not running,2=background suspended,3=background,4=foreground (requires id or name). ' +
|
|
37
|
-
'background: send foreground app to background
|
|
38
|
-
'
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
name: z
|
|
45
|
-
.string()
|
|
46
|
-
.optional()
|
|
47
|
-
.describe('Human-readable app name (e.g. "Spotify"). Used to resolve the app id. Required (as alternative to id) for: activate, terminate, uninstall, is_installed, query_state, clear.'),
|
|
48
|
-
path: z.string().optional().describe('Path to the app file to install. Required for: install.'),
|
|
49
|
-
keepData: z
|
|
50
|
-
.boolean()
|
|
51
|
-
.optional()
|
|
52
|
-
.describe('Keep app data and cache after uninstall. Android only. Used with: uninstall.'),
|
|
53
|
-
applicationType: z
|
|
54
|
-
.enum(['User', 'System'])
|
|
55
|
-
.optional()
|
|
56
|
-
.describe('iOS only: filter by "User" (default) or "System" apps. Used with: list.'),
|
|
34
|
+
'background: send foreground app to background; optional seconds (default 5). ' +
|
|
35
|
+
'deep_link: requires url; id/name is optional.'),
|
|
36
|
+
id: z.string().optional().describe('Android package or iOS bundle ID; takes precedence over name.'),
|
|
37
|
+
name: z.string().optional().describe('Human-readable app name resolved to an ID; alternative to id.'),
|
|
38
|
+
path: z.string().optional().describe('App file path; required for install.'),
|
|
39
|
+
keepData: z.boolean().optional().describe('Android uninstall: preserve app data and cache.'),
|
|
40
|
+
applicationType: z.enum(['User', 'System']).optional().describe('iOS list filter: User (default) or System.'),
|
|
57
41
|
seconds: z
|
|
58
42
|
.number()
|
|
59
43
|
.min(-1)
|
|
60
44
|
.max(86400)
|
|
61
45
|
.optional()
|
|
62
|
-
.describe(`
|
|
63
|
-
url: z
|
|
64
|
-
|
|
65
|
-
.optional()
|
|
66
|
-
.describe('Deep link URL to open (e.g. https://example.com, myapp://path). Required for: deep_link.'),
|
|
67
|
-
waitForLaunch: z
|
|
68
|
-
.boolean()
|
|
69
|
-
.optional()
|
|
70
|
-
.describe('Android only. If false, ADB does not wait for the activity to return. Defaults to true. Used with: deep_link.'),
|
|
46
|
+
.describe(`Background duration; default ${DEFAULT_BACKGROUND_SECONDS}. Use -1 to remain in background.`),
|
|
47
|
+
url: z.string().optional().describe('URL for deep_link (e.g. https://example.com or myapp://path).'),
|
|
48
|
+
waitForLaunch: z.boolean().optional().describe('Android deep_link: wait for the activity to return; default true.'),
|
|
71
49
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
72
50
|
});
|
|
73
51
|
export default function app(server) {
|
|
74
52
|
server.addTool({
|
|
75
53
|
name: 'appium_app_lifecycle',
|
|
76
|
-
description:
|
|
54
|
+
description: 'Manage app lifecycle, installation, state, data, and deep links.',
|
|
77
55
|
parameters: schema,
|
|
78
56
|
annotations: {
|
|
79
57
|
readOnlyHint: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,UAAU,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAE,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAE7C,MAAM,WAAW,GAAG;IAClB,UAAU;IACV,WAAW;IACX,SAAS;IACT,WAAW;IACX,MAAM;IACN,cAAc;IACd,aAAa;IACb,YAAY;IACZ,OAAO;IACP,WAAW;CACH,CAAC;AAIX,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAUpD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAUpD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsJ/D"}
|
|
@@ -14,13 +14,11 @@ export default function mobilePermissions(server) {
|
|
|
14
14
|
id: z
|
|
15
15
|
.string()
|
|
16
16
|
.optional()
|
|
17
|
-
.describe('App
|
|
18
|
-
'Optional for Android (defaults to the app under test). Required for iOS get and update.'),
|
|
17
|
+
.describe('App ID; overrides name. Android defaults to the app under test; required for iOS get/update.'),
|
|
19
18
|
name: z
|
|
20
19
|
.string()
|
|
21
20
|
.optional()
|
|
22
|
-
.describe('
|
|
23
|
-
'Optional for Android (defaults to the app under test). Required (as alternative to id) for iOS get and update.'),
|
|
21
|
+
.describe('App name resolved to an ID. Android defaults to the app under test; alternative to id for iOS get/update.'),
|
|
24
22
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
25
23
|
permissionFilter: z
|
|
26
24
|
.enum(['denied', 'granted', 'requested'])
|
|
@@ -47,7 +45,7 @@ export default function mobilePermissions(server) {
|
|
|
47
45
|
});
|
|
48
46
|
server.addTool({
|
|
49
47
|
name: 'appium_mobile_permissions',
|
|
50
|
-
description: '
|
|
48
|
+
description: 'Get/update Android app permissions or iOS Simulator privacy services; reset iOS privacy prompts. See action-specific parameters.',
|
|
51
49
|
parameters: schema,
|
|
52
50
|
annotations: {
|
|
53
51
|
readOnlyHint: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEjD,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3E,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAe;IACvD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;aAChC,QAAQ,CACP,iEAAiE;YAC/D,qEAAqE;YACrE,oEAAoE,CACvE;QACH,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-recording.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/screen-recording.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAQpD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5D,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0GAA0G;IAC1G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+HAA+H;IAC/H,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;CAC/E;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"screen-recording.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/screen-recording.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAQpD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5D,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0GAA0G;IAC1G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+HAA+H;IAC/H,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;CAC/E;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAyCD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA0F7D"}
|
|
@@ -15,19 +15,14 @@ async function saveRecording(base64Video) {
|
|
|
15
15
|
return filepath;
|
|
16
16
|
}
|
|
17
17
|
const screenRecordingSchema = z.object({
|
|
18
|
-
action: z
|
|
19
|
-
.enum(['start', 'stop'])
|
|
20
|
-
.describe('Use start to begin recording. Use stop to end the current recording, retrieve it from the driver, and save it to disk.'),
|
|
18
|
+
action: z.enum(['start', 'stop']).describe('start begins recording; stop ends, retrieves, and saves it.'),
|
|
21
19
|
timeLimit: z
|
|
22
20
|
.number()
|
|
23
21
|
.int()
|
|
24
22
|
.min(1)
|
|
25
23
|
.optional()
|
|
26
|
-
.describe('
|
|
27
|
-
forceRestart: z
|
|
28
|
-
.boolean()
|
|
29
|
-
.optional()
|
|
30
|
-
.describe('If true, stop any active recording immediately and start a new one without returning the previous video. Default: false.'),
|
|
24
|
+
.describe('Recorder limit in seconds; it does not retrieve/save automatically, so call stop. iOS default 180/max 4200; Android default 180/max 1800.'),
|
|
25
|
+
forceRestart: z.boolean().optional().describe('Restart and discard any active recording; default false.'),
|
|
31
26
|
videoQuality: z
|
|
32
27
|
.enum(['low', 'medium', 'high', 'photo'])
|
|
33
28
|
.optional()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-recording.js","sourceRoot":"","sources":["../../../src/tools/interactions/screen-recording.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAE/B,OAAO,EAAC,EAAE,EAAC,MAAM,iBAAiB,CAAC;AAEnC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,oBAAoB,IAAI,iBAAiB,EAAE,mBAAmB,IAAI,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AA4C7F,KAAK,UAAU,aAAa,CAAC,WAAmB;IAC9C,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,aAAa,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"screen-recording.js","sourceRoot":"","sources":["../../../src/tools/interactions/screen-recording.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.89.0",
|
|
4
4
|
"description": "Intelligent MCP server providing AI assistants with powerful tools and resources for Appium mobile automation",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/appium/appium-mcp/issues"
|
|
@@ -7,7 +7,7 @@ import {fileURLToPath} from 'node:url';
|
|
|
7
7
|
import {Client} from '@modelcontextprotocol/sdk/client/index.js';
|
|
8
8
|
import {StdioClientTransport} from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
9
9
|
|
|
10
|
-
const MAX_DISCOVERY_CHARS =
|
|
10
|
+
const MAX_DISCOVERY_CHARS = 45_000;
|
|
11
11
|
const ESTIMATED_CHARS_PER_TOKEN = 4;
|
|
12
12
|
const LARGEST_TOOL_COUNT = 10;
|
|
13
13
|
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.appium/appium-mcp",
|
|
4
4
|
"title": "MCP Appium - Mobile Development and Automation Server",
|
|
5
5
|
"description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.89.0",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.
|
|
11
|
+
"version": "1.89.0",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
package/src/schema.ts
CHANGED
|
@@ -21,6 +21,8 @@ type PromptLoad = NonNullable<PromptDef['load']>;
|
|
|
21
21
|
type ResourceLoad = NonNullable<ResourceDef['load']>;
|
|
22
22
|
type ResourceTemplateLoad = NonNullable<ResourceTemplateDef['load']>;
|
|
23
23
|
|
|
24
|
+
const SAFE_TOOL_CONTENT_TYPES = new Set(['audio', 'image', 'resource', 'resource_link', 'text']);
|
|
25
|
+
|
|
24
26
|
/**
|
|
25
27
|
* Installs telemetry wrappers on the given FastMCP server instance. This should be
|
|
26
28
|
* called early in the server setup process, before registering any tools, prompts,
|
|
@@ -77,15 +79,98 @@ export function wrapToolWithTelemetry(toolDef: ToolDef): ToolDef {
|
|
|
77
79
|
execute: async (args, context) =>
|
|
78
80
|
withSpan(`tools/call ${toolName}`, toolAttributes(toolName, args), async () => {
|
|
79
81
|
const result = await execute(args, context);
|
|
82
|
+
const span = getActiveSpan();
|
|
83
|
+
span?.setAttributes(safeToolResultSizeAttributes(result));
|
|
80
84
|
if (isErrorResult(result)) {
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
span?.setStatus({code: SpanStatusCode.ERROR});
|
|
86
|
+
span?.setAttribute('mcp.tool.result.is_error', true);
|
|
83
87
|
}
|
|
84
88
|
return result;
|
|
85
89
|
}),
|
|
86
90
|
};
|
|
87
91
|
}
|
|
88
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Builds payload-free size attributes for a tool result.
|
|
95
|
+
*
|
|
96
|
+
* This intentionally counts known MCP content fields directly instead of
|
|
97
|
+
* serializing the whole result. Large page sources, UI HTML, and base64 data
|
|
98
|
+
* therefore are not copied or recorded in telemetry.
|
|
99
|
+
*/
|
|
100
|
+
export function safeToolResultSizeAttributes(result: unknown): Record<string, number | string[]> {
|
|
101
|
+
if (typeof result === 'string') {
|
|
102
|
+
return {'mcp.tool.result.text_chars': result.length};
|
|
103
|
+
}
|
|
104
|
+
if (!isRecord(result) || !Array.isArray(result.content)) {
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const contentTypes = new Set<string>();
|
|
109
|
+
let textChars = 0;
|
|
110
|
+
let resourceCount = 0;
|
|
111
|
+
let resourceTextChars = 0;
|
|
112
|
+
let imageCount = 0;
|
|
113
|
+
let audioCount = 0;
|
|
114
|
+
let base64Chars = 0;
|
|
115
|
+
let base64BytesEstimate = 0;
|
|
116
|
+
|
|
117
|
+
for (const content of result.content) {
|
|
118
|
+
if (!isRecord(content)) {
|
|
119
|
+
contentTypes.add('other');
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const contentType =
|
|
124
|
+
typeof content.type === 'string' && SAFE_TOOL_CONTENT_TYPES.has(content.type) ? content.type : 'other';
|
|
125
|
+
contentTypes.add(contentType);
|
|
126
|
+
|
|
127
|
+
if (contentType === 'text' && typeof content.text === 'string') {
|
|
128
|
+
textChars += content.text.length;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (contentType === 'image' || contentType === 'audio') {
|
|
133
|
+
if (contentType === 'image') {
|
|
134
|
+
imageCount += 1;
|
|
135
|
+
} else {
|
|
136
|
+
audioCount += 1;
|
|
137
|
+
}
|
|
138
|
+
if (typeof content.data === 'string') {
|
|
139
|
+
base64Chars += content.data.length;
|
|
140
|
+
base64BytesEstimate += estimateBase64DecodedBytes(content.data);
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (contentType === 'resource') {
|
|
146
|
+
resourceCount += 1;
|
|
147
|
+
if (isRecord(content.resource)) {
|
|
148
|
+
if (typeof content.resource.text === 'string') {
|
|
149
|
+
resourceTextChars += content.resource.text.length;
|
|
150
|
+
}
|
|
151
|
+
if (typeof content.resource.blob === 'string') {
|
|
152
|
+
base64Chars += content.resource.blob.length;
|
|
153
|
+
base64BytesEstimate += estimateBase64DecodedBytes(content.resource.blob);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const attributes: Record<string, number | string[]> = {
|
|
160
|
+
'mcp.tool.result.content_count': result.content.length,
|
|
161
|
+
'mcp.tool.result.content_types': [...contentTypes].sort(),
|
|
162
|
+
'mcp.tool.result.text_chars': textChars,
|
|
163
|
+
'mcp.tool.result.resource_count': resourceCount,
|
|
164
|
+
'mcp.tool.result.resource_text_chars': resourceTextChars,
|
|
165
|
+
'mcp.tool.result.image_count': imageCount,
|
|
166
|
+
'mcp.tool.result.audio_count': audioCount,
|
|
167
|
+
'mcp.tool.result.base64_chars': base64Chars,
|
|
168
|
+
'mcp.tool.result.base64_bytes_estimate': base64BytesEstimate,
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
return attributes;
|
|
172
|
+
}
|
|
173
|
+
|
|
89
174
|
export function safeInputValueAttributes(args: unknown): Record<string, string | number | boolean | string[]> {
|
|
90
175
|
if (!isArgumentValueTelemetryEnabled()) {
|
|
91
176
|
return {};
|
|
@@ -213,3 +298,25 @@ function isErrorResult(result: unknown): boolean {
|
|
|
213
298
|
!!result && typeof result === 'object' && 'isError' in result && (result as {isError?: unknown}).isError === true
|
|
214
299
|
);
|
|
215
300
|
}
|
|
301
|
+
|
|
302
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
303
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function estimateBase64DecodedBytes(value: string): number {
|
|
307
|
+
const commaIndex = value.indexOf(',');
|
|
308
|
+
const hasDataUriPrefix = commaIndex >= 7 && value.slice(commaIndex - 7, commaIndex).toLowerCase() === ';base64';
|
|
309
|
+
const contentStart = hasDataUriPrefix ? commaIndex + 1 : 0;
|
|
310
|
+
const encodedLength = value.length - contentStart;
|
|
311
|
+
if (encodedLength <= 0) {
|
|
312
|
+
return 0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
let padding = 0;
|
|
316
|
+
if (value.endsWith('==')) {
|
|
317
|
+
padding = 2;
|
|
318
|
+
} else if (value.endsWith('=')) {
|
|
319
|
+
padding = 1;
|
|
320
|
+
}
|
|
321
|
+
return Math.max(0, Math.floor((encodedLength * 3) / 4) - padding);
|
|
322
|
+
}
|
|
@@ -33,64 +33,34 @@ const schema = z.object({
|
|
|
33
33
|
action: z
|
|
34
34
|
.enum(APP_ACTIONS)
|
|
35
35
|
.describe(
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'
|
|
40
|
-
'uninstall: remove from device (requires id or name; optional keepData for Android). ' +
|
|
41
|
-
'list: list installed apps (optional applicationType for iOS). ' +
|
|
42
|
-
'is_installed: check if app is installed (requires id or name). ' +
|
|
36
|
+
'activate: foreground app; terminate: stop app; is_installed: check installation; ' +
|
|
37
|
+
'clear: clear app data without uninstalling (all require id or name). ' +
|
|
38
|
+
'install: requires path. uninstall: requires id/name; Android keepData is optional. ' +
|
|
39
|
+
'list: optional iOS applicationType. ' +
|
|
43
40
|
'query_state: get state 0=not installed,1=not running,2=background suspended,3=background,4=foreground (requires id or name). ' +
|
|
44
|
-
'background: send foreground app to background
|
|
45
|
-
'
|
|
46
|
-
'deep_link: open a URL with an app (requires url; optional id or name).',
|
|
41
|
+
'background: send foreground app to background; optional seconds (default 5). ' +
|
|
42
|
+
'deep_link: requires url; id/name is optional.',
|
|
47
43
|
),
|
|
48
|
-
id: z
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
),
|
|
54
|
-
name: z
|
|
55
|
-
.string()
|
|
56
|
-
.optional()
|
|
57
|
-
.describe(
|
|
58
|
-
'Human-readable app name (e.g. "Spotify"). Used to resolve the app id. Required (as alternative to id) for: activate, terminate, uninstall, is_installed, query_state, clear.',
|
|
59
|
-
),
|
|
60
|
-
path: z.string().optional().describe('Path to the app file to install. Required for: install.'),
|
|
61
|
-
keepData: z
|
|
62
|
-
.boolean()
|
|
63
|
-
.optional()
|
|
64
|
-
.describe('Keep app data and cache after uninstall. Android only. Used with: uninstall.'),
|
|
65
|
-
applicationType: z
|
|
66
|
-
.enum(['User', 'System'])
|
|
67
|
-
.optional()
|
|
68
|
-
.describe('iOS only: filter by "User" (default) or "System" apps. Used with: list.'),
|
|
44
|
+
id: z.string().optional().describe('Android package or iOS bundle ID; takes precedence over name.'),
|
|
45
|
+
name: z.string().optional().describe('Human-readable app name resolved to an ID; alternative to id.'),
|
|
46
|
+
path: z.string().optional().describe('App file path; required for install.'),
|
|
47
|
+
keepData: z.boolean().optional().describe('Android uninstall: preserve app data and cache.'),
|
|
48
|
+
applicationType: z.enum(['User', 'System']).optional().describe('iOS list filter: User (default) or System.'),
|
|
69
49
|
seconds: z
|
|
70
50
|
.number()
|
|
71
51
|
.min(-1)
|
|
72
52
|
.max(86400)
|
|
73
53
|
.optional()
|
|
74
|
-
.describe(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
url: z
|
|
78
|
-
.string()
|
|
79
|
-
.optional()
|
|
80
|
-
.describe('Deep link URL to open (e.g. https://example.com, myapp://path). Required for: deep_link.'),
|
|
81
|
-
waitForLaunch: z
|
|
82
|
-
.boolean()
|
|
83
|
-
.optional()
|
|
84
|
-
.describe(
|
|
85
|
-
'Android only. If false, ADB does not wait for the activity to return. Defaults to true. Used with: deep_link.',
|
|
86
|
-
),
|
|
54
|
+
.describe(`Background duration; default ${DEFAULT_BACKGROUND_SECONDS}. Use -1 to remain in background.`),
|
|
55
|
+
url: z.string().optional().describe('URL for deep_link (e.g. https://example.com or myapp://path).'),
|
|
56
|
+
waitForLaunch: z.boolean().optional().describe('Android deep_link: wait for the activity to return; default true.'),
|
|
87
57
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
88
58
|
});
|
|
89
59
|
|
|
90
60
|
export default function app(server: FastMCP): void {
|
|
91
61
|
server.addTool({
|
|
92
62
|
name: 'appium_app_lifecycle',
|
|
93
|
-
description:
|
|
63
|
+
description: 'Manage app lifecycle, installation, state, data, and deep links.',
|
|
94
64
|
parameters: schema,
|
|
95
65
|
annotations: {
|
|
96
66
|
readOnlyHint: false,
|
|
@@ -20,16 +20,12 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
20
20
|
id: z
|
|
21
21
|
.string()
|
|
22
22
|
.optional()
|
|
23
|
-
.describe(
|
|
24
|
-
'App identifier (package name for Android, bundle ID for iOS). Takes precedence over name. ' +
|
|
25
|
-
'Optional for Android (defaults to the app under test). Required for iOS get and update.',
|
|
26
|
-
),
|
|
23
|
+
.describe('App ID; overrides name. Android defaults to the app under test; required for iOS get/update.'),
|
|
27
24
|
name: z
|
|
28
25
|
.string()
|
|
29
26
|
.optional()
|
|
30
27
|
.describe(
|
|
31
|
-
'
|
|
32
|
-
'Optional for Android (defaults to the app under test). Required (as alternative to id) for iOS get and update.',
|
|
28
|
+
'App name resolved to an ID. Android defaults to the app under test; alternative to id for iOS get/update.',
|
|
33
29
|
),
|
|
34
30
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
35
31
|
permissionFilter: z
|
|
@@ -65,7 +61,7 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
65
61
|
server.addTool({
|
|
66
62
|
name: 'appium_mobile_permissions',
|
|
67
63
|
description:
|
|
68
|
-
'
|
|
64
|
+
'Get/update Android app permissions or iOS Simulator privacy services; reset iOS privacy prompts. See action-specific parameters.',
|
|
69
65
|
parameters: schema,
|
|
70
66
|
annotations: {
|
|
71
67
|
readOnlyHint: false,
|
|
@@ -62,25 +62,16 @@ async function saveRecording(base64Video: string): Promise<string> {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const screenRecordingSchema = z.object({
|
|
65
|
-
action: z
|
|
66
|
-
.enum(['start', 'stop'])
|
|
67
|
-
.describe(
|
|
68
|
-
'Use start to begin recording. Use stop to end the current recording, retrieve it from the driver, and save it to disk.',
|
|
69
|
-
),
|
|
65
|
+
action: z.enum(['start', 'stop']).describe('start begins recording; stop ends, retrieves, and saves it.'),
|
|
70
66
|
timeLimit: z
|
|
71
67
|
.number()
|
|
72
68
|
.int()
|
|
73
69
|
.min(1)
|
|
74
70
|
.optional()
|
|
75
71
|
.describe(
|
|
76
|
-
'
|
|
77
|
-
),
|
|
78
|
-
forceRestart: z
|
|
79
|
-
.boolean()
|
|
80
|
-
.optional()
|
|
81
|
-
.describe(
|
|
82
|
-
'If true, stop any active recording immediately and start a new one without returning the previous video. Default: false.',
|
|
72
|
+
'Recorder limit in seconds; it does not retrieve/save automatically, so call stop. iOS default 180/max 4200; Android default 180/max 1800.',
|
|
83
73
|
),
|
|
74
|
+
forceRestart: z.boolean().optional().describe('Restart and discard any active recording; default false.'),
|
|
84
75
|
videoQuality: z
|
|
85
76
|
.enum(['low', 'medium', 'high', 'photo'])
|
|
86
77
|
.optional()
|