mobridge-mcp 0.0.9 → 0.1.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.
@@ -1,95 +1,240 @@
1
1
  {
2
2
  "$comment": "Operation-level platform capability manifest. SINGLE SOURCE OF TRUTH for iOS tool registration, per-call operation validation, the device.connect envelope (supportedTools/unsupportedCapabilities), docs and tests. Android is intentionally NOT enumerated: on Android the platform filter is a no-op and the existing profile system is authoritative, so nothing here can make the Android surface drift. A tool with no iOS entry (in `common` or the active mode) is level NONE => NOT registered on iOS. Entries are version-qualified (minIosVersion/minXcodeVersion) because support varies by toolchain; connect resolves the effective set against the detected environment.",
3
- "version": 1,
4
- "platforms": ["ANDROID", "IOS"],
5
- "iosModes": ["physical", "simulator"],
6
-
3
+ "version": 2,
4
+ "platforms": [
5
+ "ANDROID",
6
+ "IOS"
7
+ ],
8
+ "iosModes": [
9
+ "physical",
10
+ "simulator"
11
+ ],
7
12
  "unsupportedCapabilities": {
8
- "physical": ["APP_CLEAR_DATA", "APP_PERMISSION_GRANT", "BATTERYSTATS"],
9
- "simulator": ["BATTERYSTATS"]
13
+ "physical": [
14
+ "APP_CLEAR_DATA",
15
+ "APP_PERMISSION_GRANT",
16
+ "BATTERYSTATS"
17
+ ],
18
+ "simulator": [
19
+ "BATTERYSTATS"
20
+ ]
10
21
  },
11
-
12
22
  "ios": {
13
23
  "common": {
14
- "mobile.device.connect": { "level": "FULL" },
15
- "mobile.app.open": { "level": "FULL", "allowedOperations": ["APP_OPEN", "APP_DEEP_LINK", "APP_BRING_TO_FRONT", "APP_CLOSE_UI"] },
16
- "mobile.screen.get": { "level": "FULL" },
17
- "mobile.screen.find": { "level": "FULL" },
18
- "mobile.screen.act": { "level": "FULL" },
19
- "mobile.screen.wait": { "level": "FULL" },
20
- "mobile.screen.diff": { "level": "FULL" },
21
- "mobile.system.action": { "level": "PARTIAL", "allowedOperations": ["HOME"], "reasonCode": "NO_GLOBAL_BACK_OR_RECENTS", "note": "iOS has no global BACK/RECENTS/NOTIFICATION_SHADE; BACK is a semantic UI action (find nav button + act)." },
22
- "mobile.capability.invoke": { "level": "PARTIAL", "allowedOperations": ["APP", "CLIPBOARD"], "reasonCode": "NO_NOTIFICATION_LISTENER", "note": "APP ok; CLIPBOARD limited; no general notification listener." },
23
-
24
- "mobile.screen.delta": { "level": "FULL" },
25
- "mobile.batch": { "level": "FULL" },
26
- "mobile.gesture.perform": { "level": "FULL" },
27
- "mobile.screen.scrollTo": { "level": "FULL" },
28
- "mobile.screen.capture": { "level": "FULL" },
29
- "mobile.input.text": { "level": "FULL" },
30
- "mobile.notification.act": { "level": "PARTIAL", "reasonCode": "NO_STABLE_LISTENER", "note": "UI automation of the notification surface only, not a stable capability." },
31
-
32
- "mobile.perf.sample": { "level": "FULL" },
33
- "mobile.diag.crash": { "level": "PARTIAL", "reasonCode": "PROCESS_SCOPED" },
34
- "mobile.diag.startup": { "level": "FULL" },
35
-
36
- "runtime.setup.status": { "level": "FULL" },
37
- "runtime.setup.open": { "level": "PARTIAL", "reasonCode": "NO_DEEP_LINK_FOR_EVERY_PAGE" },
38
- "runtime.setup.verify": { "level": "PARTIAL", "reasonCode": "PHYSICAL_PERMISSION_PROBE_LIMITED" },
39
-
40
- "mobile.app.control.authorize": { "level": "FULL" },
41
- "mobile.app.control.deauthorize": { "level": "FULL" },
42
- "mobile.app.control.status": { "level": "FULL" },
43
-
44
- "mobile.workflow.run": { "level": "FULL" },
45
-
46
- "ios.app.terminate": { "level": "FULL", "note": "Terminate the test-session app only; NOT an OS force-stop." },
47
- "ios.diag.logs": { "level": "PARTIAL", "reasonCode": "PROCESS_SCOPED", "replacesAndroidTool": "mobile.diag.logcat" },
48
- "ios.diag.energyProfile": { "level": "PARTIAL", "reasonCode": "OWN_CONTRACT", "replacesAndroidTool": "mobile.diag.batterystats" }
24
+ "mobile.device.connect": {
25
+ "level": "FULL"
26
+ },
27
+ "mobile.app.open": {
28
+ "level": "FULL",
29
+ "allowedOperations": [
30
+ "APP_OPEN",
31
+ "APP_DEEP_LINK",
32
+ "APP_BRING_TO_FRONT",
33
+ "APP_CLOSE_UI"
34
+ ]
35
+ },
36
+ "mobile.screen.get": {
37
+ "level": "FULL"
38
+ },
39
+ "mobile.screen.find": {
40
+ "level": "FULL"
41
+ },
42
+ "mobile.screen.act": {
43
+ "level": "FULL"
44
+ },
45
+ "mobile.screen.wait": {
46
+ "level": "FULL"
47
+ },
48
+ "mobile.screen.diff": {
49
+ "level": "FULL"
50
+ },
51
+ "mobile.system.action": {
52
+ "level": "PARTIAL",
53
+ "allowedOperations": [
54
+ "HOME"
55
+ ],
56
+ "reasonCode": "NO_GLOBAL_BACK_OR_RECENTS",
57
+ "note": "iOS has no global BACK/RECENTS/NOTIFICATION_SHADE; BACK is a semantic UI action (find nav button + act)."
58
+ },
59
+ "mobile.capability.invoke": {
60
+ "level": "PARTIAL",
61
+ "allowedOperations": [
62
+ "APP",
63
+ "CLIPBOARD"
64
+ ],
65
+ "reasonCode": "NO_NOTIFICATION_LISTENER",
66
+ "note": "APP ok; CLIPBOARD limited; no general notification listener."
67
+ },
68
+ "mobile.batch": {
69
+ "level": "FULL"
70
+ },
71
+ "mobile.gesture.perform": {
72
+ "level": "FULL"
73
+ },
74
+ "mobile.screen.scrollTo": {
75
+ "level": "FULL"
76
+ },
77
+ "mobile.screen.capture": {
78
+ "level": "FULL"
79
+ },
80
+ "mobile.input.text": {
81
+ "level": "FULL"
82
+ },
83
+ "mobile.workflow.run": {
84
+ "level": "FULL"
85
+ },
86
+ "ios.app.terminate": {
87
+ "level": "FULL",
88
+ "note": "Terminate the test-session app only; NOT an OS force-stop."
89
+ },
90
+ "ios.diag.logs": {
91
+ "level": "PARTIAL",
92
+ "reasonCode": "PROCESS_SCOPED",
93
+ "replacesAndroidTool": "mobile.diag.logcat"
94
+ },
95
+ "ios.diag.energyProfile": {
96
+ "level": "PARTIAL",
97
+ "reasonCode": "OWN_CONTRACT",
98
+ "replacesAndroidTool": "mobile.diag.batterystats"
99
+ },
100
+ "runtime.setup": {
101
+ "level": "PARTIAL",
102
+ "reasonCode": "OPEN_AND_VERIFY_ARE_ADVISORY_ON_IOS",
103
+ "allowedOperations": [
104
+ "STATUS",
105
+ "OPEN",
106
+ "VERIFY"
107
+ ]
108
+ },
109
+ "mobile.app.control": {
110
+ "level": "FULL"
111
+ }
49
112
  },
50
-
51
113
  "physical": {
52
- "mobile.device.state": { "level": "PARTIAL", "reasonCode": "ORIENTATION_AND_APPSTATE_ONLY" },
53
- "mobile.app.list": { "level": "PARTIAL", "reasonCode": "DEVICECTL_OR_MDM" },
54
- "mobile.app.info": { "level": "PARTIAL", "reasonCode": "OWN_APP_OR_BUNDLE_METADATA" },
55
- "mobile.diag.battery": { "level": "PARTIAL", "reasonCode": "ENERGY_NOT_BATTERYSTATS" },
56
- "mobile.diag.netstats": { "level": "PARTIAL", "reasonCode": "INSTRUMENTS_PER_APP" },
57
- "mobile.diag.storage": { "level": "PARTIAL", "reasonCode": "OWN_APP_SANDBOX_ONLY" },
58
-
59
- "mobile.diag.logcat": { "level": "NONE", "replacementTool": "ios.diag.logs", "reasonCode": "PROCESS_SCOPED_ONLY" },
60
- "mobile.diag.batterystats": { "level": "NONE", "replacementTool": "ios.diag.energyProfile", "reasonCode": "NO_PUBLIC_API" },
61
-
62
- "mobile.app.forceStop": { "level": "NONE", "replacementTool": "ios.app.terminate", "reasonCode": "NO_OS_FORCE_STOP" },
63
- "mobile.app.clearData": { "level": "NONE", "reasonCode": "NO_PUBLIC_API" },
64
- "mobile.app.uninstall": { "level": "PARTIAL", "reasonCode": "SIGNED_DEVICECTL_OR_MDM" },
65
- "mobile.app.install": { "level": "PARTIAL", "reasonCode": "SIGNED_IPA_OR_MDM" },
66
- "mobile.app.permission.grant": { "level": "NONE", "reasonCode": "NO_PUBLIC_API" },
67
- "mobile.app.permission.revoke": { "level": "PARTIAL", "replacementTool": "ios.permission.reset", "reasonCode": "XCUI_RESET_ONLY" },
68
-
69
- "ios.permission.reset": { "level": "PARTIAL", "reasonCode": "XCUI_RESET_AUTHORIZATION" }
114
+ "mobile.device.state": {
115
+ "level": "PARTIAL",
116
+ "reasonCode": "ORIENTATION_AND_APPSTATE_ONLY"
117
+ },
118
+ "mobile.app.list": {
119
+ "level": "PARTIAL",
120
+ "reasonCode": "DEVICECTL_OR_MDM"
121
+ },
122
+ "mobile.app.forceStop": {
123
+ "level": "NONE",
124
+ "replacementTool": "ios.app.terminate",
125
+ "reasonCode": "NO_OS_FORCE_STOP"
126
+ },
127
+ "mobile.app.clearData": {
128
+ "level": "NONE",
129
+ "reasonCode": "NO_PUBLIC_API"
130
+ },
131
+ "mobile.app.uninstall": {
132
+ "level": "PARTIAL",
133
+ "reasonCode": "SIGNED_DEVICECTL_OR_MDM"
134
+ },
135
+ "mobile.app.install": {
136
+ "level": "PARTIAL",
137
+ "reasonCode": "SIGNED_IPA_OR_MDM"
138
+ },
139
+ "mobile.app.permission.grant": {
140
+ "level": "NONE",
141
+ "reasonCode": "NO_PUBLIC_API"
142
+ },
143
+ "mobile.app.permission.revoke": {
144
+ "level": "PARTIAL",
145
+ "replacementTool": "ios.permission.reset",
146
+ "reasonCode": "XCUI_RESET_ONLY"
147
+ },
148
+ "ios.permission.reset": {
149
+ "level": "PARTIAL",
150
+ "reasonCode": "XCUI_RESET_AUTHORIZATION"
151
+ },
152
+ "mobile.diag": {
153
+ "level": "PARTIAL",
154
+ "reasonCode": "SUBSET_OF_KINDS_ON_IOS",
155
+ "allowedOperations": [
156
+ "CRASH",
157
+ "PERF",
158
+ "APP_INFO",
159
+ "STARTUP",
160
+ "BATTERY",
161
+ "NETSTATS",
162
+ "STORAGE"
163
+ ]
164
+ },
165
+ "mobile.screen.inspect": {
166
+ "level": "PARTIAL",
167
+ "reasonCode": "DELTA_ONLY_ON_IOS",
168
+ "allowedOperations": [
169
+ "DELTA"
170
+ ]
171
+ }
70
172
  },
71
-
72
173
  "simulator": {
73
- "mobile.device.state": { "level": "FULL" },
74
- "mobile.app.list": { "level": "FULL" },
75
- "mobile.app.info": { "level": "FULL" },
76
- "mobile.diag.battery": { "level": "PARTIAL", "reasonCode": "ENERGY_NOT_BATTERYSTATS" },
77
- "mobile.diag.netstats": { "level": "PARTIAL", "reasonCode": "INSTRUMENTS_PER_APP" },
78
- "mobile.diag.storage": { "level": "FULL" },
79
-
80
- "mobile.diag.logcat": { "level": "NONE", "replacementTool": "ios.diag.logs", "reasonCode": "PROCESS_SCOPED_ONLY" },
81
- "mobile.diag.batterystats": { "level": "NONE", "replacementTool": "ios.diag.energyProfile", "reasonCode": "NO_PUBLIC_API" },
82
-
83
- "mobile.app.forceStop": { "level": "NONE", "replacementTool": "ios.app.terminate", "reasonCode": "NO_OS_FORCE_STOP" },
84
- "mobile.app.clearData": { "level": "NONE", "replacementTool": "ios.simulator.resetAppData", "reasonCode": "USE_REINSTALL_NOT_ERASE" },
85
- "mobile.app.uninstall": { "level": "FULL" },
86
- "mobile.app.install": { "level": "FULL" },
87
- "mobile.app.permission.grant": { "level": "PARTIAL", "reasonCode": "SIMCTL_PRIVACY" },
88
- "mobile.app.permission.revoke": { "level": "PARTIAL", "reasonCode": "SIMCTL_PRIVACY" },
89
-
90
- "ios.permission.reset": { "level": "FULL", "reasonCode": "SIMCTL_PRIVACY" },
91
- "ios.simulator.resetAppData": { "level": "FULL", "note": "uninstall + reinstall the pinned artifact; NOT a device erase." },
92
- "ios.simulator.eraseDevice": { "level": "FULL", "destructive": true, "defaultOff": true, "reasonCode": "FULL_SIMULATOR_WIPE" }
174
+ "mobile.device.state": {
175
+ "level": "FULL"
176
+ },
177
+ "mobile.app.list": {
178
+ "level": "FULL"
179
+ },
180
+ "mobile.app.forceStop": {
181
+ "level": "NONE",
182
+ "replacementTool": "ios.app.terminate",
183
+ "reasonCode": "NO_OS_FORCE_STOP"
184
+ },
185
+ "mobile.app.clearData": {
186
+ "level": "NONE",
187
+ "replacementTool": "ios.simulator.resetAppData",
188
+ "reasonCode": "USE_REINSTALL_NOT_ERASE"
189
+ },
190
+ "mobile.app.uninstall": {
191
+ "level": "FULL"
192
+ },
193
+ "mobile.app.install": {
194
+ "level": "FULL"
195
+ },
196
+ "mobile.app.permission.grant": {
197
+ "level": "PARTIAL",
198
+ "reasonCode": "SIMCTL_PRIVACY"
199
+ },
200
+ "mobile.app.permission.revoke": {
201
+ "level": "PARTIAL",
202
+ "reasonCode": "SIMCTL_PRIVACY"
203
+ },
204
+ "ios.permission.reset": {
205
+ "level": "FULL",
206
+ "reasonCode": "SIMCTL_PRIVACY"
207
+ },
208
+ "ios.simulator.resetAppData": {
209
+ "level": "FULL",
210
+ "note": "uninstall + reinstall the pinned artifact; NOT a device erase."
211
+ },
212
+ "ios.simulator.eraseDevice": {
213
+ "level": "FULL",
214
+ "destructive": true,
215
+ "defaultOff": true,
216
+ "reasonCode": "FULL_SIMULATOR_WIPE"
217
+ },
218
+ "mobile.diag": {
219
+ "level": "PARTIAL",
220
+ "reasonCode": "SUBSET_OF_KINDS_ON_IOS",
221
+ "allowedOperations": [
222
+ "CRASH",
223
+ "PERF",
224
+ "APP_INFO",
225
+ "STARTUP",
226
+ "BATTERY",
227
+ "NETSTATS",
228
+ "STORAGE"
229
+ ]
230
+ },
231
+ "mobile.screen.inspect": {
232
+ "level": "PARTIAL",
233
+ "reasonCode": "DELTA_ONLY_ON_IOS",
234
+ "allowedOperations": [
235
+ "DELTA"
236
+ ]
237
+ }
93
238
  }
94
239
  }
95
240
  }
package/integrity.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "buildId": "6932e2c-20260803173948",
3
- "bundleSha256": "0909cb530958e241be7c6f03b19bc3dd335ea60fa58b6dbb88d419c3d5bf2e14"
2
+ "buildId": "38d941d-20260804170901",
3
+ "bundleSha256": "0bbc92d88bbe706644d0099c0cdc46bc2b1934674826e07a865f85c3332a8baa"
4
4
  }
package/loader.cjs CHANGED
@@ -14,7 +14,7 @@ const os = require("node:os");
14
14
  const path = require("node:path");
15
15
  const crypto = require("node:crypto");
16
16
 
17
- const BUILD_ID = "6932e2c-20260803173948"; // pack-npx stamps the real build id
17
+ const BUILD_ID = "38d941d-20260804170901"; // pack-npx stamps the real build id
18
18
  const ROOT = __dirname; // package root (loader.cjs sits here)
19
19
  const DIST = path.join(ROOT, "dist");
20
20
  const BUNDLE = path.join(DIST, "main.obf.cjs");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobridge-mcp",
3
- "version": "0.0.9",
3
+ "version": "0.1.0",
4
4
  "description": "MoBridge MCP — a stdio MCP server exposing on-device Android/iOS UIs as fast semantic read / observe / find / act / verify tools plus screenshots. Ships an installer that wires it into Claude Code, Claude Desktop, Cursor and Codex.",
5
5
  "keywords": [
6
6
  "mcp",