@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,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerLogsTool = registerLogsTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerLogsTool(server, backend) {
|
|
7
|
+
server.registerTool('device_logs', {
|
|
8
|
+
title: 'Device Logs',
|
|
9
|
+
description: 'Capture recent device logs. iOS: system log via IDB. ' +
|
|
10
|
+
'Android: logcat. Optionally filter by text pattern.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
durationSeconds: zod_1.z
|
|
13
|
+
.number()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('How many seconds of logs to retrieve (default: 30)'),
|
|
16
|
+
filter: zod_1.z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Text pattern to filter log entries'),
|
|
20
|
+
},
|
|
21
|
+
annotations: { readOnlyHint: true },
|
|
22
|
+
}, async ({ durationSeconds, filter }) => {
|
|
23
|
+
try {
|
|
24
|
+
const result = await backend.getLogs(durationSeconds, filter);
|
|
25
|
+
const formatted = result.entries
|
|
26
|
+
.slice(-100)
|
|
27
|
+
.map((entry) => `[${entry.timestamp}] ${entry.level}: ${entry.message}`)
|
|
28
|
+
.join('\n');
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: [
|
|
34
|
+
`Source: ${result.source}`,
|
|
35
|
+
`Entries: ${result.entries.length}${result.entries.length > 100 ? ' (showing last 100)' : ''}`,
|
|
36
|
+
'',
|
|
37
|
+
formatted,
|
|
38
|
+
].join('\n'),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return (0, shared_js_1.errorResult)(error);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=logs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.cjs","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":";;AAMA,4CAkDC;AAvDD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,gBAAgB,CAC9B,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,uDAAuD;YACvD,qDAAqD;QACvD,WAAW,EAAE;YACX,eAAe,EAAE,OAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oDAAoD,CAAC;YACjE,MAAM,EAAE,OAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oCAAoC,CAAC;SAClD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO;iBAC7B,KAAK,CAAC,CAAC,GAAG,CAAC;iBACX,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CACnE;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,WAAW,MAAM,CAAC,MAAM,EAAE;4BAC1B,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC9F,EAAE;4BACF,SAAS;yBACV,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;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 registerLogsTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_logs',\n {\n title: 'Device Logs',\n description:\n 'Capture recent device logs. iOS: system log via IDB. ' +\n 'Android: logcat. Optionally filter by text pattern.',\n inputSchema: {\n durationSeconds: z\n .number()\n .optional()\n .describe('How many seconds of logs to retrieve (default: 30)'),\n filter: z\n .string()\n .optional()\n .describe('Text pattern to filter log entries'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ durationSeconds, filter }) => {\n try {\n const result = await backend.getLogs(durationSeconds, filter);\n const formatted = result.entries\n .slice(-100)\n .map(\n (entry) => `[${entry.timestamp}] ${entry.level}: ${entry.message}`,\n )\n .join('\\n');\n return {\n content: [\n {\n type: 'text' as const,\n text: [\n `Source: ${result.source}`,\n `Entries: ${result.entries.length}${result.entries.length > 100 ? ' (showing last 100)' : ''}`,\n '',\n formatted,\n ].join('\\n'),\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.cts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA+CN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.mts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA+CN"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerLogsTool(server, backend) {
|
|
4
|
+
server.registerTool('device_logs', {
|
|
5
|
+
title: 'Device Logs',
|
|
6
|
+
description: 'Capture recent device logs. iOS: system log via IDB. ' +
|
|
7
|
+
'Android: logcat. Optionally filter by text pattern.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
durationSeconds: z
|
|
10
|
+
.number()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('How many seconds of logs to retrieve (default: 30)'),
|
|
13
|
+
filter: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Text pattern to filter log entries'),
|
|
17
|
+
},
|
|
18
|
+
annotations: { readOnlyHint: true },
|
|
19
|
+
}, async ({ durationSeconds, filter }) => {
|
|
20
|
+
try {
|
|
21
|
+
const result = await backend.getLogs(durationSeconds, filter);
|
|
22
|
+
const formatted = result.entries
|
|
23
|
+
.slice(-100)
|
|
24
|
+
.map((entry) => `[${entry.timestamp}] ${entry.level}: ${entry.message}`)
|
|
25
|
+
.join('\n');
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: [
|
|
31
|
+
`Source: ${result.source}`,
|
|
32
|
+
`Entries: ${result.entries.length}${result.entries.length > 100 ? ' (showing last 100)' : ''}`,
|
|
33
|
+
'',
|
|
34
|
+
formatted,
|
|
35
|
+
].join('\n'),
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return errorResult(error);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.mjs","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,uDAAuD;YACvD,qDAAqD;QACvD,WAAW,EAAE;YACX,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oDAAoD,CAAC;YACjE,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oCAAoC,CAAC;SAClD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO;iBAC7B,KAAK,CAAC,CAAC,GAAG,CAAC;iBACX,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CACnE;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,WAAW,MAAM,CAAC,MAAM,EAAE;4BAC1B,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC9F,EAAE;4BACF,SAAS;yBACV,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;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 registerLogsTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_logs',\n {\n title: 'Device Logs',\n description:\n 'Capture recent device logs. iOS: system log via IDB. ' +\n 'Android: logcat. Optionally filter by text pattern.',\n inputSchema: {\n durationSeconds: z\n .number()\n .optional()\n .describe('How many seconds of logs to retrieve (default: 30)'),\n filter: z\n .string()\n .optional()\n .describe('Text pattern to filter log entries'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ durationSeconds, filter }) => {\n try {\n const result = await backend.getLogs(durationSeconds, filter);\n const formatted = result.entries\n .slice(-100)\n .map(\n (entry) => `[${entry.timestamp}] ${entry.level}: ${entry.message}`,\n )\n .join('\\n');\n return {\n content: [\n {\n type: 'text' as const,\n text: [\n `Source: ${result.source}`,\n `Entries: ${result.entries.length}${result.entries.length > 100 ? ' (showing last 100)' : ''}`,\n '',\n formatted,\n ].join('\\n'),\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerLongPressTool = registerLongPressTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerLongPressTool(server, backend) {
|
|
7
|
+
server.registerTool('device_long_press', {
|
|
8
|
+
title: 'Long Press',
|
|
9
|
+
description: 'Long press an element. Used for context menus, drag initiation, ' +
|
|
10
|
+
'and other long-press interactions. Default duration is 1000ms.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
label: zod_1.z.string().optional().describe('Accessibility label'),
|
|
13
|
+
identifier: zod_1.z.string().optional().describe('Identifier/resource-id'),
|
|
14
|
+
text: zod_1.z.string().optional().describe('Text content'),
|
|
15
|
+
type: zod_1.z.string().optional().describe('Element type'),
|
|
16
|
+
durationMs: zod_1.z
|
|
17
|
+
.number()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Press duration in ms (default: 1000)'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ label, identifier, text, type, durationMs }) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await backend.longPress({ label, identifier, text, type }, durationMs);
|
|
24
|
+
return {
|
|
25
|
+
content: [
|
|
26
|
+
{
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: `Long pressed ${result.targetDescription} at (${result.x}, ${result.y}) for ${durationMs ?? 1000}ms`,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return (0, shared_js_1.errorResult)(error);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=long-press.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-press.cjs","sourceRoot":"","sources":["../../src/tools/long-press.ts"],"names":[],"mappings":";;AAMA,sDAyCC;AA9CD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,kEAAkE;YAClE,gEAAgE;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC5D,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACpE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,UAAU,EAAE,OAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sCAAsC,CAAC;SACpD;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CACpC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EACjC,UAAU,CACX,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gBAAgB,MAAM,CAAC,iBAAiB,QAAQ,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,SAAS,UAAU,IAAI,IAAI,IAAI;qBAC3G;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 registerLongPressTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_long_press',\n {\n title: 'Long Press',\n description:\n 'Long press an element. Used for context menus, drag initiation, ' +\n 'and other long-press interactions. Default duration is 1000ms.',\n inputSchema: {\n label: z.string().optional().describe('Accessibility label'),\n identifier: z.string().optional().describe('Identifier/resource-id'),\n text: z.string().optional().describe('Text content'),\n type: z.string().optional().describe('Element type'),\n durationMs: z\n .number()\n .optional()\n .describe('Press duration in ms (default: 1000)'),\n },\n },\n async ({ label, identifier, text, type, durationMs }) => {\n try {\n const result = await backend.longPress(\n { label, identifier, text, type },\n durationMs,\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: `Long pressed ${result.targetDescription} at (${result.x}, ${result.y}) for ${durationMs ?? 1000}ms`,\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 registerLongPressTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=long-press.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-press.d.cts","sourceRoot":"","sources":["../../src/tools/long-press.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,CAsCN"}
|
|
@@ -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 registerLongPressTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=long-press.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-press.d.mts","sourceRoot":"","sources":["../../src/tools/long-press.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,CAsCN"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerLongPressTool(server, backend) {
|
|
4
|
+
server.registerTool('device_long_press', {
|
|
5
|
+
title: 'Long Press',
|
|
6
|
+
description: 'Long press an element. Used for context menus, drag initiation, ' +
|
|
7
|
+
'and other long-press interactions. Default duration is 1000ms.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
label: z.string().optional().describe('Accessibility label'),
|
|
10
|
+
identifier: z.string().optional().describe('Identifier/resource-id'),
|
|
11
|
+
text: z.string().optional().describe('Text content'),
|
|
12
|
+
type: z.string().optional().describe('Element type'),
|
|
13
|
+
durationMs: z
|
|
14
|
+
.number()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Press duration in ms (default: 1000)'),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ label, identifier, text, type, durationMs }) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await backend.longPress({ label, identifier, text, type }, durationMs);
|
|
21
|
+
return {
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: `Long pressed ${result.targetDescription} at (${result.x}, ${result.y}) for ${durationMs ?? 1000}ms`,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return errorResult(error);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=long-press.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-press.mjs","sourceRoot":"","sources":["../../src/tools/long-press.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,mBAAmB,EACnB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,kEAAkE;YAClE,gEAAgE;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sCAAsC,CAAC;SACpD;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CACpC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EACjC,UAAU,CACX,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gBAAgB,MAAM,CAAC,iBAAiB,QAAQ,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,SAAS,UAAU,IAAI,IAAI,IAAI;qBAC3G;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 registerLongPressTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_long_press',\n {\n title: 'Long Press',\n description:\n 'Long press an element. Used for context menus, drag initiation, ' +\n 'and other long-press interactions. Default duration is 1000ms.',\n inputSchema: {\n label: z.string().optional().describe('Accessibility label'),\n identifier: z.string().optional().describe('Identifier/resource-id'),\n text: z.string().optional().describe('Text content'),\n type: z.string().optional().describe('Element type'),\n durationMs: z\n .number()\n .optional()\n .describe('Press duration in ms (default: 1000)'),\n },\n },\n async ({ label, identifier, text, type, durationMs }) => {\n try {\n const result = await backend.longPress(\n { label, identifier, text, type },\n durationMs,\n );\n return {\n content: [\n {\n type: 'text' as const,\n text: `Long pressed ${result.targetDescription} at (${result.x}, ${result.y}) for ${durationMs ?? 1000}ms`,\n },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerOpenAppTool = registerOpenAppTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerOpenAppTool(server, backend) {
|
|
7
|
+
server.registerTool('device_open_app', {
|
|
8
|
+
title: 'Open App',
|
|
9
|
+
description: 'Launch or bring to foreground an app by bundle ID. ' +
|
|
10
|
+
'iOS: bundle ID (e.g. io.metamask). Android: package name (e.g. io.metamask).',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
bundleId: zod_1.z.string().describe('App bundle ID or package name'),
|
|
13
|
+
},
|
|
14
|
+
}, async ({ bundleId }) => {
|
|
15
|
+
try {
|
|
16
|
+
await backend.openApp(bundleId);
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: `Opened app: ${bundleId}` }],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return (0, shared_js_1.errorResult)(error);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=open-app.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-app.cjs","sourceRoot":"","sources":["../../src/tools/open-app.ts"],"names":[],"mappings":";;AAMA,kDA0BC;AA/BD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,mBAAmB,CACjC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EACT,qDAAqD;YACrD,8EAA8E;QAChF,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,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChC,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 registerOpenAppTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_open_app',\n {\n title: 'Open App',\n description:\n 'Launch or bring to foreground an app by bundle ID. ' +\n 'iOS: bundle ID (e.g. io.metamask). Android: package name (e.g. io.metamask).',\n inputSchema: {\n bundleId: z.string().describe('App bundle ID or package name'),\n },\n },\n async ({ bundleId }) => {\n try {\n await backend.openApp(bundleId);\n return {\n content: [{ type: 'text' as const, text: `Opened app: ${bundleId}` }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-app.d.cts","sourceRoot":"","sources":["../../src/tools/open-app.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,CAuBN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-app.d.mts","sourceRoot":"","sources":["../../src/tools/open-app.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,CAuBN"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerOpenAppTool(server, backend) {
|
|
4
|
+
server.registerTool('device_open_app', {
|
|
5
|
+
title: 'Open App',
|
|
6
|
+
description: 'Launch or bring to foreground an app by bundle ID. ' +
|
|
7
|
+
'iOS: bundle ID (e.g. io.metamask). Android: package name (e.g. io.metamask).',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
bundleId: z.string().describe('App bundle ID or package name'),
|
|
10
|
+
},
|
|
11
|
+
}, async ({ bundleId }) => {
|
|
12
|
+
try {
|
|
13
|
+
await backend.openApp(bundleId);
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: 'text', text: `Opened app: ${bundleId}` }],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return errorResult(error);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=open-app.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-app.mjs","sourceRoot":"","sources":["../../src/tools/open-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EACT,qDAAqD;YACrD,8EAA8E;QAChF,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,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChC,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 registerOpenAppTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_open_app',\n {\n title: 'Open App',\n description:\n 'Launch or bring to foreground an app by bundle ID. ' +\n 'iOS: bundle ID (e.g. io.metamask). Android: package name (e.g. io.metamask).',\n inputSchema: {\n bundleId: z.string().describe('App bundle ID or package name'),\n },\n },\n async ({ bundleId }) => {\n try {\n await backend.openApp(bundleId);\n return {\n content: [{ type: 'text' as const, text: `Opened app: ${bundleId}` }],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerPressButtonTool = registerPressButtonTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerPressButtonTool(server, backend) {
|
|
7
|
+
server.registerTool('device_press_button', {
|
|
8
|
+
title: 'Press Button',
|
|
9
|
+
description: 'Press a physical device button. ' +
|
|
10
|
+
'Note: iOS has no back button — "back" maps to home.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
button: zod_1.z
|
|
13
|
+
.enum(['home', 'back', 'enter', 'lock'])
|
|
14
|
+
.describe('Button to press'),
|
|
15
|
+
},
|
|
16
|
+
}, async ({ button }) => {
|
|
17
|
+
try {
|
|
18
|
+
await backend.pressButton(button);
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{ type: 'text', text: `Pressed ${button} button` },
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return (0, shared_js_1.errorResult)(error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=press-button.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-button.cjs","sourceRoot":"","sources":["../../src/tools/press-button.ts"],"names":[],"mappings":";;AAMA,0DA8BC;AAnCD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,uBAAuB,CACrC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kCAAkC;YAClC,qDAAqD;QACvD,WAAW,EAAE;YACX,MAAM,EAAE,OAAC;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;iBACvC,QAAQ,CAAC,iBAAiB,CAAC;SAC/B;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,MAAM,SAAS,EAAE;iBAC5D;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 registerPressButtonTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_press_button',\n {\n title: 'Press Button',\n description:\n 'Press a physical device button. ' +\n 'Note: iOS has no back button — \"back\" maps to home.',\n inputSchema: {\n button: z\n .enum(['home', 'back', 'enter', 'lock'])\n .describe('Button to press'),\n },\n },\n async ({ button }) => {\n try {\n await backend.pressButton(button);\n return {\n content: [\n { type: 'text' as const, text: `Pressed ${button} button` },\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 registerPressButtonTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=press-button.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-button.d.cts","sourceRoot":"","sources":["../../src/tools/press-button.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA2BN"}
|
|
@@ -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 registerPressButtonTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=press-button.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-button.d.mts","sourceRoot":"","sources":["../../src/tools/press-button.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA2BN"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerPressButtonTool(server, backend) {
|
|
4
|
+
server.registerTool('device_press_button', {
|
|
5
|
+
title: 'Press Button',
|
|
6
|
+
description: 'Press a physical device button. ' +
|
|
7
|
+
'Note: iOS has no back button — "back" maps to home.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
button: z
|
|
10
|
+
.enum(['home', 'back', 'enter', 'lock'])
|
|
11
|
+
.describe('Button to press'),
|
|
12
|
+
},
|
|
13
|
+
}, async ({ button }) => {
|
|
14
|
+
try {
|
|
15
|
+
await backend.pressButton(button);
|
|
16
|
+
return {
|
|
17
|
+
content: [
|
|
18
|
+
{ type: 'text', text: `Pressed ${button} button` },
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return errorResult(error);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=press-button.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-button.mjs","sourceRoot":"","sources":["../../src/tools/press-button.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kCAAkC;YAClC,qDAAqD;QACvD,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;iBACvC,QAAQ,CAAC,iBAAiB,CAAC;SAC/B;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,MAAM,SAAS,EAAE;iBAC5D;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 registerPressButtonTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_press_button',\n {\n title: 'Press Button',\n description:\n 'Press a physical device button. ' +\n 'Note: iOS has no back button — \"back\" maps to home.',\n inputSchema: {\n button: z\n .enum(['home', 'back', 'enter', 'lock'])\n .describe('Button to press'),\n },\n },\n async ({ button }) => {\n try {\n await backend.pressButton(button);\n return {\n content: [\n { type: 'text' as const, text: `Pressed ${button} button` },\n ],\n };\n } catch (error) {\n return errorResult(error);\n }\n },\n );\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerScreenRecordingTool = registerScreenRecordingTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerScreenRecordingTool(server, backend) {
|
|
7
|
+
server.registerTool('device_screen_recording', {
|
|
8
|
+
title: 'Screen Recording',
|
|
9
|
+
description: 'Start or stop recording the device screen as an MP4 video. ' +
|
|
10
|
+
'Call with action=start to begin, action=stop to end and save. ' +
|
|
11
|
+
'Returns the file path on stop.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
action: zod_1.z
|
|
14
|
+
.enum(['start', 'stop'])
|
|
15
|
+
.describe('Action: start or stop recording'),
|
|
16
|
+
outputPath: zod_1.z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('File path to save the recording (optional, for start)'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ action, outputPath }) => {
|
|
22
|
+
try {
|
|
23
|
+
if (action === 'start') {
|
|
24
|
+
await backend.startScreenRecording(outputPath);
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{ type: 'text', text: 'Screen recording started' },
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const path = await backend.stopScreenRecording();
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: 'text',
|
|
36
|
+
text: `Screen recording saved to ${path}`,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return (0, shared_js_1.errorResult)(error);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=screen-recording.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-recording.cjs","sourceRoot":"","sources":["../../src/tools/screen-recording.ts"],"names":[],"mappings":";;AAMA,kEA+CC;AApDD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,2BAA2B,CACzC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,6DAA6D;YAC7D,gEAAgE;YAChE,gCAAgC;QAClC,WAAW,EAAE;YACX,MAAM,EAAE,OAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;iBACvB,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,UAAU,EAAE,OAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,EAAE;qBAC5D;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6BAA6B,IAAI,EAAE;qBAC1C;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 registerScreenRecordingTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_screen_recording',\n {\n title: 'Screen Recording',\n description:\n 'Start or stop recording the device screen as an MP4 video. ' +\n 'Call with action=start to begin, action=stop to end and save. ' +\n 'Returns the file path on stop.',\n inputSchema: {\n action: z\n .enum(['start', 'stop'])\n .describe('Action: start or stop recording'),\n outputPath: z\n .string()\n .optional()\n .describe('File path to save the recording (optional, for start)'),\n },\n },\n async ({ action, outputPath }) => {\n try {\n if (action === 'start') {\n await backend.startScreenRecording(outputPath);\n return {\n content: [\n { type: 'text' as const, text: 'Screen recording started' },\n ],\n };\n }\n\n const path = await backend.stopScreenRecording();\n return {\n content: [\n {\n type: 'text' as const,\n text: `Screen recording saved to ${path}`,\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 registerScreenRecordingTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=screen-recording.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-recording.d.cts","sourceRoot":"","sources":["../../src/tools/screen-recording.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA4CN"}
|
|
@@ -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 registerScreenRecordingTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=screen-recording.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-recording.d.mts","sourceRoot":"","sources":["../../src/tools/screen-recording.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CA4CN"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorResult } from "./shared.mjs";
|
|
3
|
+
export function registerScreenRecordingTool(server, backend) {
|
|
4
|
+
server.registerTool('device_screen_recording', {
|
|
5
|
+
title: 'Screen Recording',
|
|
6
|
+
description: 'Start or stop recording the device screen as an MP4 video. ' +
|
|
7
|
+
'Call with action=start to begin, action=stop to end and save. ' +
|
|
8
|
+
'Returns the file path on stop.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
action: z
|
|
11
|
+
.enum(['start', 'stop'])
|
|
12
|
+
.describe('Action: start or stop recording'),
|
|
13
|
+
outputPath: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('File path to save the recording (optional, for start)'),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ action, outputPath }) => {
|
|
19
|
+
try {
|
|
20
|
+
if (action === 'start') {
|
|
21
|
+
await backend.startScreenRecording(outputPath);
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{ type: 'text', text: 'Screen recording started' },
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const path = await backend.stopScreenRecording();
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: `Screen recording saved to ${path}`,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return errorResult(error);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=screen-recording.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-recording.mjs","sourceRoot":"","sources":["../../src/tools/screen-recording.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,YAAY;AAExB,OAAO,EAAE,WAAW,EAAE,qBAAoB;AAG1C,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,6DAA6D;YAC7D,gEAAgE;YAChE,gCAAgC;QAClC,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;iBACvB,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,EAAE;qBAC5D;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6BAA6B,IAAI,EAAE;qBAC1C;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 registerScreenRecordingTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_screen_recording',\n {\n title: 'Screen Recording',\n description:\n 'Start or stop recording the device screen as an MP4 video. ' +\n 'Call with action=start to begin, action=stop to end and save. ' +\n 'Returns the file path on stop.',\n inputSchema: {\n action: z\n .enum(['start', 'stop'])\n .describe('Action: start or stop recording'),\n outputPath: z\n .string()\n .optional()\n .describe('File path to save the recording (optional, for start)'),\n },\n },\n async ({ action, outputPath }) => {\n try {\n if (action === 'start') {\n await backend.startScreenRecording(outputPath);\n return {\n content: [\n { type: 'text' as const, text: 'Screen recording started' },\n ],\n };\n }\n\n const path = await backend.stopScreenRecording();\n return {\n content: [\n {\n type: 'text' as const,\n text: `Screen recording saved to ${path}`,\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.registerScreenshotTool = registerScreenshotTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const shared_js_1 = require("./shared.cjs");
|
|
6
|
+
function registerScreenshotTool(server, backend) {
|
|
7
|
+
server.registerTool('device_screenshot', {
|
|
8
|
+
title: 'Screenshot',
|
|
9
|
+
description: 'Capture a screenshot of the current device screen. ' +
|
|
10
|
+
'Returns base64-encoded PNG data. Optionally saves to a file path.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
outputPath: zod_1.z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('File path to save the screenshot (optional)'),
|
|
16
|
+
},
|
|
17
|
+
annotations: { readOnlyHint: true },
|
|
18
|
+
}, async ({ outputPath }) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await backend.screenshot(outputPath);
|
|
21
|
+
return {
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'image',
|
|
25
|
+
data: result.data,
|
|
26
|
+
mimeType: `image/${result.format}`,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: result.path
|
|
31
|
+
? `Screenshot saved to ${result.path}`
|
|
32
|
+
: 'Screenshot captured',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return (0, shared_js_1.errorResult)(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=screenshot.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.cjs","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":";;AAMA,wDA0CC;AA/CD,6BAAwB;AAExB,4CAA0C;AAG1C,SAAgB,sBAAsB,CACpC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,qDAAqD;YACrD,mEAAmE;QACrE,WAAW,EAAE;YACX,UAAU,EAAE,OAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;SAC3D;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,OAAgB;wBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,QAAQ,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE;qBACnC;oBACD;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACf,CAAC,CAAC,uBAAuB,MAAM,CAAC,IAAI,EAAE;4BACtC,CAAC,CAAC,qBAAqB;qBAC1B;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 registerScreenshotTool(\n server: McpServer,\n backend: DeviceBackend,\n): void {\n server.registerTool(\n 'device_screenshot',\n {\n title: 'Screenshot',\n description:\n 'Capture a screenshot of the current device screen. ' +\n 'Returns base64-encoded PNG data. Optionally saves to a file path.',\n inputSchema: {\n outputPath: z\n .string()\n .optional()\n .describe('File path to save the screenshot (optional)'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ outputPath }) => {\n try {\n const result = await backend.screenshot(outputPath);\n return {\n content: [\n {\n type: 'image' as const,\n data: result.data,\n mimeType: `image/${result.format}`,\n },\n {\n type: 'text' as const,\n text: result.path\n ? `Screenshot saved to ${result.path}`\n : 'Screenshot captured',\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 registerScreenshotTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=screenshot.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.cts","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gDAAgD;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,8BAA6B;AAE1D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAuCN"}
|
|
@@ -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 registerScreenshotTool(server: McpServer, backend: DeviceBackend): void;
|
|
4
|
+
//# sourceMappingURL=screenshot.d.mts.map
|