@metamask/device-mcp 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.
- package/CHANGELOG.md +34 -0
- package/README.md +266 -0
- package/dist/backends/adb-backend.cjs +442 -0
- package/dist/backends/adb-backend.cjs.map +1 -0
- package/dist/backends/adb-backend.d.cts +35 -0
- package/dist/backends/adb-backend.d.cts.map +1 -0
- package/dist/backends/adb-backend.d.mts +35 -0
- package/dist/backends/adb-backend.d.mts.map +1 -0
- package/dist/backends/adb-backend.mjs +436 -0
- package/dist/backends/adb-backend.mjs.map +1 -0
- package/dist/backends/appium-backend.cjs +518 -0
- package/dist/backends/appium-backend.cjs.map +1 -0
- package/dist/backends/appium-backend.d.cts +36 -0
- package/dist/backends/appium-backend.d.cts.map +1 -0
- package/dist/backends/appium-backend.d.mts +36 -0
- package/dist/backends/appium-backend.d.mts.map +1 -0
- package/dist/backends/appium-backend.mjs +512 -0
- package/dist/backends/appium-backend.mjs.map +1 -0
- package/dist/backends/idb-backend.cjs +442 -0
- package/dist/backends/idb-backend.cjs.map +1 -0
- package/dist/backends/idb-backend.d.cts +35 -0
- package/dist/backends/idb-backend.d.cts.map +1 -0
- package/dist/backends/idb-backend.d.mts +35 -0
- package/dist/backends/idb-backend.d.mts.map +1 -0
- package/dist/backends/idb-backend.mjs +436 -0
- package/dist/backends/idb-backend.mjs.map +1 -0
- package/dist/backends/index.cjs +134 -0
- package/dist/backends/index.cjs.map +1 -0
- package/dist/backends/index.d.cts +16 -0
- package/dist/backends/index.d.cts.map +1 -0
- package/dist/backends/index.d.mts +16 -0
- package/dist/backends/index.d.mts.map +1 -0
- package/dist/backends/index.mjs +126 -0
- package/dist/backends/index.mjs.map +1 -0
- package/dist/backends/session-file.cjs +62 -0
- package/dist/backends/session-file.cjs.map +1 -0
- package/dist/backends/session-file.d.cts +24 -0
- package/dist/backends/session-file.d.cts.map +1 -0
- package/dist/backends/session-file.d.mts +24 -0
- package/dist/backends/session-file.d.mts.map +1 -0
- package/dist/backends/session-file.mjs +59 -0
- package/dist/backends/session-file.mjs.map +1 -0
- package/dist/backends/types.cjs +3 -0
- package/dist/backends/types.cjs.map +1 -0
- package/dist/backends/types.d.cts +93 -0
- package/dist/backends/types.d.cts.map +1 -0
- package/dist/backends/types.d.mts +93 -0
- package/dist/backends/types.d.mts.map +1 -0
- package/dist/backends/types.mjs +2 -0
- package/dist/backends/types.mjs.map +1 -0
- package/dist/backends/webdriver-client.cjs +167 -0
- package/dist/backends/webdriver-client.cjs.map +1 -0
- package/dist/backends/webdriver-client.d.cts +55 -0
- package/dist/backends/webdriver-client.d.cts.map +1 -0
- package/dist/backends/webdriver-client.d.mts +55 -0
- package/dist/backends/webdriver-client.d.mts.map +1 -0
- package/dist/backends/webdriver-client.mjs +162 -0
- package/dist/backends/webdriver-client.mjs.map +1 -0
- package/dist/cli/device-mcp.cjs +20 -0
- package/dist/cli/device-mcp.cjs.map +1 -0
- package/dist/cli/device-mcp.d.cts +3 -0
- package/dist/cli/device-mcp.d.cts.map +1 -0
- package/dist/cli/device-mcp.d.mts +3 -0
- package/dist/cli/device-mcp.d.mts.map +1 -0
- package/dist/cli/device-mcp.mjs +18 -0
- package/dist/cli/device-mcp.mjs.map +1 -0
- package/dist/index.cjs +9 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server.cjs +43 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +4 -0
- package/dist/server.d.cts.map +1 -0
- package/dist/server.d.mts +4 -0
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +40 -0
- package/dist/server.mjs.map +1 -0
- package/dist/tools/alert-text.cjs +25 -0
- package/dist/tools/alert-text.cjs.map +1 -0
- package/dist/tools/alert-text.d.cts +4 -0
- package/dist/tools/alert-text.d.cts.map +1 -0
- package/dist/tools/alert-text.d.mts +4 -0
- package/dist/tools/alert-text.d.mts.map +1 -0
- package/dist/tools/alert-text.mjs +22 -0
- package/dist/tools/alert-text.mjs.map +1 -0
- package/dist/tools/app-state.cjs +40 -0
- package/dist/tools/app-state.cjs.map +1 -0
- package/dist/tools/app-state.d.cts +4 -0
- package/dist/tools/app-state.d.cts.map +1 -0
- package/dist/tools/app-state.d.mts +4 -0
- package/dist/tools/app-state.d.mts.map +1 -0
- package/dist/tools/app-state.mjs +37 -0
- package/dist/tools/app-state.mjs.map +1 -0
- package/dist/tools/clipboard.cjs +42 -0
- package/dist/tools/clipboard.cjs.map +1 -0
- package/dist/tools/clipboard.d.cts +4 -0
- package/dist/tools/clipboard.d.cts.map +1 -0
- package/dist/tools/clipboard.d.mts +4 -0
- package/dist/tools/clipboard.d.mts.map +1 -0
- package/dist/tools/clipboard.mjs +39 -0
- package/dist/tools/clipboard.mjs.map +1 -0
- package/dist/tools/close-app.cjs +25 -0
- package/dist/tools/close-app.cjs.map +1 -0
- package/dist/tools/close-app.d.cts +4 -0
- package/dist/tools/close-app.d.cts.map +1 -0
- package/dist/tools/close-app.d.mts +4 -0
- package/dist/tools/close-app.d.mts.map +1 -0
- package/dist/tools/close-app.mjs +22 -0
- package/dist/tools/close-app.mjs.map +1 -0
- package/dist/tools/context.cjs +52 -0
- package/dist/tools/context.cjs.map +1 -0
- package/dist/tools/context.d.cts +4 -0
- package/dist/tools/context.d.cts.map +1 -0
- package/dist/tools/context.d.mts +4 -0
- package/dist/tools/context.d.mts.map +1 -0
- package/dist/tools/context.mjs +49 -0
- package/dist/tools/context.mjs.map +1 -0
- package/dist/tools/device-info.cjs +34 -0
- package/dist/tools/device-info.cjs.map +1 -0
- package/dist/tools/device-info.d.cts +4 -0
- package/dist/tools/device-info.d.cts.map +1 -0
- package/dist/tools/device-info.d.mts +4 -0
- package/dist/tools/device-info.d.mts.map +1 -0
- package/dist/tools/device-info.mjs +31 -0
- package/dist/tools/device-info.mjs.map +1 -0
- package/dist/tools/dismiss-alert.cjs +34 -0
- package/dist/tools/dismiss-alert.cjs.map +1 -0
- package/dist/tools/dismiss-alert.d.cts +4 -0
- package/dist/tools/dismiss-alert.d.cts.map +1 -0
- package/dist/tools/dismiss-alert.d.mts +4 -0
- package/dist/tools/dismiss-alert.d.mts.map +1 -0
- package/dist/tools/dismiss-alert.mjs +31 -0
- package/dist/tools/dismiss-alert.mjs.map +1 -0
- package/dist/tools/dismiss-keyboard.cjs +23 -0
- package/dist/tools/dismiss-keyboard.cjs.map +1 -0
- package/dist/tools/dismiss-keyboard.d.cts +4 -0
- package/dist/tools/dismiss-keyboard.d.cts.map +1 -0
- package/dist/tools/dismiss-keyboard.d.mts +4 -0
- package/dist/tools/dismiss-keyboard.d.mts.map +1 -0
- package/dist/tools/dismiss-keyboard.mjs +20 -0
- package/dist/tools/dismiss-keyboard.mjs.map +1 -0
- package/dist/tools/generate-locators.cjs +33 -0
- package/dist/tools/generate-locators.cjs.map +1 -0
- package/dist/tools/generate-locators.d.cts +4 -0
- package/dist/tools/generate-locators.d.cts.map +1 -0
- package/dist/tools/generate-locators.d.mts +4 -0
- package/dist/tools/generate-locators.d.mts.map +1 -0
- package/dist/tools/generate-locators.mjs +30 -0
- package/dist/tools/generate-locators.mjs.map +1 -0
- package/dist/tools/index.cjs +50 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +24 -0
- package/dist/tools/index.d.cts.map +1 -0
- package/dist/tools/index.d.mts +24 -0
- package/dist/tools/index.d.mts.map +1 -0
- package/dist/tools/index.mjs +24 -0
- package/dist/tools/index.mjs.map +1 -0
- package/dist/tools/logs.cjs +48 -0
- package/dist/tools/logs.cjs.map +1 -0
- package/dist/tools/logs.d.cts +4 -0
- package/dist/tools/logs.d.cts.map +1 -0
- package/dist/tools/logs.d.mts +4 -0
- package/dist/tools/logs.d.mts.map +1 -0
- package/dist/tools/logs.mjs +45 -0
- package/dist/tools/logs.mjs.map +1 -0
- package/dist/tools/long-press.cjs +38 -0
- package/dist/tools/long-press.cjs.map +1 -0
- package/dist/tools/long-press.d.cts +4 -0
- package/dist/tools/long-press.d.cts.map +1 -0
- package/dist/tools/long-press.d.mts +4 -0
- package/dist/tools/long-press.d.mts.map +1 -0
- package/dist/tools/long-press.mjs +35 -0
- package/dist/tools/long-press.mjs.map +1 -0
- package/dist/tools/open-app.cjs +26 -0
- package/dist/tools/open-app.cjs.map +1 -0
- package/dist/tools/open-app.d.cts +4 -0
- package/dist/tools/open-app.d.cts.map +1 -0
- package/dist/tools/open-app.d.mts +4 -0
- package/dist/tools/open-app.d.mts.map +1 -0
- package/dist/tools/open-app.mjs +23 -0
- package/dist/tools/open-app.mjs.map +1 -0
- package/dist/tools/press-button.cjs +30 -0
- package/dist/tools/press-button.cjs.map +1 -0
- package/dist/tools/press-button.d.cts +4 -0
- package/dist/tools/press-button.d.cts.map +1 -0
- package/dist/tools/press-button.d.mts +4 -0
- package/dist/tools/press-button.d.mts.map +1 -0
- package/dist/tools/press-button.mjs +27 -0
- package/dist/tools/press-button.mjs.map +1 -0
- package/dist/tools/screen-recording.cjs +46 -0
- package/dist/tools/screen-recording.cjs.map +1 -0
- package/dist/tools/screen-recording.d.cts +4 -0
- package/dist/tools/screen-recording.d.cts.map +1 -0
- package/dist/tools/screen-recording.d.mts +4 -0
- package/dist/tools/screen-recording.d.mts.map +1 -0
- package/dist/tools/screen-recording.mjs +43 -0
- package/dist/tools/screen-recording.mjs.map +1 -0
- package/dist/tools/screenshot.cjs +42 -0
- package/dist/tools/screenshot.cjs.map +1 -0
- package/dist/tools/screenshot.d.cts +4 -0
- package/dist/tools/screenshot.d.cts.map +1 -0
- package/dist/tools/screenshot.d.mts +4 -0
- package/dist/tools/screenshot.d.mts.map +1 -0
- package/dist/tools/screenshot.mjs +39 -0
- package/dist/tools/screenshot.mjs.map +1 -0
- package/dist/tools/scroll-to-element.cjs +56 -0
- package/dist/tools/scroll-to-element.cjs.map +1 -0
- package/dist/tools/scroll-to-element.d.cts +4 -0
- package/dist/tools/scroll-to-element.d.cts.map +1 -0
- package/dist/tools/scroll-to-element.d.mts +4 -0
- package/dist/tools/scroll-to-element.d.mts.map +1 -0
- package/dist/tools/scroll-to-element.mjs +53 -0
- package/dist/tools/scroll-to-element.mjs.map +1 -0
- package/dist/tools/shared.cjs +11 -0
- package/dist/tools/shared.cjs.map +1 -0
- package/dist/tools/shared.d.cts +8 -0
- package/dist/tools/shared.d.cts.map +1 -0
- package/dist/tools/shared.d.mts +8 -0
- package/dist/tools/shared.d.mts.map +1 -0
- package/dist/tools/shared.mjs +8 -0
- package/dist/tools/shared.mjs.map +1 -0
- package/dist/tools/snapshot.cjs +37 -0
- package/dist/tools/snapshot.cjs.map +1 -0
- package/dist/tools/snapshot.d.cts +4 -0
- package/dist/tools/snapshot.d.cts.map +1 -0
- package/dist/tools/snapshot.d.mts +4 -0
- package/dist/tools/snapshot.d.mts.map +1 -0
- package/dist/tools/snapshot.mjs +34 -0
- package/dist/tools/snapshot.mjs.map +1 -0
- package/dist/tools/swipe.cjs +39 -0
- package/dist/tools/swipe.cjs.map +1 -0
- package/dist/tools/swipe.d.cts +4 -0
- package/dist/tools/swipe.d.cts.map +1 -0
- package/dist/tools/swipe.d.mts +4 -0
- package/dist/tools/swipe.d.mts.map +1 -0
- package/dist/tools/swipe.mjs +36 -0
- package/dist/tools/swipe.mjs.map +1 -0
- package/dist/tools/tap-coordinates.cjs +27 -0
- package/dist/tools/tap-coordinates.cjs.map +1 -0
- package/dist/tools/tap-coordinates.d.cts +4 -0
- package/dist/tools/tap-coordinates.d.cts.map +1 -0
- package/dist/tools/tap-coordinates.d.mts +4 -0
- package/dist/tools/tap-coordinates.d.mts.map +1 -0
- package/dist/tools/tap-coordinates.mjs +24 -0
- package/dist/tools/tap-coordinates.mjs.map +1 -0
- package/dist/tools/tap-element.cjs +46 -0
- package/dist/tools/tap-element.cjs.map +1 -0
- package/dist/tools/tap-element.d.cts +4 -0
- package/dist/tools/tap-element.d.cts.map +1 -0
- package/dist/tools/tap-element.d.mts +4 -0
- package/dist/tools/tap-element.d.mts.map +1 -0
- package/dist/tools/tap-element.mjs +43 -0
- package/dist/tools/tap-element.mjs.map +1 -0
- package/dist/tools/type-text.cjs +32 -0
- package/dist/tools/type-text.cjs.map +1 -0
- package/dist/tools/type-text.d.cts +4 -0
- package/dist/tools/type-text.d.cts.map +1 -0
- package/dist/tools/type-text.d.mts +4 -0
- package/dist/tools/type-text.d.mts.map +1 -0
- package/dist/tools/type-text.mjs +29 -0
- package/dist/tools/type-text.mjs.map +1 -0
- package/dist/tools/wait-for.cjs +51 -0
- package/dist/tools/wait-for.cjs.map +1 -0
- package/dist/tools/wait-for.d.cts +4 -0
- package/dist/tools/wait-for.d.cts.map +1 -0
- package/dist/tools/wait-for.d.mts +4 -0
- package/dist/tools/wait-for.d.mts.map +1 -0
- package/dist/tools/wait-for.mjs +48 -0
- package/dist/tools/wait-for.mjs.map +1 -0
- package/dist/tools/window-size.cjs +29 -0
- package/dist/tools/window-size.cjs.map +1 -0
- package/dist/tools/window-size.d.cts +4 -0
- package/dist/tools/window-size.d.cts.map +1 -0
- package/dist/tools/window-size.d.mts +4 -0
- package/dist/tools/window-size.d.mts.map +1 -0
- package/dist/tools/window-size.mjs +26 -0
- package/dist/tools/window-size.mjs.map +1 -0
- package/dist/utils/alert-labels.cjs +26 -0
- package/dist/utils/alert-labels.cjs.map +1 -0
- package/dist/utils/alert-labels.d.cts +3 -0
- package/dist/utils/alert-labels.d.cts.map +1 -0
- package/dist/utils/alert-labels.d.mts +3 -0
- package/dist/utils/alert-labels.d.mts.map +1 -0
- package/dist/utils/alert-labels.mjs +23 -0
- package/dist/utils/alert-labels.mjs.map +1 -0
- package/dist/utils/element.cjs +212 -0
- package/dist/utils/element.cjs.map +1 -0
- package/dist/utils/element.d.cts +24 -0
- package/dist/utils/element.d.cts.map +1 -0
- package/dist/utils/element.d.mts +24 -0
- package/dist/utils/element.d.mts.map +1 -0
- package/dist/utils/element.mjs +203 -0
- package/dist/utils/element.mjs.map +1 -0
- package/dist/utils/exec.cjs +57 -0
- package/dist/utils/exec.cjs.map +1 -0
- package/dist/utils/exec.d.cts +23 -0
- package/dist/utils/exec.d.cts.map +1 -0
- package/dist/utils/exec.d.mts +23 -0
- package/dist/utils/exec.d.mts.map +1 -0
- package/dist/utils/exec.mjs +52 -0
- package/dist/utils/exec.mjs.map +1 -0
- package/dist/utils/platform.cjs +93 -0
- package/dist/utils/platform.cjs.map +1 -0
- package/dist/utils/platform.d.cts +8 -0
- package/dist/utils/platform.d.cts.map +1 -0
- package/dist/utils/platform.d.mts +8 -0
- package/dist/utils/platform.d.mts.map +1 -0
- package/dist/utils/platform.mjs +90 -0
- package/dist/utils/platform.mjs.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,6BAA4B;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAoB","sourcesContent":["export { createBackend, createLazyBackend } from './backends/index.js';\nexport { createMcpServer } from './server.js';\n\nexport type {\n DeviceBackend,\n DeviceButton,\n DeviceInfo,\n UIElement,\n ElementQuery,\n SnapshotResult,\n ScreenshotResult,\n LogsResult,\n TapResult,\n AppStateResult,\n Platform,\n WindowSize,\n} from './backends/types.js';\n\nexport type { SessionConfig } from './backends/session-file.js';\n"]}
|
package/dist/server.cjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpServer = createMcpServer;
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const index_js_1 = require("./tools/index.cjs");
|
|
6
|
+
function createMcpServer(backend) {
|
|
7
|
+
const server = new mcp_js_1.McpServer({ name: '@metamask/device-mcp', version: '0.0.0' }, {
|
|
8
|
+
instructions: [
|
|
9
|
+
'Mobile device interaction tools for iOS (IDB) and Android (ADB).',
|
|
10
|
+
'ALWAYS call device_snapshot before device_tap_element to see the current screen.',
|
|
11
|
+
'Never call device_snapshot twice without acting in between.',
|
|
12
|
+
'Elements are identified by accessibility label, resource-id, content-description, or text.',
|
|
13
|
+
'Element matching is fuzzy: partial text and case-insensitive matches work.',
|
|
14
|
+
'After typing, call device_dismiss_keyboard to reveal elements obscured by the keyboard.',
|
|
15
|
+
'Check for system alerts with device_snapshot before interacting with app elements.',
|
|
16
|
+
].join('\n'),
|
|
17
|
+
});
|
|
18
|
+
(0, index_js_1.registerSnapshotTool)(server, backend);
|
|
19
|
+
(0, index_js_1.registerScreenshotTool)(server, backend);
|
|
20
|
+
(0, index_js_1.registerDeviceInfoTool)(server, backend);
|
|
21
|
+
(0, index_js_1.registerTapElementTool)(server, backend);
|
|
22
|
+
(0, index_js_1.registerTapCoordinatesTool)(server, backend);
|
|
23
|
+
(0, index_js_1.registerTypeTool)(server, backend);
|
|
24
|
+
(0, index_js_1.registerSwipeTool)(server, backend);
|
|
25
|
+
(0, index_js_1.registerLongPressTool)(server, backend);
|
|
26
|
+
(0, index_js_1.registerWaitForTool)(server, backend);
|
|
27
|
+
(0, index_js_1.registerAppStateTool)(server, backend);
|
|
28
|
+
(0, index_js_1.registerOpenAppTool)(server, backend);
|
|
29
|
+
(0, index_js_1.registerCloseAppTool)(server, backend);
|
|
30
|
+
(0, index_js_1.registerPressButtonTool)(server, backend);
|
|
31
|
+
(0, index_js_1.registerDismissKeyboardTool)(server, backend);
|
|
32
|
+
(0, index_js_1.registerDismissAlertTool)(server, backend);
|
|
33
|
+
(0, index_js_1.registerLogsTool)(server, backend);
|
|
34
|
+
(0, index_js_1.registerScrollToElementTool)(server, backend);
|
|
35
|
+
(0, index_js_1.registerAlertTextTool)(server, backend);
|
|
36
|
+
(0, index_js_1.registerWindowSizeTool)(server, backend);
|
|
37
|
+
(0, index_js_1.registerContextTool)(server, backend);
|
|
38
|
+
(0, index_js_1.registerClipboardTool)(server, backend);
|
|
39
|
+
(0, index_js_1.registerScreenRecordingTool)(server, backend);
|
|
40
|
+
(0, index_js_1.registerGenerateLocatorsTool)(server, backend);
|
|
41
|
+
return server;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.cjs","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;AA6BA,0CAyCC;AAtED,oEAAoE;AAGpE,gDAwB0B;AAE1B,SAAgB,eAAe,CAAC,OAAsB;IACpD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAC1B,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,EAClD;QACE,YAAY,EAAE;YACZ,kEAAkE;YAClE,kFAAkF;YAClF,6DAA6D;YAC7D,4FAA4F;YAC5F,4EAA4E;YAC5E,yFAAyF;YACzF,oFAAoF;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CACF,CAAC;IAEF,IAAA,+BAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,iCAAsB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,IAAA,iCAAsB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,IAAA,iCAAsB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,IAAA,qCAA0B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAA,2BAAgB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAA,4BAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,IAAA,gCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAA,8BAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAA,+BAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,8BAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAA,+BAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAA,kCAAuB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,IAAA,sCAA2B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAA,mCAAwB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAA,2BAAgB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAA,sCAA2B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAA,gCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAA,iCAAsB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,IAAA,8BAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAA,gCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAA,sCAA2B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAA,uCAA4B,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport type { DeviceBackend } from './backends/types.js';\nimport {\n registerSnapshotTool,\n registerScreenshotTool,\n registerTapElementTool,\n registerTapCoordinatesTool,\n registerTypeTool,\n registerSwipeTool,\n registerLongPressTool,\n registerWaitForTool,\n registerAppStateTool,\n registerDeviceInfoTool,\n registerOpenAppTool,\n registerCloseAppTool,\n registerPressButtonTool,\n registerDismissKeyboardTool,\n registerDismissAlertTool,\n registerLogsTool,\n registerScrollToElementTool,\n registerAlertTextTool,\n registerWindowSizeTool,\n registerContextTool,\n registerClipboardTool,\n registerScreenRecordingTool,\n registerGenerateLocatorsTool,\n} from './tools/index.js';\n\nexport function createMcpServer(backend: DeviceBackend): McpServer {\n const server = new McpServer(\n { name: '@metamask/device-mcp', version: '0.0.0' },\n {\n instructions: [\n 'Mobile device interaction tools for iOS (IDB) and Android (ADB).',\n 'ALWAYS call device_snapshot before device_tap_element to see the current screen.',\n 'Never call device_snapshot twice without acting in between.',\n 'Elements are identified by accessibility label, resource-id, content-description, or text.',\n 'Element matching is fuzzy: partial text and case-insensitive matches work.',\n 'After typing, call device_dismiss_keyboard to reveal elements obscured by the keyboard.',\n 'Check for system alerts with device_snapshot before interacting with app elements.',\n ].join('\\n'),\n },\n );\n\n registerSnapshotTool(server, backend);\n registerScreenshotTool(server, backend);\n registerDeviceInfoTool(server, backend);\n registerTapElementTool(server, backend);\n registerTapCoordinatesTool(server, backend);\n registerTypeTool(server, backend);\n registerSwipeTool(server, backend);\n registerLongPressTool(server, backend);\n registerWaitForTool(server, backend);\n registerAppStateTool(server, backend);\n registerOpenAppTool(server, backend);\n registerCloseAppTool(server, backend);\n registerPressButtonTool(server, backend);\n registerDismissKeyboardTool(server, backend);\n registerDismissAlertTool(server, backend);\n registerLogsTool(server, backend);\n registerScrollToElementTool(server, backend);\n registerAlertTextTool(server, backend);\n registerWindowSizeTool(server, backend);\n registerContextTool(server, backend);\n registerClipboardTool(server, backend);\n registerScreenRecordingTool(server, backend);\n registerGenerateLocatorsTool(server, backend);\n\n return server;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.cts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gDAAgD;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,6BAA4B;AA2BzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAyCjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gDAAgD;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,6BAA4B;AA2BzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAyCjE"}
|
package/dist/server.mjs
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { registerSnapshotTool, registerScreenshotTool, registerTapElementTool, registerTapCoordinatesTool, registerTypeTool, registerSwipeTool, registerLongPressTool, registerWaitForTool, registerAppStateTool, registerDeviceInfoTool, registerOpenAppTool, registerCloseAppTool, registerPressButtonTool, registerDismissKeyboardTool, registerDismissAlertTool, registerLogsTool, registerScrollToElementTool, registerAlertTextTool, registerWindowSizeTool, registerContextTool, registerClipboardTool, registerScreenRecordingTool, registerGenerateLocatorsTool } from "./tools/index.mjs";
|
|
3
|
+
export function createMcpServer(backend) {
|
|
4
|
+
const server = new McpServer({ name: '@metamask/device-mcp', version: '0.0.0' }, {
|
|
5
|
+
instructions: [
|
|
6
|
+
'Mobile device interaction tools for iOS (IDB) and Android (ADB).',
|
|
7
|
+
'ALWAYS call device_snapshot before device_tap_element to see the current screen.',
|
|
8
|
+
'Never call device_snapshot twice without acting in between.',
|
|
9
|
+
'Elements are identified by accessibility label, resource-id, content-description, or text.',
|
|
10
|
+
'Element matching is fuzzy: partial text and case-insensitive matches work.',
|
|
11
|
+
'After typing, call device_dismiss_keyboard to reveal elements obscured by the keyboard.',
|
|
12
|
+
'Check for system alerts with device_snapshot before interacting with app elements.',
|
|
13
|
+
].join('\n'),
|
|
14
|
+
});
|
|
15
|
+
registerSnapshotTool(server, backend);
|
|
16
|
+
registerScreenshotTool(server, backend);
|
|
17
|
+
registerDeviceInfoTool(server, backend);
|
|
18
|
+
registerTapElementTool(server, backend);
|
|
19
|
+
registerTapCoordinatesTool(server, backend);
|
|
20
|
+
registerTypeTool(server, backend);
|
|
21
|
+
registerSwipeTool(server, backend);
|
|
22
|
+
registerLongPressTool(server, backend);
|
|
23
|
+
registerWaitForTool(server, backend);
|
|
24
|
+
registerAppStateTool(server, backend);
|
|
25
|
+
registerOpenAppTool(server, backend);
|
|
26
|
+
registerCloseAppTool(server, backend);
|
|
27
|
+
registerPressButtonTool(server, backend);
|
|
28
|
+
registerDismissKeyboardTool(server, backend);
|
|
29
|
+
registerDismissAlertTool(server, backend);
|
|
30
|
+
registerLogsTool(server, backend);
|
|
31
|
+
registerScrollToElementTool(server, backend);
|
|
32
|
+
registerAlertTextTool(server, backend);
|
|
33
|
+
registerWindowSizeTool(server, backend);
|
|
34
|
+
registerContextTool(server, backend);
|
|
35
|
+
registerClipboardTool(server, backend);
|
|
36
|
+
registerScreenRecordingTool(server, backend);
|
|
37
|
+
registerGenerateLocatorsTool(server, backend);
|
|
38
|
+
return server;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.mjs","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gDAAgD;AAGpE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC7B,0BAAyB;AAE1B,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,EAClD;QACE,YAAY,EAAE;YACZ,kEAAkE;YAClE,kFAAkF;YAClF,6DAA6D;YAC7D,4FAA4F;YAC5F,4EAA4E;YAC5E,yFAAyF;YACzF,oFAAoF;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport type { DeviceBackend } from './backends/types.js';\nimport {\n registerSnapshotTool,\n registerScreenshotTool,\n registerTapElementTool,\n registerTapCoordinatesTool,\n registerTypeTool,\n registerSwipeTool,\n registerLongPressTool,\n registerWaitForTool,\n registerAppStateTool,\n registerDeviceInfoTool,\n registerOpenAppTool,\n registerCloseAppTool,\n registerPressButtonTool,\n registerDismissKeyboardTool,\n registerDismissAlertTool,\n registerLogsTool,\n registerScrollToElementTool,\n registerAlertTextTool,\n registerWindowSizeTool,\n registerContextTool,\n registerClipboardTool,\n registerScreenRecordingTool,\n registerGenerateLocatorsTool,\n} from './tools/index.js';\n\nexport function createMcpServer(backend: DeviceBackend): McpServer {\n const server = new McpServer(\n { name: '@metamask/device-mcp', version: '0.0.0' },\n {\n instructions: [\n 'Mobile device interaction tools for iOS (IDB) and Android (ADB).',\n 'ALWAYS call device_snapshot before device_tap_element to see the current screen.',\n 'Never call device_snapshot twice without acting in between.',\n 'Elements are identified by accessibility label, resource-id, content-description, or text.',\n 'Element matching is fuzzy: partial text and case-insensitive matches work.',\n 'After typing, call device_dismiss_keyboard to reveal elements obscured by the keyboard.',\n 'Check for system alerts with device_snapshot before interacting with app elements.',\n ].join('\\n'),\n },\n );\n\n registerSnapshotTool(server, backend);\n registerScreenshotTool(server, backend);\n registerDeviceInfoTool(server, backend);\n registerTapElementTool(server, backend);\n registerTapCoordinatesTool(server, backend);\n registerTypeTool(server, backend);\n registerSwipeTool(server, backend);\n registerLongPressTool(server, backend);\n registerWaitForTool(server, backend);\n registerAppStateTool(server, backend);\n registerOpenAppTool(server, backend);\n registerCloseAppTool(server, backend);\n registerPressButtonTool(server, backend);\n registerDismissKeyboardTool(server, backend);\n registerDismissAlertTool(server, backend);\n registerLogsTool(server, backend);\n registerScrollToElementTool(server, backend);\n registerAlertTextTool(server, backend);\n registerWindowSizeTool(server, backend);\n registerContextTool(server, backend);\n registerClipboardTool(server, backend);\n registerScreenRecordingTool(server, backend);\n registerGenerateLocatorsTool(server, backend);\n\n return server;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAlertTextTool = registerAlertTextTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerAlertTextTool(server, backend) {
|
|
7
|
+
server.registerTool('device_get_alert_text', {
|
|
8
|
+
title: 'Get Alert Text',
|
|
9
|
+
description: 'Get the text content of the currently displayed system alert or dialog. ' +
|
|
10
|
+
'Call this before device_dismiss_alert to understand what the alert says.',
|
|
11
|
+
inputSchema: zod_1.z.object({}).shape,
|
|
12
|
+
annotations: { readOnlyHint: true },
|
|
13
|
+
}, async () => {
|
|
14
|
+
try {
|
|
15
|
+
const text = await backend.getAlertText();
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
return (0, shared_js_1.errorResult)(error);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=alert-text.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-text.cjs","sourceRoot":"","sources":["../../src/tools/alert-text.ts"],"names":[],"mappings":";;AAMA,sDAyBC;AA9BD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,0EAA0E;YAC1E,0EAA0E;QAC5E,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK;QAC/B,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerAlertTextTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_get_alert_text',\n {\n title: 'Get Alert Text',\n description:\n 'Get the text content of the currently displayed system alert or dialog. ' +\n 'Call this before device_dismiss_alert to understand what the alert says.',\n inputSchema: z.object({}).shape,\n annotations: { readOnlyHint: true },\n },\n async () => {\n try {\n const text = await backend.getAlertText();\n return {\n content: [{ type: 'text' as const, text }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.cjs";
|
|
3
|
+
export declare function registerAlertTextTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=alert-text.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-text.d.cts","sourceRoot":"","sources":["../../src/tools/alert-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.mjs";
|
|
3
|
+
export declare function registerAlertTextTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=alert-text.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-text.d.mts","sourceRoot":"","sources":["../../src/tools/alert-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerAlertTextTool(server, backend) {
|
|
4
|
+
server.registerTool('device_get_alert_text', {
|
|
5
|
+
title: 'Get Alert Text',
|
|
6
|
+
description: 'Get the text content of the currently displayed system alert or dialog. ' +
|
|
7
|
+
'Call this before device_dismiss_alert to understand what the alert says.',
|
|
8
|
+
inputSchema: z.object({}).shape,
|
|
9
|
+
annotations: { readOnlyHint: true },
|
|
10
|
+
}, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const text = await backend.getAlertText();
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: 'text', text }],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return errorResult(error);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=alert-text.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-text.mjs","sourceRoot":"","sources":["../../src/tools/alert-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,0EAA0E;YAC1E,0EAA0E;QAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK;QAC/B,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerAlertTextTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_get_alert_text',\n {\n title: 'Get Alert Text',\n description:\n 'Get the text content of the currently displayed system alert or dialog. ' +\n 'Call this before device_dismiss_alert to understand what the alert says.',\n inputSchema: z.object({}).shape,\n annotations: { readOnlyHint: true },\n },\n async () => {\n try {\n const text = await backend.getAlertText();\n return {\n content: [{ type: 'text' as const, text }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAppStateTool = registerAppStateTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerAppStateTool(server, backend) {
|
|
7
|
+
server.registerTool('device_app_state', {
|
|
8
|
+
title: 'App State',
|
|
9
|
+
description: 'Get the current state of an app by bundle ID. ' +
|
|
10
|
+
'Returns whether the app is running, installed, or not found.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
bundleId: zod_1.z
|
|
13
|
+
.string()
|
|
14
|
+
.describe('App bundle ID (e.g. io.metamask or io.metamask.debug)'),
|
|
15
|
+
},
|
|
16
|
+
annotations: { readOnlyHint: true },
|
|
17
|
+
}, async ({ bundleId }) => {
|
|
18
|
+
try {
|
|
19
|
+
const result = await backend.getAppState(bundleId);
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: 'text',
|
|
24
|
+
text: [
|
|
25
|
+
`Bundle: ${result.bundleId}`,
|
|
26
|
+
`State: ${result.state}`,
|
|
27
|
+
result.pid ? `PID: ${result.pid}` : null,
|
|
28
|
+
]
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.join('\n'),
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return (0, shared_js_1.errorResult)(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=app-state.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-state.cjs","sourceRoot":"","sources":["../../src/tools/app-state.ts"],"names":[],"mappings":";;AAMA,oDAwCC;AA7CD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,oBAAoB,CAClC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,gDAAgD;YAChD,8DAA8D;QAChE,WAAW,EAAE;YACX,QAAQ,EAAE,OAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,WAAW,MAAM,CAAC,QAAQ,EAAE;4BAC5B,UAAU,MAAM,CAAC,KAAK,EAAE;4BACxB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;yBACzC;6BACE,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerAppStateTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_app_state',\n {\n title: 'App State',\n description:\n 'Get the current state of an app by bundle ID. ' +\n 'Returns whether the app is running, installed, or not found.',\n inputSchema: {\n bundleId: z\n .string()\n .describe('App bundle ID (e.g. io.metamask or io.metamask.debug)'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ bundleId }) => {\n try {\n const result = await backend.getAppState(bundleId);\n return {\n content: [\n {\n type: 'text' as const,\n text: [\n `Bundle: ${result.bundleId}`,\n `State: ${result.state}`,\n result.pid ? `PID: ${result.pid}` : null,\n ]\n .filter(Boolean)\n .join('\\n'),\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.cjs";
|
|
3
|
+
export declare function registerAppStateTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=app-state.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-state.d.cts","sourceRoot":"","sources":["../../src/tools/app-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAqCN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.mjs";
|
|
3
|
+
export declare function registerAppStateTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=app-state.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-state.d.mts","sourceRoot":"","sources":["../../src/tools/app-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAqCN"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerAppStateTool(server, backend) {
|
|
4
|
+
server.registerTool('device_app_state', {
|
|
5
|
+
title: 'App State',
|
|
6
|
+
description: 'Get the current state of an app by bundle ID. ' +
|
|
7
|
+
'Returns whether the app is running, installed, or not found.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
bundleId: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe('App bundle ID (e.g. io.metamask or io.metamask.debug)'),
|
|
12
|
+
},
|
|
13
|
+
annotations: { readOnlyHint: true },
|
|
14
|
+
}, async ({ bundleId }) => {
|
|
15
|
+
try {
|
|
16
|
+
const result = await backend.getAppState(bundleId);
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: 'text',
|
|
21
|
+
text: [
|
|
22
|
+
`Bundle: ${result.bundleId}`,
|
|
23
|
+
`State: ${result.state}`,
|
|
24
|
+
result.pid ? `PID: ${result.pid}` : null,
|
|
25
|
+
]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join('\n'),
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return errorResult(error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=app-state.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-state.mjs","sourceRoot":"","sources":["../../src/tools/app-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,gDAAgD;YAChD,8DAA8D;QAChE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,WAAW,MAAM,CAAC,QAAQ,EAAE;4BAC5B,UAAU,MAAM,CAAC,KAAK,EAAE;4BACxB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;yBACzC;6BACE,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerAppStateTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_app_state',\n {\n title: 'App State',\n description:\n 'Get the current state of an app by bundle ID. ' +\n 'Returns whether the app is running, installed, or not found.',\n inputSchema: {\n bundleId: z\n .string()\n .describe('App bundle ID (e.g. io.metamask or io.metamask.debug)'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ bundleId }) => {\n try {\n const result = await backend.getAppState(bundleId);\n return {\n content: [\n {\n type: 'text' as const,\n text: [\n `Bundle: ${result.bundleId}`,\n `State: ${result.state}`,\n result.pid ? `PID: ${result.pid}` : null,\n ]\n .filter(Boolean)\n .join('\\n'),\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerClipboardTool = registerClipboardTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerClipboardTool(server, backend) {
|
|
7
|
+
server.registerTool('device_clipboard', {
|
|
8
|
+
title: 'Clipboard',
|
|
9
|
+
description: 'Read or write the device clipboard. ' +
|
|
10
|
+
'Use action=get to read clipboard text, action=set to write. ' +
|
|
11
|
+
'On Android, clipboard access requires the Appium backend.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
action: zod_1.z
|
|
14
|
+
.enum(['get', 'set'])
|
|
15
|
+
.describe('Action: get clipboard content or set it'),
|
|
16
|
+
text: zod_1.z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Text to set on the clipboard (required for action=set)'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ action, text }) => {
|
|
22
|
+
try {
|
|
23
|
+
if (action === 'get') {
|
|
24
|
+
const content = await backend.getClipboard();
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: 'text', text: content }],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (!text) {
|
|
30
|
+
return (0, shared_js_1.errorResult)(new Error('text is required when action is "set"'));
|
|
31
|
+
}
|
|
32
|
+
await backend.setClipboard(text);
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: 'text', text: 'Clipboard updated' }],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return (0, shared_js_1.errorResult)(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=clipboard.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.cjs","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":";;AAMA,sDA8CC;AAnDD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,sCAAsC;YACtC,8DAA8D;YAC9D,2DAA2D;QAC7D,WAAW,EAAE;YACX,MAAM,EAAE,OAAC;iBACN,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBACpB,QAAQ,CAAC,yCAAyC,CAAC;YACtD,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;SACtE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAA,uBAAW,EAChB,IAAI,KAAK,CAAC,uCAAuC,CAAC,CACnD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;aAChE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerClipboardTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_clipboard',\n {\n title: 'Clipboard',\n description:\n 'Read or write the device clipboard. ' +\n 'Use action=get to read clipboard text, action=set to write. ' +\n 'On Android, clipboard access requires the Appium backend.',\n inputSchema: {\n action: z\n .enum(['get', 'set'])\n .describe('Action: get clipboard content or set it'),\n text: z\n .string()\n .optional()\n .describe('Text to set on the clipboard (required for action=set)'),\n },\n },\n async ({ action, text }) => {\n try {\n if (action === 'get') {\n const content = await backend.getClipboard();\n return {\n content: [{ type: 'text' as const, text: content }],\n };\n }\n\n if (!text) {\n return errorResult(\n new Error('text is required when action is \"set\"'),\n );\n }\n\n await backend.setClipboard(text);\n return {\n content: [{ type: 'text' as const, text: 'Clipboard updated' }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.cjs";
|
|
3
|
+
export declare function registerClipboardTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=clipboard.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.cts","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA2CN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.mjs";
|
|
3
|
+
export declare function registerClipboardTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=clipboard.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.mts","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA2CN"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerClipboardTool(server, backend) {
|
|
4
|
+
server.registerTool('device_clipboard', {
|
|
5
|
+
title: 'Clipboard',
|
|
6
|
+
description: 'Read or write the device clipboard. ' +
|
|
7
|
+
'Use action=get to read clipboard text, action=set to write. ' +
|
|
8
|
+
'On Android, clipboard access requires the Appium backend.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
action: z
|
|
11
|
+
.enum(['get', 'set'])
|
|
12
|
+
.describe('Action: get clipboard content or set it'),
|
|
13
|
+
text: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Text to set on the clipboard (required for action=set)'),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ action, text }) => {
|
|
19
|
+
try {
|
|
20
|
+
if (action === 'get') {
|
|
21
|
+
const content = await backend.getClipboard();
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: 'text', text: content }],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (!text) {
|
|
27
|
+
return errorResult(new Error('text is required when action is "set"'));
|
|
28
|
+
}
|
|
29
|
+
await backend.setClipboard(text);
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: 'text', text: 'Clipboard updated' }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return errorResult(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=clipboard.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.mjs","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,sCAAsC;YACtC,8DAA8D;YAC9D,2DAA2D;QAC7D,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBACpB,QAAQ,CAAC,yCAAyC,CAAC;YACtD,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;SACtE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,WAAW,CAChB,IAAI,KAAK,CAAC,uCAAuC,CAAC,CACnD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;aAChE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerClipboardTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_clipboard',\n {\n title: 'Clipboard',\n description:\n 'Read or write the device clipboard. ' +\n 'Use action=get to read clipboard text, action=set to write. ' +\n 'On Android, clipboard access requires the Appium backend.',\n inputSchema: {\n action: z\n .enum(['get', 'set'])\n .describe('Action: get clipboard content or set it'),\n text: z\n .string()\n .optional()\n .describe('Text to set on the clipboard (required for action=set)'),\n },\n },\n async ({ action, text }) => {\n try {\n if (action === 'get') {\n const content = await backend.getClipboard();\n return {\n content: [{ type: 'text' as const, text: content }],\n };\n }\n\n if (!text) {\n return errorResult(\n new Error('text is required when action is \"set\"'),\n );\n }\n\n await backend.setClipboard(text);\n return {\n content: [{ type: 'text' as const, text: 'Clipboard updated' }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCloseAppTool = registerCloseAppTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerCloseAppTool(server, backend) {
|
|
7
|
+
server.registerTool('device_close_app', {
|
|
8
|
+
title: 'Close App',
|
|
9
|
+
description: 'Force-stop an app by bundle ID. The app process is terminated.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
bundleId: zod_1.z.string().describe('App bundle ID or package name'),
|
|
12
|
+
},
|
|
13
|
+
}, async ({ bundleId }) => {
|
|
14
|
+
try {
|
|
15
|
+
await backend.closeApp(bundleId);
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: `Closed app: ${bundleId}` }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
return (0, shared_js_1.errorResult)(error);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=close-app.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-app.cjs","sourceRoot":"","sources":["../../src/tools/close-app.ts"],"names":[],"mappings":";;AAMA,oDAyBC;AA9BD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,oBAAoB,CAClC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,gEAAgE;QAClE,WAAW,EAAE;YACX,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC/D;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,QAAQ,EAAE,EAAE,CAAC;aACtE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerCloseAppTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_close_app',\n {\n title: 'Close App',\n description:\n 'Force-stop an app by bundle ID. The app process is terminated.',\n inputSchema: {\n bundleId: z.string().describe('App bundle ID or package name'),\n },\n },\n async ({ bundleId }) => {\n try {\n await backend.closeApp(bundleId);\n return {\n content: [{ type: 'text' as const, text: `Closed app: ${bundleId}` }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.cjs";
|
|
3
|
+
export declare function registerCloseAppTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=close-app.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-app.d.cts","sourceRoot":"","sources":["../../src/tools/close-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DeviceBackend } from "../backends/types.mjs";
|
|
3
|
+
export declare function registerCloseAppTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=close-app.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-app.d.mts","sourceRoot":"","sources":["../../src/tools/close-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerCloseAppTool(server, backend) {
|
|
4
|
+
server.registerTool('device_close_app', {
|
|
5
|
+
title: 'Close App',
|
|
6
|
+
description: 'Force-stop an app by bundle ID. The app process is terminated.',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
bundleId: z.string().describe('App bundle ID or package name'),
|
|
9
|
+
},
|
|
10
|
+
}, async ({ bundleId }) => {
|
|
11
|
+
try {
|
|
12
|
+
await backend.closeApp(bundleId);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: 'text', text: `Closed app: ${bundleId}` }],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return errorResult(error);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=close-app.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-app.mjs","sourceRoot":"","sources":["../../src/tools/close-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,gEAAgE;QAClE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC/D;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,QAAQ,EAAE,EAAE,CAAC;aACtE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerCloseAppTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_close_app',\n {\n title: 'Close App',\n description:\n 'Force-stop an app by bundle ID. The app process is terminated.',\n inputSchema: {\n bundleId: z.string().describe('App bundle ID or package name'),\n },\n },\n async ({ bundleId }) => {\n try {\n await backend.closeApp(bundleId);\n return {\n content: [{ type: 'text' as const, text: `Closed app: ${bundleId}` }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerContextTool = registerContextTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerContextTool(server, backend) {
|
|
7
|
+
server.registerTool('device_context', {
|
|
8
|
+
title: 'Context',
|
|
9
|
+
description: 'List or switch between app contexts (NATIVE_APP, WEBVIEW_*, etc.). ' +
|
|
10
|
+
'Use action=list to see available contexts, action=switch to change. ' +
|
|
11
|
+
'WebView context switching requires the Appium backend.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
action: zod_1.z
|
|
14
|
+
.enum(['list', 'switch'])
|
|
15
|
+
.describe('Action: list available contexts or switch to one'),
|
|
16
|
+
context: zod_1.z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Context name to switch to (required for action=switch)'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ action, context }) => {
|
|
22
|
+
try {
|
|
23
|
+
if (action === 'list') {
|
|
24
|
+
const contexts = await backend.getContexts();
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: 'text',
|
|
29
|
+
text: `Available contexts:\n${contexts.map((c) => ` - ${c}`).join('\n')}`,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!context) {
|
|
35
|
+
return (0, shared_js_1.errorResult)(new Error('context is required when action is "switch"'));
|
|
36
|
+
}
|
|
37
|
+
await backend.setContext(context);
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `Switched to context: ${context}`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return (0, shared_js_1.errorResult)(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=context.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.cjs","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":";;AAMA,kDAwDC;AA7DD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,mBAAmB,CACjC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,qEAAqE;YACrE,sEAAsE;YACtE,wDAAwD;QAC1D,WAAW,EAAE;YACX,MAAM,EAAE,OAAC;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;iBACxB,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,OAAO,EAAE,OAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;SACtE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;yBAC3E;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAA,uBAAW,EAChB,IAAI,KAAK,CAAC,6CAA6C,CAAC,CACzD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,wBAAwB,OAAO,EAAE;qBACxC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nimport { errorResult } from './shared.js';\nimport type { DeviceBackend } from '../backends/types.js';\n\nexport function registerContextTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_context',\n {\n title: 'Context',\n description:\n 'List or switch between app contexts (NATIVE_APP, WEBVIEW_*, etc.). ' +\n 'Use action=list to see available contexts, action=switch to change. ' +\n 'WebView context switching requires the Appium backend.',\n inputSchema: {\n action: z\n .enum(['list', 'switch'])\n .describe('Action: list available contexts or switch to one'),\n context: z\n .string()\n .optional()\n .describe('Context name to switch to (required for action=switch)'),\n },\n },\n async ({ action, context }) => {\n try {\n if (action === 'list') {\n const contexts = await backend.getContexts();\n return {\n content: [\n {\n type: 'text' as const,\n text: `Available contexts:\\n${contexts.map((c) => ` - ${c}`).join('\\n')}`,\n },\n ],\n };\n }\n\n if (!context) {\n return errorResult(\n new Error('context is required when action is \"switch\"'),\n );\n }\n\n await backend.setContext(context);\n return {\n content: [\n {\n type: 'text' as const,\n text: `Switched to context: ${context}`,\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.cts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAqDN"}
|