appium-mcp 1.61.0 → 1.62.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 +6 -0
- package/dist/tools/app-management/permissions.d.ts.map +1 -1
- package/dist/tools/app-management/permissions.js +34 -26
- package/dist/tools/app-management/permissions.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/tools/app-management/permissions.ts +42 -29
- package/src/tools/index.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [1.62.0](https://github.com/appium/appium-mcp/compare/v1.61.0...v1.62.0) (2026-04-22)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **app-management:** export permissions to server and add name parameter ([#270](https://github.com/appium/appium-mcp/issues/270)) ([a6d8e1e](https://github.com/appium/appium-mcp/commit/a6d8e1e95b3374cb33237168dfb2b5d761563acc))
|
|
6
|
+
|
|
1
7
|
## [1.61.0](https://github.com/appium/appium-mcp/compare/v1.60.2...v1.61.0) (2026-04-21)
|
|
2
8
|
|
|
3
9
|
### Features
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AActD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2L/D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { getPlatformName, PLATFORM } from '../../session-store.js';
|
|
3
3
|
import { execute } from '../../command.js';
|
|
4
|
+
import { resolveAppId } from './resolve-app-id.js';
|
|
4
5
|
import { resolveDriver, textResult, errorResult, toolErrorMessage, } from '../tool-response.js';
|
|
5
6
|
const iosPermissionStateSchema = z.enum(['yes', 'no', 'unset', 'limited']);
|
|
6
7
|
export default function mobilePermissions(server) {
|
|
@@ -10,6 +11,16 @@ export default function mobilePermissions(server) {
|
|
|
10
11
|
.describe('get: list (Android) or read one privacy state (iOS Simulator). ' +
|
|
11
12
|
'update: grant/revoke (Android) or set privacy map (iOS Simulator). ' +
|
|
12
13
|
'reset: restore a privacy prompt for the app under test (iOS only).'),
|
|
14
|
+
id: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('App identifier (package name for Android, bundle ID for iOS). Takes precedence over name. ' +
|
|
18
|
+
'Optional for Android (defaults to the app under test). Required for iOS get and update.'),
|
|
19
|
+
name: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Human-readable app name (e.g. "Spotify"). Used to resolve the app id. ' +
|
|
23
|
+
'Optional for Android (defaults to the app under test). Required (as alternative to id) for iOS get and update.'),
|
|
13
24
|
sessionId: z
|
|
14
25
|
.string()
|
|
15
26
|
.optional()
|
|
@@ -18,14 +29,6 @@ export default function mobilePermissions(server) {
|
|
|
18
29
|
.enum(['denied', 'granted', 'requested'])
|
|
19
30
|
.optional()
|
|
20
31
|
.describe('Android get only: which bucket to return. Defaults to requested per UiAutomator2.'),
|
|
21
|
-
appPackage: z
|
|
22
|
-
.string()
|
|
23
|
-
.optional()
|
|
24
|
-
.describe('Android get/update: package to target. Defaults to the app under test.'),
|
|
25
|
-
bundleId: z
|
|
26
|
-
.string()
|
|
27
|
-
.optional()
|
|
28
|
-
.describe('iOS get/update: bundle id of the app. Required for iOS get and update.'),
|
|
29
32
|
service: z
|
|
30
33
|
.union([z.string(), z.number()])
|
|
31
34
|
.optional()
|
|
@@ -50,7 +53,7 @@ export default function mobilePermissions(server) {
|
|
|
50
53
|
});
|
|
51
54
|
server.addTool({
|
|
52
55
|
name: 'appium_mobile_permissions',
|
|
53
|
-
description: 'Manage mobile app permissions in one place. action=get: Android lists runtime permissions for a package; iOS Simulator reads one service state for
|
|
56
|
+
description: 'Manage mobile app permissions in one place. action=get: Android lists runtime permissions for a package; iOS Simulator reads one service state for an app (needs id or name + service). action=update: Android changes permissions (grant/revoke or AppOps); iOS Simulator sets privacy via access map (needs id or name + access). action=reset: iOS only — resets one privacy service for the AUT (needs service).',
|
|
54
57
|
parameters: schema,
|
|
55
58
|
annotations: {
|
|
56
59
|
readOnlyHint: false,
|
|
@@ -64,44 +67,48 @@ export default function mobilePermissions(server) {
|
|
|
64
67
|
const { driver } = resolved;
|
|
65
68
|
try {
|
|
66
69
|
const platform = getPlatformName(driver);
|
|
70
|
+
const appId = args.id ??
|
|
71
|
+
(args.name
|
|
72
|
+
? await resolveAppId(args.name, args.sessionId)
|
|
73
|
+
: undefined);
|
|
67
74
|
if (args.action === 'get') {
|
|
68
75
|
if (platform === PLATFORM.android) {
|
|
69
76
|
const params = {};
|
|
70
77
|
if (args.permissionFilter != null) {
|
|
71
78
|
params.type = args.permissionFilter;
|
|
72
79
|
}
|
|
73
|
-
if (
|
|
74
|
-
params.appPackage =
|
|
80
|
+
if (appId != null) {
|
|
81
|
+
params.appPackage = appId;
|
|
75
82
|
}
|
|
76
83
|
const raw = await execute(driver, 'mobile: getPermissions', params);
|
|
77
84
|
return textResult(JSON.stringify(raw, null, 2));
|
|
78
85
|
}
|
|
79
86
|
if (platform === PLATFORM.ios) {
|
|
80
|
-
if (!
|
|
81
|
-
|
|
87
|
+
if (!appId) {
|
|
88
|
+
return errorResult('iOS get requires id or name and service (string).');
|
|
82
89
|
}
|
|
83
90
|
if (args.service === undefined ||
|
|
84
91
|
typeof args.service === 'number') {
|
|
85
|
-
|
|
92
|
+
return errorResult('iOS get requires service as a string name (e.g. camera, photos).');
|
|
86
93
|
}
|
|
87
94
|
const raw = await execute(driver, 'mobile: getPermission', {
|
|
88
|
-
bundleId:
|
|
95
|
+
bundleId: appId,
|
|
89
96
|
service: args.service,
|
|
90
97
|
});
|
|
91
98
|
return textResult(String(raw));
|
|
92
99
|
}
|
|
93
|
-
|
|
100
|
+
return errorResult(`Unsupported platform: ${platform}. Only Android and iOS are supported.`);
|
|
94
101
|
}
|
|
95
102
|
if (args.action === 'update') {
|
|
96
103
|
if (platform === PLATFORM.android) {
|
|
97
104
|
if (args.permissions === undefined) {
|
|
98
|
-
|
|
105
|
+
return errorResult('Android update requires permissions.');
|
|
99
106
|
}
|
|
100
107
|
const params = {
|
|
101
108
|
permissions: args.permissions,
|
|
102
109
|
};
|
|
103
|
-
if (
|
|
104
|
-
params.appPackage =
|
|
110
|
+
if (appId != null) {
|
|
111
|
+
params.appPackage = appId;
|
|
105
112
|
}
|
|
106
113
|
if (args.permissionChangeAction != null) {
|
|
107
114
|
params.action = args.permissionChangeAction;
|
|
@@ -113,22 +120,23 @@ export default function mobilePermissions(server) {
|
|
|
113
120
|
return textResult('Permissions updated successfully.');
|
|
114
121
|
}
|
|
115
122
|
if (platform === PLATFORM.ios) {
|
|
116
|
-
if (!
|
|
117
|
-
|
|
123
|
+
if (!appId || !args.access) {
|
|
124
|
+
return errorResult('iOS update requires id or name and access map.');
|
|
118
125
|
}
|
|
119
126
|
await execute(driver, 'mobile: setPermission', {
|
|
120
|
-
bundleId:
|
|
127
|
+
bundleId: appId,
|
|
121
128
|
access: args.access,
|
|
122
129
|
});
|
|
123
130
|
return textResult('Permission settings updated successfully.');
|
|
124
131
|
}
|
|
125
|
-
|
|
132
|
+
return errorResult(`Unsupported platform: ${platform}. Only Android and iOS are supported.`);
|
|
126
133
|
}
|
|
134
|
+
// action === 'reset'
|
|
127
135
|
if (platform !== PLATFORM.ios) {
|
|
128
|
-
|
|
136
|
+
return errorResult('action=reset is only supported on iOS (mobile: resetPermission for the AUT).');
|
|
129
137
|
}
|
|
130
138
|
if (args.service === undefined) {
|
|
131
|
-
|
|
139
|
+
return errorResult('iOS reset requires service (name or numeric id).');
|
|
132
140
|
}
|
|
133
141
|
await execute(driver, 'mobile: resetPermission', {
|
|
134
142
|
service: args.service,
|
|
@@ -136,7 +144,7 @@ export default function mobilePermissions(server) {
|
|
|
136
144
|
return textResult('Permission reset successfully.');
|
|
137
145
|
}
|
|
138
146
|
catch (err) {
|
|
139
|
-
return errorResult(`Failed permissions action ${args.action}
|
|
147
|
+
return errorResult(`Failed permissions action ${args.action}: ${toolErrorMessage(err)}`);
|
|
140
148
|
}
|
|
141
149
|
},
|
|
142
150
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/tools/app-management/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,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,
|
|
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":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAwCvC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA8H3D"}
|
package/dist/tools/index.js
CHANGED
|
@@ -32,6 +32,7 @@ import screenshot from './interactions/screenshot.js';
|
|
|
32
32
|
import getWindowSize from './interactions/window-size.js';
|
|
33
33
|
import screenRecording from './interactions/screen-recording.js';
|
|
34
34
|
import app from './app-management/app.js';
|
|
35
|
+
import mobilePermissions from './app-management/permissions.js';
|
|
35
36
|
import context from './context/context.js';
|
|
36
37
|
export default function registerTools(server) {
|
|
37
38
|
// Wrap addTool to inject logging around tool execution
|
|
@@ -136,6 +137,7 @@ export default function registerTools(server) {
|
|
|
136
137
|
screenRecording(server);
|
|
137
138
|
// App Management
|
|
138
139
|
app(server);
|
|
140
|
+
mobilePermissions(server);
|
|
139
141
|
// Context Management
|
|
140
142
|
context(server);
|
|
141
143
|
// Test Generation
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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.62.0",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.
|
|
11
|
+
"version": "1.62.0",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
|
Binary file
|
|
@@ -2,6 +2,7 @@ import type { ContentResult, FastMCP } from 'fastmcp';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { getPlatformName, PLATFORM } from '../../session-store.js';
|
|
4
4
|
import { execute } from '../../command.js';
|
|
5
|
+
import { resolveAppId } from './resolve-app-id.js';
|
|
5
6
|
import {
|
|
6
7
|
resolveDriver,
|
|
7
8
|
textResult,
|
|
@@ -20,27 +21,29 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
20
21
|
'update: grant/revoke (Android) or set privacy map (iOS Simulator). ' +
|
|
21
22
|
'reset: restore a privacy prompt for the app under test (iOS only).'
|
|
22
23
|
),
|
|
23
|
-
|
|
24
|
+
id: z
|
|
24
25
|
.string()
|
|
25
26
|
.optional()
|
|
26
|
-
.describe('Session ID to target. If omitted, uses the active session.'),
|
|
27
|
-
permissionFilter: z
|
|
28
|
-
.enum(['denied', 'granted', 'requested'])
|
|
29
|
-
.optional()
|
|
30
27
|
.describe(
|
|
31
|
-
'
|
|
28
|
+
'App identifier (package name for Android, bundle ID for iOS). Takes precedence over name. ' +
|
|
29
|
+
'Optional for Android (defaults to the app under test). Required for iOS get and update.'
|
|
32
30
|
),
|
|
33
|
-
|
|
31
|
+
name: z
|
|
34
32
|
.string()
|
|
35
33
|
.optional()
|
|
36
34
|
.describe(
|
|
37
|
-
'
|
|
35
|
+
'Human-readable app name (e.g. "Spotify"). Used to resolve the app id. ' +
|
|
36
|
+
'Optional for Android (defaults to the app under test). Required (as alternative to id) for iOS get and update.'
|
|
38
37
|
),
|
|
39
|
-
|
|
38
|
+
sessionId: z
|
|
40
39
|
.string()
|
|
41
40
|
.optional()
|
|
41
|
+
.describe('Session ID to target. If omitted, uses the active session.'),
|
|
42
|
+
permissionFilter: z
|
|
43
|
+
.enum(['denied', 'granted', 'requested'])
|
|
44
|
+
.optional()
|
|
42
45
|
.describe(
|
|
43
|
-
'
|
|
46
|
+
'Android get only: which bucket to return. Defaults to requested per UiAutomator2.'
|
|
44
47
|
),
|
|
45
48
|
service: z
|
|
46
49
|
.union([z.string(), z.number()])
|
|
@@ -76,7 +79,7 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
76
79
|
server.addTool({
|
|
77
80
|
name: 'appium_mobile_permissions',
|
|
78
81
|
description:
|
|
79
|
-
'Manage mobile app permissions in one place. action=get: Android lists runtime permissions for a package; iOS Simulator reads one service state for
|
|
82
|
+
'Manage mobile app permissions in one place. action=get: Android lists runtime permissions for a package; iOS Simulator reads one service state for an app (needs id or name + service). action=update: Android changes permissions (grant/revoke or AppOps); iOS Simulator sets privacy via access map (needs id or name + access). action=reset: iOS only — resets one privacy service for the AUT (needs service).',
|
|
80
83
|
parameters: schema,
|
|
81
84
|
annotations: {
|
|
82
85
|
readOnlyHint: false,
|
|
@@ -94,6 +97,11 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
94
97
|
|
|
95
98
|
try {
|
|
96
99
|
const platform = getPlatformName(driver);
|
|
100
|
+
const appId =
|
|
101
|
+
args.id ??
|
|
102
|
+
(args.name
|
|
103
|
+
? await resolveAppId(args.name, args.sessionId)
|
|
104
|
+
: undefined);
|
|
97
105
|
|
|
98
106
|
if (args.action === 'get') {
|
|
99
107
|
if (platform === PLATFORM.android) {
|
|
@@ -101,33 +109,33 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
101
109
|
if (args.permissionFilter != null) {
|
|
102
110
|
params.type = args.permissionFilter;
|
|
103
111
|
}
|
|
104
|
-
if (
|
|
105
|
-
params.appPackage =
|
|
112
|
+
if (appId != null) {
|
|
113
|
+
params.appPackage = appId;
|
|
106
114
|
}
|
|
107
115
|
const raw = await execute(driver, 'mobile: getPermissions', params);
|
|
108
116
|
return textResult(JSON.stringify(raw, null, 2));
|
|
109
117
|
}
|
|
110
118
|
if (platform === PLATFORM.ios) {
|
|
111
|
-
if (!
|
|
112
|
-
|
|
113
|
-
'iOS get requires
|
|
119
|
+
if (!appId) {
|
|
120
|
+
return errorResult(
|
|
121
|
+
'iOS get requires id or name and service (string).'
|
|
114
122
|
);
|
|
115
123
|
}
|
|
116
124
|
if (
|
|
117
125
|
args.service === undefined ||
|
|
118
126
|
typeof args.service === 'number'
|
|
119
127
|
) {
|
|
120
|
-
|
|
128
|
+
return errorResult(
|
|
121
129
|
'iOS get requires service as a string name (e.g. camera, photos).'
|
|
122
130
|
);
|
|
123
131
|
}
|
|
124
132
|
const raw = await execute(driver, 'mobile: getPermission', {
|
|
125
|
-
bundleId:
|
|
133
|
+
bundleId: appId,
|
|
126
134
|
service: args.service,
|
|
127
135
|
});
|
|
128
136
|
return textResult(String(raw));
|
|
129
137
|
}
|
|
130
|
-
|
|
138
|
+
return errorResult(
|
|
131
139
|
`Unsupported platform: ${platform}. Only Android and iOS are supported.`
|
|
132
140
|
);
|
|
133
141
|
}
|
|
@@ -135,13 +143,13 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
135
143
|
if (args.action === 'update') {
|
|
136
144
|
if (platform === PLATFORM.android) {
|
|
137
145
|
if (args.permissions === undefined) {
|
|
138
|
-
|
|
146
|
+
return errorResult('Android update requires permissions.');
|
|
139
147
|
}
|
|
140
148
|
const params: Record<string, unknown> = {
|
|
141
149
|
permissions: args.permissions,
|
|
142
150
|
};
|
|
143
|
-
if (
|
|
144
|
-
params.appPackage =
|
|
151
|
+
if (appId != null) {
|
|
152
|
+
params.appPackage = appId;
|
|
145
153
|
}
|
|
146
154
|
if (args.permissionChangeAction != null) {
|
|
147
155
|
params.action = args.permissionChangeAction;
|
|
@@ -153,27 +161,32 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
153
161
|
return textResult('Permissions updated successfully.');
|
|
154
162
|
}
|
|
155
163
|
if (platform === PLATFORM.ios) {
|
|
156
|
-
if (!
|
|
157
|
-
|
|
164
|
+
if (!appId || !args.access) {
|
|
165
|
+
return errorResult(
|
|
166
|
+
'iOS update requires id or name and access map.'
|
|
167
|
+
);
|
|
158
168
|
}
|
|
159
169
|
await execute(driver, 'mobile: setPermission', {
|
|
160
|
-
bundleId:
|
|
170
|
+
bundleId: appId,
|
|
161
171
|
access: args.access,
|
|
162
172
|
});
|
|
163
173
|
return textResult('Permission settings updated successfully.');
|
|
164
174
|
}
|
|
165
|
-
|
|
175
|
+
return errorResult(
|
|
166
176
|
`Unsupported platform: ${platform}. Only Android and iOS are supported.`
|
|
167
177
|
);
|
|
168
178
|
}
|
|
169
179
|
|
|
180
|
+
// action === 'reset'
|
|
170
181
|
if (platform !== PLATFORM.ios) {
|
|
171
|
-
|
|
182
|
+
return errorResult(
|
|
172
183
|
'action=reset is only supported on iOS (mobile: resetPermission for the AUT).'
|
|
173
184
|
);
|
|
174
185
|
}
|
|
175
186
|
if (args.service === undefined) {
|
|
176
|
-
|
|
187
|
+
return errorResult(
|
|
188
|
+
'iOS reset requires service (name or numeric id).'
|
|
189
|
+
);
|
|
177
190
|
}
|
|
178
191
|
await execute(driver, 'mobile: resetPermission', {
|
|
179
192
|
service: args.service,
|
|
@@ -181,7 +194,7 @@ export default function mobilePermissions(server: FastMCP): void {
|
|
|
181
194
|
return textResult('Permission reset successfully.');
|
|
182
195
|
} catch (err: unknown) {
|
|
183
196
|
return errorResult(
|
|
184
|
-
`Failed permissions action ${args.action}
|
|
197
|
+
`Failed permissions action ${args.action}: ${toolErrorMessage(err)}`
|
|
185
198
|
);
|
|
186
199
|
}
|
|
187
200
|
},
|
package/src/tools/index.ts
CHANGED
|
@@ -47,6 +47,7 @@ import screenshot from './interactions/screenshot.js';
|
|
|
47
47
|
import getWindowSize from './interactions/window-size.js';
|
|
48
48
|
import screenRecording from './interactions/screen-recording.js';
|
|
49
49
|
import app from './app-management/app.js';
|
|
50
|
+
import mobilePermissions from './app-management/permissions.js';
|
|
50
51
|
import context from './context/context.js';
|
|
51
52
|
|
|
52
53
|
type RegisteredTool = Parameters<FastMCP['addTool']>[0];
|
|
@@ -164,6 +165,7 @@ export default function registerTools(server: FastMCP): void {
|
|
|
164
165
|
|
|
165
166
|
// App Management
|
|
166
167
|
app(server);
|
|
168
|
+
mobilePermissions(server);
|
|
167
169
|
|
|
168
170
|
// Context Management
|
|
169
171
|
context(server);
|