appium-mcp 1.58.0 → 1.59.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -11
- package/dist/session-store.d.ts +0 -6
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +0 -14
- package/dist/session-store.js.map +1 -1
- package/dist/tools/app-management/app.js +1 -1
- package/dist/tools/app-management/app.js.map +1 -1
- package/dist/tools/app-management/install-app.d.ts.map +1 -1
- package/dist/tools/app-management/install-app.js +9 -11
- package/dist/tools/app-management/install-app.js.map +1 -1
- package/dist/tools/app-management/resolve-app-id.js +1 -1
- package/dist/tools/app-management/resolve-app-id.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/session/device-control.d.ts.map +1 -1
- package/dist/tools/session/device-control.js +17 -28
- package/dist/tools/session/device-control.js.map +1 -1
- package/dist/tools/session/driver-settings.d.ts.map +1 -1
- package/dist/tools/session/driver-settings.js +13 -41
- package/dist/tools/session/driver-settings.js.map +1 -1
- package/dist/tools/tool-response.d.ts +34 -0
- package/dist/tools/tool-response.d.ts.map +1 -0
- package/dist/tools/tool-response.js +44 -0
- package/dist/tools/tool-response.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/session-store.ts +0 -17
- package/src/tools/app-management/app.ts +1 -1
- package/src/tools/app-management/install-app.ts +15 -12
- package/src/tools/app-management/resolve-app-id.ts +1 -1
- package/src/tools/index.ts +13 -7
- package/src/tools/session/device-control.ts +25 -31
- package/src/tools/session/driver-settings.ts +22 -41
- package/src/tools/tool-response.ts +62 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.59.1](https://github.com/appium/appium-mcp/compare/v1.59.0...v1.59.1) (2026-04-18)
|
|
2
|
+
|
|
3
|
+
### Miscellaneous Chores
|
|
4
|
+
|
|
5
|
+
* **tools:** unify tool text results and driver resolution helpers ([#263](https://github.com/appium/appium-mcp/issues/263)) ([f9084ec](https://github.com/appium/appium-mcp/commit/f9084ec82169660a6cb2a3c12e0714706b8a1c7c))
|
|
6
|
+
|
|
7
|
+
## [1.59.0](https://github.com/appium/appium-mcp/compare/v1.58.0...v1.59.0) (2026-04-17)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* rename appium_app to appium_app_lifecycle ([#273](https://github.com/appium/appium-mcp/issues/273)) ([d524036](https://github.com/appium/appium-mcp/commit/d5240366604a988fdc56e5e1d218f71743f344de))
|
|
12
|
+
|
|
1
13
|
## [1.58.0](https://github.com/appium/appium-mcp/compare/v1.57.0...v1.58.0) (2026-04-17)
|
|
2
14
|
|
|
3
15
|
### Features
|
package/README.md
CHANGED
|
@@ -274,7 +274,7 @@ The following tools return lightweight text-only responses when NO_UI is enabled
|
|
|
274
274
|
- `select_device` - Returns device list as text without picker UI
|
|
275
275
|
- `create_session` - Returns session info as text without dashboard UI
|
|
276
276
|
- `appium_context` - Returns context list as text with `action=list` without switcher UI
|
|
277
|
-
- `
|
|
277
|
+
- `appium_app_lifecycle` (action=`list`) - Returns app list as JSON without interactive UI
|
|
278
278
|
|
|
279
279
|
**When to Enable NO_UI:**
|
|
280
280
|
|
|
@@ -355,16 +355,16 @@ The default regex pattern allows any URL that starts with `http://` or `https://
|
|
|
355
355
|
|
|
356
356
|
| Tool | Action | Description |
|
|
357
357
|
|---------------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
358
|
-
| `
|
|
359
|
-
| `
|
|
360
|
-
| `
|
|
361
|
-
| `
|
|
362
|
-
| `
|
|
363
|
-
| `
|
|
364
|
-
| `
|
|
365
|
-
| `
|
|
366
|
-
| `
|
|
367
|
-
| `
|
|
358
|
+
| `appium_app_lifecycle` | `activate` | Activate (launch/bring to foreground) a specified app by bundle ID or name |
|
|
359
|
+
| `appium_app_lifecycle` | `terminate` | Terminate (close) a specified app |
|
|
360
|
+
| `appium_app_lifecycle` | `install` | Install an app on the device from a file path |
|
|
361
|
+
| `appium_app_lifecycle` | `uninstall` | Uninstall an app from the device by bundle ID or name |
|
|
362
|
+
| `appium_app_lifecycle` | `list` | List all installed apps on the device (Android and iOS) |
|
|
363
|
+
| `appium_app_lifecycle` | `is_installed` | Check whether an app is installed. Package name for Android, bundle ID for iOS. |
|
|
364
|
+
| `appium_app_lifecycle` | `query_state` | Query the current state of an app: 0=not installed, 1=not running, 2=background suspended, 3=background, 4=foreground |
|
|
365
|
+
| `appium_app_lifecycle` | `background` | Background the current app for a duration (optional; defaults to 5 seconds) |
|
|
366
|
+
| `appium_app_lifecycle` | `clear` | Clear app data and cache without uninstalling (`mobile: clearApp`). Android: stop the app first when possible. iOS: **Simulator only**; not supported on real devices. |
|
|
367
|
+
| `appium_app_lifecycle` | `deep_link` | Open a deep link URL with the default or a specified app |
|
|
368
368
|
| `appium_mobile_permissions`| Get, update, or reset app permissions in one tool (`action`: get / update / reset) | Android: list or change runtime permissions. iOS Simulator: get/set privacy via bundle id; reset (`action=reset`) applies to the AUT on sim and device. |
|
|
369
369
|
|
|
370
370
|
### Test Generation & Documentation
|
package/dist/session-store.d.ts
CHANGED
|
@@ -44,12 +44,6 @@ export declare function isAndroidUiautomator2DriverSession(driver: NullableDrive
|
|
|
44
44
|
export declare function isXCUITestDriverSession(driver: NullableDriverInstance): driver is XCUITestDriver;
|
|
45
45
|
export declare function setSession(d: DriverInstance, id: string | null, capabilities?: SessionCapabilities): void;
|
|
46
46
|
export declare function getDriver(sessionId?: string): NullableDriverInstance;
|
|
47
|
-
/**
|
|
48
|
-
* Get a driver instance or throw if none is available.
|
|
49
|
-
* Accepts an optional sessionId to target a specific session
|
|
50
|
-
* instead of the currently active one.
|
|
51
|
-
*/
|
|
52
|
-
export declare function getDriverOrThrow(sessionId?: string): DriverInstance;
|
|
53
47
|
export declare function getSessionId(): string | null;
|
|
54
48
|
export declare function listSessions(): Array<{
|
|
55
49
|
sessionId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAIxC,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,yBAAyB,GACzB,cAAc,CAAC;AACnB,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,IAAI,CAAC;AAC3D,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AA0BtD,eAAO,MAAM,QAAQ;;;CAGpB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAQ7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,sBAAsB,GAC7B,MAAM,IAAI,yBAAyB,CAErC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,GAC7B,MAAM,IAAI,cAAc,CAE1B;AAED,wBAAgB,UAAU,CACxB,CAAC,EAAE,cAAc,EACjB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,YAAY,GAAE,mBAAwB,QA6BvC;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAMpE;AAED
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAIxC,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,yBAAyB,GACzB,cAAc,CAAC;AACnB,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,IAAI,CAAC;AAC3D,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AA0BtD,eAAO,MAAM,QAAQ;;;CAGpB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAQ7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,sBAAsB,GAC7B,MAAM,IAAI,yBAAyB,CAErC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,GAC7B,MAAM,IAAI,cAAc,CAE1B;AAED,wBAAgB,UAAU,CACxB,CAAC,EAAE,cAAc,EACjB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,YAAY,GAAE,mBAAwB,QA6BvC;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAMpE;AAED,wBAAgB,YAAY,kBAE3B;AAED,wBAAgB,YAAY,IAAI,KAAK,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,mBAAmB,CAAC;CACnC,CAAC,CAUD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAaT;AAED,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMnE;AAED,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,MAAM,WAM7D;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C;AAaD,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6C5E;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgB7D;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,GAAG,KAAG,MAsB7C,CAAC"}
|
package/dist/session-store.js
CHANGED
|
@@ -88,20 +88,6 @@ export function getDriver(sessionId) {
|
|
|
88
88
|
}
|
|
89
89
|
return sessions.get(id)?.driver ?? null;
|
|
90
90
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Get a driver instance or throw if none is available.
|
|
93
|
-
* Accepts an optional sessionId to target a specific session
|
|
94
|
-
* instead of the currently active one.
|
|
95
|
-
*/
|
|
96
|
-
export function getDriverOrThrow(sessionId) {
|
|
97
|
-
const driver = getDriver(sessionId);
|
|
98
|
-
if (!driver) {
|
|
99
|
-
throw new Error(sessionId
|
|
100
|
-
? `No driver found for session ${sessionId}`
|
|
101
|
-
: 'No active session. Call create_session first.');
|
|
102
|
-
}
|
|
103
|
-
return driver;
|
|
104
|
-
}
|
|
105
91
|
export function getSessionId() {
|
|
106
92
|
return activeSessionId;
|
|
107
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,GAAG,MAAM,aAAa,CAAC;AAyB9B;;GAEG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAChD;;GAEG;AACH,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CACL,CAAC,CAAC,MAAM,YAAY,yBAAyB,CAAC;YAC9C,CAAC,CAAC,MAAM,YAAY,cAAc,CAAC,CACpC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kCAAkC,CAChD,MAA8B;IAE9B,OAAO,MAAM,YAAY,yBAAyB,CAAC;AACrD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAA8B;IAE9B,OAAO,MAAM,YAAY,cAAc,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,CAAiB,EACjB,EAAiB,EACjB,eAAoC,EAAE;IAEtC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,eAAe,GAAG,IAAI,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAoB;QAChC,QAAQ,EACL,YAAY,CAAC,YAAmC;YAChD,YAAY,CAAC,qBAAqB,CAAwB;YAC3D,IAAI;QACN,cAAc,EACX,YAAY,CAAC,uBAAuB,CAAwB,IAAI,IAAI;QACvE,UAAU,EACP,YAAY,CAAC,mBAAmB,CAAwB;YACxD,YAAY,CAAC,UAAiC;YAC/C,IAAI;QACN,YAAY;KACb,CAAC;IAEF,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;QACf,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,YAAY;QAC5B,iBAAiB,EAAE,KAAK;QACxB,QAAQ;KACT,CAAC,CAAC;IACH,eAAe,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAkB;IAC1C,MAAM,EAAE,GAAG,SAAS,IAAI,eAAe,CAAC;IACxC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,7 +77,7 @@ const schema = z.object({
|
|
|
77
77
|
});
|
|
78
78
|
export default function app(server) {
|
|
79
79
|
server.addTool({
|
|
80
|
-
name: '
|
|
80
|
+
name: 'appium_app_lifecycle',
|
|
81
81
|
description: `Manage apps on the device. Use the action parameter to choose what to do: ${APP_ACTIONS.join(', ')}.`,
|
|
82
82
|
parameters: schema,
|
|
83
83
|
annotations: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,GAAG;IAClB,UAAU;IACV,WAAW;IACX,SAAS;IACT,WAAW;IACX,MAAM;IACN,cAAc;IACd,aAAa;IACb,YAAY;IACZ,OAAO;IACP,WAAW;CACH,CAAC;AAIX,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,WAAW,CAAC;SACjB,QAAQ,CACP,qBAAqB;QACnB,2DAA2D;QAC3D,uDAAuD;QACvD,mDAAmD;QACnD,sFAAsF;QACtF,gEAAgE;QAChE,iEAAiE;QACjE,+HAA+H;QAC/H,+EAA+E;QAC/E,oEAAoE;QACpE,wEAAwE,CAC3E;IACH,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,2KAA2K,CAC5K;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8KAA8K,CAC/K;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,8EAA8E,CAC/E;IACH,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE,CAC1E;IACH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC,CAAC;SACP,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,EAAE;SACV,QAAQ,CACP,0DAA0D,0BAA0B,8EAA8E,CACnK;IACH,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F,CAC3F;IACH,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,+GAA+G,CAChH;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4DAA4D,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,MAAe;IACzC,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-app.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/install-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"install-app.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/install-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAW7C,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAgBxB"}
|
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getPlatformName, PLATFORM } from '../../session-store.js';
|
|
2
2
|
import { execute } from '../../command.js';
|
|
3
3
|
import { invalidateAppListCache } from './resolve-app-id.js';
|
|
4
|
+
import { errorResult, resolveDriver, textResult, toolErrorMessage, } from '../tool-response.js';
|
|
4
5
|
export async function install(path, sessionId) {
|
|
6
|
+
const resolved = resolveDriver(sessionId);
|
|
7
|
+
if (!resolved.ok) {
|
|
8
|
+
return resolved.result;
|
|
9
|
+
}
|
|
10
|
+
const { driver } = resolved;
|
|
5
11
|
try {
|
|
6
|
-
const driver = getDriver(sessionId);
|
|
7
|
-
if (!driver) {
|
|
8
|
-
return { content: [{ type: 'text', text: 'No driver found' }] };
|
|
9
|
-
}
|
|
10
12
|
const platform = getPlatformName(driver);
|
|
11
13
|
const params = platform === PLATFORM.android ? { appPath: path } : { app: path };
|
|
12
14
|
await execute(driver, 'mobile: installApp', params);
|
|
13
15
|
invalidateAppListCache(sessionId);
|
|
14
|
-
return
|
|
16
|
+
return textResult('App installed successfully');
|
|
15
17
|
}
|
|
16
18
|
catch (err) {
|
|
17
|
-
return {
|
|
18
|
-
content: [
|
|
19
|
-
{ type: 'text', text: `Failed to install app. err: ${err.toString()}` },
|
|
20
|
-
],
|
|
21
|
-
};
|
|
19
|
+
return errorResult(`Failed to install app. err: ${toolErrorMessage(err)}`);
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
22
|
//# sourceMappingURL=install-app.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-app.js","sourceRoot":"","sources":["../../../src/tools/app-management/install-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install-app.js","sourceRoot":"","sources":["../../../src/tools/app-management/install-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,SAAkB;IAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GACV,QAAQ,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACpE,MAAM,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACpD,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAClC,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,+BAA+B,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -98,7 +98,7 @@ export async function resolveAppId(name, sessionId) {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
if (scored.length === 0) {
|
|
101
|
-
throw new Error(`No installed app matched the name "${name}". Use
|
|
101
|
+
throw new Error(`No installed app matched the name "${name}". Use appium_app_lifecycle with action=list" action to see available apps.`);
|
|
102
102
|
}
|
|
103
103
|
scored.sort((a, b) => b.score - a.score);
|
|
104
104
|
return scored[0].packageName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-app-id.js","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"resolve-app-id.js","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
* See src/tools/README.md for tool organization.
|
|
13
13
|
* See src/tools/metadata/README.md for YAML metadata approach.
|
|
14
14
|
*/
|
|
15
|
-
import { FastMCP } from 'fastmcp';
|
|
15
|
+
import type { FastMCP } from 'fastmcp';
|
|
16
16
|
export default function registerTools(server: FastMCP): void;
|
|
17
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA6CvC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAmI3D"}
|
package/dist/tools/index.js
CHANGED
|
@@ -59,6 +59,9 @@ export default function registerTools(server) {
|
|
|
59
59
|
'clientSecret',
|
|
60
60
|
];
|
|
61
61
|
const redactArgs = (obj) => {
|
|
62
|
+
if (obj === undefined || obj === null) {
|
|
63
|
+
return obj;
|
|
64
|
+
}
|
|
62
65
|
try {
|
|
63
66
|
return JSON.parse(JSON.stringify(obj, (key, value) => {
|
|
64
67
|
if (key &&
|
|
@@ -94,7 +97,7 @@ export default function registerTools(server) {
|
|
|
94
97
|
}
|
|
95
98
|
catch (err) {
|
|
96
99
|
const duration = Date.now() - start;
|
|
97
|
-
const msg = err
|
|
100
|
+
const msg = err instanceof Error ? err.stack || err.message : String(err);
|
|
98
101
|
log.error(`[TOOL ERROR] ${toolName} (${duration}ms): ${msg}`);
|
|
99
102
|
throw err;
|
|
100
103
|
}
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAeA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,mBAAmB,MAAM,6BAA6B,CAAC;AAC9D,OAAO,WAAW,MAAM,0BAA0B,CAAC;AACnD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,mBAAmB,MAAM,gCAAgC,CAAC;AACjE,OAAO,YAAY,MAAM,qCAAqC,CAAC;AAC/D,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,GAAG,MAAM,uBAAuB,CAAC;AACxC,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAC5C,OAAO,QAAQ,MAAM,6BAA6B,CAAC;AACnD,OAAO,QAAQ,MAAM,6BAA6B,CAAC;AACnD,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAClD,OAAO,OAAO,MAAM,4BAA4B,CAAC;AACjD,OAAO,mBAAmB,MAAM,yCAAyC,CAAC;AAC1E,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,MAAM,gCAAgC,CAAC;AACnD,OAAO,UAAU,MAAM,8BAA8B,CAAC;AACtD,OAAO,aAAa,MAAM,+BAA+B,CAAC;AAC1D,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,GAAG,MAAM,yBAAyB,CAAC;AAC1C,OAAO,OAAO,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-control.d.ts","sourceRoot":"","sources":["../../../src/tools/session/device-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AA4FtD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"device-control.d.ts","sourceRoot":"","sources":["../../../src/tools/session/device-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AA4FtD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA0CjE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { getPlatformName, isAndroidUiautomator2DriverSession, isRemoteDriverSession, isXCUITestDriverSession, PLATFORM, } from '../../session-store.js';
|
|
3
3
|
import { execute } from '../../command.js';
|
|
4
|
+
import { errorResult, platformMismatch, resolveDriver, textResult, toolErrorMessage, } from '../tool-response.js';
|
|
4
5
|
const deviceControlSchema = z.object({
|
|
5
6
|
action: z
|
|
6
7
|
.enum(['lock', 'unlock', 'shake', 'open_notifications'])
|
|
@@ -29,23 +30,23 @@ async function handleLock(driver, seconds) {
|
|
|
29
30
|
const msg = seconds !== undefined
|
|
30
31
|
? `Device locked for ${seconds} second(s).`
|
|
31
32
|
: 'Device locked.';
|
|
32
|
-
return
|
|
33
|
+
return textResult(msg);
|
|
33
34
|
}
|
|
34
35
|
async function handleUnlock(driver) {
|
|
35
36
|
await execute(driver, 'mobile: unlock', {});
|
|
36
|
-
return
|
|
37
|
+
return textResult('Device unlocked.');
|
|
37
38
|
}
|
|
38
39
|
async function handleShake(driver) {
|
|
39
40
|
if (!isXCUITestDriverSession(driver)) {
|
|
40
|
-
|
|
41
|
+
return platformMismatch('shake', 'iOS', getPlatformName(driver));
|
|
41
42
|
}
|
|
42
43
|
await driver.mobileShake();
|
|
43
|
-
return
|
|
44
|
+
return textResult('Shake action performed.');
|
|
44
45
|
}
|
|
45
46
|
async function handleOpenNotifications(driver) {
|
|
46
47
|
const platform = getPlatformName(driver);
|
|
47
48
|
if (platform !== PLATFORM.android) {
|
|
48
|
-
|
|
49
|
+
return platformMismatch('open_notifications', 'Android', platform);
|
|
49
50
|
}
|
|
50
51
|
if (isAndroidUiautomator2DriverSession(driver)) {
|
|
51
52
|
await driver.openNotifications();
|
|
@@ -56,11 +57,7 @@ async function handleOpenNotifications(driver) {
|
|
|
56
57
|
else {
|
|
57
58
|
throw new Error('Unsupported Android driver for open notifications');
|
|
58
59
|
}
|
|
59
|
-
return
|
|
60
|
-
content: [
|
|
61
|
-
{ type: 'text', text: 'Successfully opened notifications panel.' },
|
|
62
|
-
],
|
|
63
|
-
};
|
|
60
|
+
return textResult('Successfully opened notifications panel.');
|
|
64
61
|
}
|
|
65
62
|
export default function mobileDeviceControl(server) {
|
|
66
63
|
server.addTool({
|
|
@@ -72,14 +69,15 @@ export default function mobileDeviceControl(server) {
|
|
|
72
69
|
openWorldHint: false,
|
|
73
70
|
},
|
|
74
71
|
execute: async (args, _context) => {
|
|
72
|
+
const resolved = resolveDriver(args.sessionId);
|
|
73
|
+
if (!resolved.ok) {
|
|
74
|
+
return resolved.result;
|
|
75
|
+
}
|
|
76
|
+
const { driver } = resolved;
|
|
77
|
+
if (args.action !== 'lock' && args.seconds !== undefined) {
|
|
78
|
+
return errorResult('seconds is only valid when action is lock');
|
|
79
|
+
}
|
|
75
80
|
try {
|
|
76
|
-
const driver = getDriver(args.sessionId);
|
|
77
|
-
if (!driver) {
|
|
78
|
-
throw new Error('No driver found');
|
|
79
|
-
}
|
|
80
|
-
if (args.action !== 'lock' && args.seconds !== undefined) {
|
|
81
|
-
throw new Error('seconds is only valid when action is lock');
|
|
82
|
-
}
|
|
83
81
|
switch (args.action) {
|
|
84
82
|
case 'lock':
|
|
85
83
|
return await handleLock(driver, args.seconds);
|
|
@@ -92,16 +90,7 @@ export default function mobileDeviceControl(server) {
|
|
|
92
90
|
}
|
|
93
91
|
}
|
|
94
92
|
catch (err) {
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
content: [
|
|
98
|
-
{
|
|
99
|
-
type: 'text',
|
|
100
|
-
text: `Failed device control action ${args.action}. err: ${message}`,
|
|
101
|
-
},
|
|
102
|
-
],
|
|
103
|
-
isError: true,
|
|
104
|
-
};
|
|
93
|
+
return errorResult(`Failed device control action ${args.action}. err: ${toolErrorMessage(err)}`);
|
|
105
94
|
}
|
|
106
95
|
},
|
|
107
96
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-control.js","sourceRoot":"","sources":["../../../src/tools/session/device-control.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"device-control.js","sourceRoot":"","sources":["../../../src/tools/session/device-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-settings.d.ts","sourceRoot":"","sources":["../../../src/tools/session/driver-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"driver-settings.d.ts","sourceRoot":"","sources":["../../../src/tools/session/driver-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAwBtD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAiE5D"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { getDriver } from '../../session-store.js';
|
|
3
2
|
import { getSessionDriverSettings, updateSessionDriverSettings, } from '../../command.js';
|
|
3
|
+
import { errorResult, resolveDriver, textResult, toolErrorMessage, } from '../tool-response.js';
|
|
4
4
|
const updateSettingsSchema = z.object({
|
|
5
5
|
settings: z
|
|
6
6
|
.record(z.string(), z.any())
|
|
@@ -21,31 +21,17 @@ export default function driverSettings(server) {
|
|
|
21
21
|
openWorldHint: false,
|
|
22
22
|
},
|
|
23
23
|
execute: async (_args, _context) => {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
26
|
-
|
|
24
|
+
const resolved = resolveDriver();
|
|
25
|
+
if (!resolved.ok) {
|
|
26
|
+
return resolved.result;
|
|
27
27
|
}
|
|
28
|
+
const { driver } = resolved;
|
|
28
29
|
try {
|
|
29
30
|
const settings = await getSessionDriverSettings(driver);
|
|
30
|
-
return
|
|
31
|
-
content: [
|
|
32
|
-
{
|
|
33
|
-
type: 'text',
|
|
34
|
-
text: JSON.stringify(settings, null, 2),
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
};
|
|
31
|
+
return textResult(JSON.stringify(settings, null, 2));
|
|
38
32
|
}
|
|
39
33
|
catch (err) {
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
content: [
|
|
43
|
-
{
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: `Failed to get driver settings. Error: ${message}`,
|
|
46
|
-
},
|
|
47
|
-
],
|
|
48
|
-
};
|
|
34
|
+
return errorResult(`Failed to get driver settings. Error: ${toolErrorMessage(err)}`);
|
|
49
35
|
}
|
|
50
36
|
},
|
|
51
37
|
});
|
|
@@ -61,31 +47,17 @@ export default function driverSettings(server) {
|
|
|
61
47
|
openWorldHint: false,
|
|
62
48
|
},
|
|
63
49
|
execute: async (args, _context) => {
|
|
64
|
-
const
|
|
65
|
-
if (!
|
|
66
|
-
|
|
50
|
+
const resolved = resolveDriver();
|
|
51
|
+
if (!resolved.ok) {
|
|
52
|
+
return resolved.result;
|
|
67
53
|
}
|
|
54
|
+
const { driver } = resolved;
|
|
68
55
|
try {
|
|
69
56
|
await updateSessionDriverSettings(driver, args.settings);
|
|
70
|
-
return
|
|
71
|
-
content: [
|
|
72
|
-
{
|
|
73
|
-
type: 'text',
|
|
74
|
-
text: 'Successfully updated driver settings.',
|
|
75
|
-
},
|
|
76
|
-
],
|
|
77
|
-
};
|
|
57
|
+
return textResult('Successfully updated driver settings.');
|
|
78
58
|
}
|
|
79
59
|
catch (err) {
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
content: [
|
|
83
|
-
{
|
|
84
|
-
type: 'text',
|
|
85
|
-
text: `Failed to update driver settings. Error: ${message}`,
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
};
|
|
60
|
+
return errorResult(`Failed to update driver settings. Error: ${toolErrorMessage(err)}`);
|
|
89
61
|
}
|
|
90
62
|
},
|
|
91
63
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-settings.js","sourceRoot":"","sources":["../../../src/tools/session/driver-settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"driver-settings.js","sourceRoot":"","sources":["../../../src/tools/session/driver-settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;SAC3B,QAAQ,CACP,6EAA6E;QAC3E,kFAAkF;QAClF,iFAAiF;QACjF,2DAA2D,CAC9D;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAe;IACpD,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,oFAAoF;YACpF,yFAAyF;YACzF,2FAA2F;QAC7F,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,KAA4B,EAC5B,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;gBACxD,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,yCAAyC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,qFAAqF;YACrF,uFAAuF;YACvF,qFAAqF;YACrF,oBAAoB;QACtB,UAAU,EAAE,oBAAoB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAA0C,EAC1C,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzD,OAAO,UAAU,CAAC,uCAAuC,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,4CAA4C,gBAAgB,CAAC,GAAG,CAAC,EAAE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ContentResult } from 'fastmcp';
|
|
2
|
+
import type { DriverInstance } from '../session-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes unknown errors into a message string for tool responses.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toolErrorMessage(err: unknown): string;
|
|
7
|
+
/**
|
|
8
|
+
* Standard success ContentResult.
|
|
9
|
+
*/
|
|
10
|
+
export declare function textResult(text: string): ContentResult;
|
|
11
|
+
/**
|
|
12
|
+
* Standard error ContentResult. Sets isError so MCP clients can handle
|
|
13
|
+
* failures consistently without throwing (which adds an unhelpful prefix).
|
|
14
|
+
*/
|
|
15
|
+
export declare function errorResult(text: string): ContentResult;
|
|
16
|
+
export type DriverOrError = {
|
|
17
|
+
ok: true;
|
|
18
|
+
driver: DriverInstance;
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
result: ContentResult;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Resolves the driver for a tool call or returns a standardised error result.
|
|
25
|
+
* Named resolveDriver (not requireDriver / getDriverOrThrow) to make clear
|
|
26
|
+
* it never throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveDriver(sessionId?: string): DriverOrError;
|
|
29
|
+
/**
|
|
30
|
+
* Returns a standard error result for platform-mismatch cases
|
|
31
|
+
* (e.g. shake is iOS-only, open-notifications is Android-only).
|
|
32
|
+
*/
|
|
33
|
+
export declare function platformMismatch(action: string, expected: string, actual: string): ContentResult;
|
|
34
|
+
//# sourceMappingURL=tool-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEvD;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAY/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,aAAa,CAIf"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getDriver } from '../session-store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes unknown errors into a message string for tool responses.
|
|
4
|
+
*/
|
|
5
|
+
export function toolErrorMessage(err) {
|
|
6
|
+
return err instanceof Error ? err.message : String(err);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Standard success ContentResult.
|
|
10
|
+
*/
|
|
11
|
+
export function textResult(text) {
|
|
12
|
+
return { content: [{ type: 'text', text }] };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Standard error ContentResult. Sets isError so MCP clients can handle
|
|
16
|
+
* failures consistently without throwing (which adds an unhelpful prefix).
|
|
17
|
+
*/
|
|
18
|
+
export function errorResult(text) {
|
|
19
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolves the driver for a tool call or returns a standardised error result.
|
|
23
|
+
* Named resolveDriver (not requireDriver / getDriverOrThrow) to make clear
|
|
24
|
+
* it never throws.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveDriver(sessionId) {
|
|
27
|
+
const driver = getDriver(sessionId);
|
|
28
|
+
if (!driver) {
|
|
29
|
+
const ctx = sessionId ? ` for session '${sessionId}'` : '';
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
result: errorResult(`No active driver session${ctx}. Call create_session first or pass a valid sessionId.`),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return { ok: true, driver };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns a standard error result for platform-mismatch cases
|
|
39
|
+
* (e.g. shake is iOS-only, open-notifications is Android-only).
|
|
40
|
+
*/
|
|
41
|
+
export function platformMismatch(action, expected, actual) {
|
|
42
|
+
return errorResult(`action=${action} is ${expected}-only. Current session platform is '${actual}'.`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tool-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAMD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,CACjB,2BAA2B,GAAG,wDAAwD,CACvF;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,QAAgB,EAChB,MAAc;IAEd,OAAO,WAAW,CAChB,UAAU,MAAM,OAAO,QAAQ,uCAAuC,MAAM,IAAI,CACjF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.appium/appium-mcp",
|
|
4
4
|
"title": "MCP Appium - Mobile Development and Automation Server",
|
|
5
5
|
"description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.59.1",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.
|
|
11
|
+
"version": "1.59.1",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
|
Binary file
|
package/src/session-store.ts
CHANGED
|
@@ -135,23 +135,6 @@ export function getDriver(sessionId?: string): NullableDriverInstance {
|
|
|
135
135
|
return sessions.get(id)?.driver ?? null;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
/**
|
|
139
|
-
* Get a driver instance or throw if none is available.
|
|
140
|
-
* Accepts an optional sessionId to target a specific session
|
|
141
|
-
* instead of the currently active one.
|
|
142
|
-
*/
|
|
143
|
-
export function getDriverOrThrow(sessionId?: string): DriverInstance {
|
|
144
|
-
const driver = getDriver(sessionId);
|
|
145
|
-
if (!driver) {
|
|
146
|
-
throw new Error(
|
|
147
|
-
sessionId
|
|
148
|
-
? `No driver found for session ${sessionId}`
|
|
149
|
-
: 'No active session. Call create_session first.'
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
return driver;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
138
|
export function getSessionId() {
|
|
156
139
|
return activeSessionId;
|
|
157
140
|
}
|
|
@@ -99,7 +99,7 @@ const schema = z.object({
|
|
|
99
99
|
|
|
100
100
|
export default function app(server: FastMCP): void {
|
|
101
101
|
server.addTool({
|
|
102
|
-
name: '
|
|
102
|
+
name: 'appium_app_lifecycle',
|
|
103
103
|
description: `Manage apps on the device. Use the action parameter to choose what to do: ${APP_ACTIONS.join(', ')}.`,
|
|
104
104
|
parameters: schema,
|
|
105
105
|
annotations: {
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import type { ContentResult } from 'fastmcp';
|
|
2
|
-
import {
|
|
2
|
+
import { getPlatformName, PLATFORM } from '../../session-store.js';
|
|
3
3
|
import { execute } from '../../command.js';
|
|
4
4
|
import { invalidateAppListCache } from './resolve-app-id.js';
|
|
5
|
+
import {
|
|
6
|
+
errorResult,
|
|
7
|
+
resolveDriver,
|
|
8
|
+
textResult,
|
|
9
|
+
toolErrorMessage,
|
|
10
|
+
} from '../tool-response.js';
|
|
5
11
|
|
|
6
12
|
export async function install(
|
|
7
13
|
path: string,
|
|
8
14
|
sessionId?: string
|
|
9
15
|
): Promise<ContentResult> {
|
|
16
|
+
const resolved = resolveDriver(sessionId);
|
|
17
|
+
if (!resolved.ok) {
|
|
18
|
+
return resolved.result;
|
|
19
|
+
}
|
|
20
|
+
const { driver } = resolved;
|
|
10
21
|
try {
|
|
11
|
-
const driver = getDriver(sessionId);
|
|
12
|
-
if (!driver) {
|
|
13
|
-
return { content: [{ type: 'text', text: 'No driver found' }] };
|
|
14
|
-
}
|
|
15
22
|
const platform = getPlatformName(driver);
|
|
16
23
|
const params =
|
|
17
24
|
platform === PLATFORM.android ? { appPath: path } : { app: path };
|
|
18
25
|
await execute(driver, 'mobile: installApp', params);
|
|
19
26
|
invalidateAppListCache(sessionId);
|
|
20
|
-
return
|
|
21
|
-
} catch (err:
|
|
22
|
-
return {
|
|
23
|
-
content: [
|
|
24
|
-
{ type: 'text', text: `Failed to install app. err: ${err.toString()}` },
|
|
25
|
-
],
|
|
26
|
-
};
|
|
27
|
+
return textResult('App installed successfully');
|
|
28
|
+
} catch (err: unknown) {
|
|
29
|
+
return errorResult(`Failed to install app. err: ${toolErrorMessage(err)}`);
|
|
27
30
|
}
|
|
28
31
|
}
|
|
@@ -131,7 +131,7 @@ export async function resolveAppId(
|
|
|
131
131
|
|
|
132
132
|
if (scored.length === 0) {
|
|
133
133
|
throw new Error(
|
|
134
|
-
`No installed app matched the name "${name}". Use
|
|
134
|
+
`No installed app matched the name "${name}". Use appium_app_lifecycle with action=list" action to see available apps.`
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
137
|
|
package/src/tools/index.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* See src/tools/README.md for tool organization.
|
|
13
13
|
* See src/tools/metadata/README.md for YAML metadata approach.
|
|
14
14
|
*/
|
|
15
|
-
import { FastMCP } from 'fastmcp';
|
|
15
|
+
import type { FastMCP } from 'fastmcp';
|
|
16
16
|
import log from '../logger.js';
|
|
17
17
|
import answerAppium from './documentation/answer-appium.js';
|
|
18
18
|
import appiumSkills from './documentation/appium-skills.js';
|
|
@@ -55,10 +55,12 @@ import screenRecording from './interactions/screen-recording.js';
|
|
|
55
55
|
import app from './app-management/app.js';
|
|
56
56
|
import context from './context/context.js';
|
|
57
57
|
|
|
58
|
+
type RegisteredTool = Parameters<FastMCP['addTool']>[0];
|
|
59
|
+
|
|
58
60
|
export default function registerTools(server: FastMCP): void {
|
|
59
61
|
// Wrap addTool to inject logging around tool execution
|
|
60
|
-
const originalAddTool =
|
|
61
|
-
|
|
62
|
+
const originalAddTool = server.addTool.bind(server);
|
|
63
|
+
server.addTool = (toolDef: RegisteredTool): void => {
|
|
62
64
|
const toolName = toolDef?.name ?? 'unknown_tool';
|
|
63
65
|
const originalExecute = toolDef?.execute;
|
|
64
66
|
if (typeof originalExecute !== 'function') {
|
|
@@ -74,7 +76,10 @@ export default function registerTools(server: FastMCP): void {
|
|
|
74
76
|
'secret',
|
|
75
77
|
'clientSecret',
|
|
76
78
|
];
|
|
77
|
-
const redactArgs = (obj:
|
|
79
|
+
const redactArgs = (obj: unknown): unknown => {
|
|
80
|
+
if (obj === undefined || obj === null) {
|
|
81
|
+
return obj;
|
|
82
|
+
}
|
|
78
83
|
try {
|
|
79
84
|
return JSON.parse(
|
|
80
85
|
JSON.stringify(obj, (key, value) => {
|
|
@@ -104,7 +109,7 @@ export default function registerTools(server: FastMCP): void {
|
|
|
104
109
|
};
|
|
105
110
|
return originalAddTool({
|
|
106
111
|
...toolDef,
|
|
107
|
-
execute: async (args
|
|
112
|
+
execute: async (args, context) => {
|
|
108
113
|
const start = Date.now();
|
|
109
114
|
log.info(`[TOOL START] ${toolName}`, redactArgs(args));
|
|
110
115
|
try {
|
|
@@ -112,9 +117,10 @@ export default function registerTools(server: FastMCP): void {
|
|
|
112
117
|
const duration = Date.now() - start;
|
|
113
118
|
log.info(`[TOOL END] ${toolName} (${duration}ms)`);
|
|
114
119
|
return result;
|
|
115
|
-
} catch (err:
|
|
120
|
+
} catch (err: unknown) {
|
|
116
121
|
const duration = Date.now() - start;
|
|
117
|
-
const msg =
|
|
122
|
+
const msg =
|
|
123
|
+
err instanceof Error ? err.stack || err.message : String(err);
|
|
118
124
|
log.error(`[TOOL ERROR] ${toolName} (${duration}ms): ${msg}`);
|
|
119
125
|
throw err;
|
|
120
126
|
}
|
|
@@ -2,7 +2,6 @@ import type { ContentResult, FastMCP } from 'fastmcp';
|
|
|
2
2
|
import type { AndroidUiautomator2Driver } from 'appium-uiautomator2-driver';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import {
|
|
5
|
-
getDriver,
|
|
6
5
|
getPlatformName,
|
|
7
6
|
isAndroidUiautomator2DriverSession,
|
|
8
7
|
isRemoteDriverSession,
|
|
@@ -11,6 +10,13 @@ import {
|
|
|
11
10
|
type DriverInstance,
|
|
12
11
|
} from '../../session-store.js';
|
|
13
12
|
import { execute } from '../../command.js';
|
|
13
|
+
import {
|
|
14
|
+
errorResult,
|
|
15
|
+
platformMismatch,
|
|
16
|
+
resolveDriver,
|
|
17
|
+
textResult,
|
|
18
|
+
toolErrorMessage,
|
|
19
|
+
} from '../tool-response.js';
|
|
14
20
|
|
|
15
21
|
const deviceControlSchema = z.object({
|
|
16
22
|
action: z
|
|
@@ -49,20 +55,20 @@ async function handleLock(
|
|
|
49
55
|
seconds !== undefined
|
|
50
56
|
? `Device locked for ${seconds} second(s).`
|
|
51
57
|
: 'Device locked.';
|
|
52
|
-
return
|
|
58
|
+
return textResult(msg);
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
async function handleUnlock(driver: DriverInstance): Promise<ContentResult> {
|
|
56
62
|
await execute(driver, 'mobile: unlock', {});
|
|
57
|
-
return
|
|
63
|
+
return textResult('Device unlocked.');
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
async function handleShake(driver: DriverInstance): Promise<ContentResult> {
|
|
61
67
|
if (!isXCUITestDriverSession(driver)) {
|
|
62
|
-
|
|
68
|
+
return platformMismatch('shake', 'iOS', getPlatformName(driver));
|
|
63
69
|
}
|
|
64
70
|
await (driver as any).mobileShake();
|
|
65
|
-
return
|
|
71
|
+
return textResult('Shake action performed.');
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
async function handleOpenNotifications(
|
|
@@ -70,9 +76,7 @@ async function handleOpenNotifications(
|
|
|
70
76
|
): Promise<ContentResult> {
|
|
71
77
|
const platform = getPlatformName(driver);
|
|
72
78
|
if (platform !== PLATFORM.android) {
|
|
73
|
-
|
|
74
|
-
`Unsupported platform: ${platform}. Open notifications is supported on Android only.`
|
|
75
|
-
);
|
|
79
|
+
return platformMismatch('open_notifications', 'Android', platform);
|
|
76
80
|
}
|
|
77
81
|
|
|
78
82
|
if (isAndroidUiautomator2DriverSession(driver)) {
|
|
@@ -83,11 +87,7 @@ async function handleOpenNotifications(
|
|
|
83
87
|
throw new Error('Unsupported Android driver for open notifications');
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
return
|
|
87
|
-
content: [
|
|
88
|
-
{ type: 'text', text: 'Successfully opened notifications panel.' },
|
|
89
|
-
],
|
|
90
|
-
};
|
|
90
|
+
return textResult('Successfully opened notifications panel.');
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
export default function mobileDeviceControl(server: FastMCP): void {
|
|
@@ -104,16 +104,17 @@ export default function mobileDeviceControl(server: FastMCP): void {
|
|
|
104
104
|
args: z.infer<typeof deviceControlSchema>,
|
|
105
105
|
_context: Record<string, unknown> | undefined
|
|
106
106
|
): Promise<ContentResult> => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
const resolved = resolveDriver(args.sessionId);
|
|
108
|
+
if (!resolved.ok) {
|
|
109
|
+
return resolved.result;
|
|
110
|
+
}
|
|
111
|
+
const { driver } = resolved;
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
if (args.action !== 'lock' && args.seconds !== undefined) {
|
|
114
|
+
return errorResult('seconds is only valid when action is lock');
|
|
115
|
+
}
|
|
116
116
|
|
|
117
|
+
try {
|
|
117
118
|
switch (args.action) {
|
|
118
119
|
case 'lock':
|
|
119
120
|
return await handleLock(driver, args.seconds);
|
|
@@ -125,16 +126,9 @@ export default function mobileDeviceControl(server: FastMCP): void {
|
|
|
125
126
|
return await handleOpenNotifications(driver);
|
|
126
127
|
}
|
|
127
128
|
} catch (err: unknown) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
{
|
|
132
|
-
type: 'text',
|
|
133
|
-
text: `Failed device control action ${args.action}. err: ${message}`,
|
|
134
|
-
},
|
|
135
|
-
],
|
|
136
|
-
isError: true,
|
|
137
|
-
};
|
|
129
|
+
return errorResult(
|
|
130
|
+
`Failed device control action ${args.action}. err: ${toolErrorMessage(err)}`
|
|
131
|
+
);
|
|
138
132
|
}
|
|
139
133
|
},
|
|
140
134
|
});
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { ContentResult, FastMCP } from 'fastmcp';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { getDriver } from '../../session-store.js';
|
|
4
3
|
import {
|
|
5
4
|
getSessionDriverSettings,
|
|
6
5
|
updateSessionDriverSettings,
|
|
7
6
|
} from '../../command.js';
|
|
7
|
+
import {
|
|
8
|
+
errorResult,
|
|
9
|
+
resolveDriver,
|
|
10
|
+
textResult,
|
|
11
|
+
toolErrorMessage,
|
|
12
|
+
} from '../tool-response.js';
|
|
8
13
|
|
|
9
14
|
const updateSettingsSchema = z.object({
|
|
10
15
|
settings: z
|
|
@@ -33,31 +38,19 @@ export default function driverSettings(server: FastMCP): void {
|
|
|
33
38
|
_args: Record<string, never>,
|
|
34
39
|
_context: Record<string, unknown> | undefined
|
|
35
40
|
): Promise<ContentResult> => {
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
|
|
41
|
+
const resolved = resolveDriver();
|
|
42
|
+
if (!resolved.ok) {
|
|
43
|
+
return resolved.result;
|
|
39
44
|
}
|
|
45
|
+
const { driver } = resolved;
|
|
40
46
|
|
|
41
47
|
try {
|
|
42
48
|
const settings = await getSessionDriverSettings(driver);
|
|
43
|
-
return
|
|
44
|
-
content: [
|
|
45
|
-
{
|
|
46
|
-
type: 'text',
|
|
47
|
-
text: JSON.stringify(settings, null, 2),
|
|
48
|
-
},
|
|
49
|
-
],
|
|
50
|
-
};
|
|
49
|
+
return textResult(JSON.stringify(settings, null, 2));
|
|
51
50
|
} catch (err: unknown) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
{
|
|
56
|
-
type: 'text',
|
|
57
|
-
text: `Failed to get driver settings. Error: ${message}`,
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
};
|
|
51
|
+
return errorResult(
|
|
52
|
+
`Failed to get driver settings. Error: ${toolErrorMessage(err)}`
|
|
53
|
+
);
|
|
61
54
|
}
|
|
62
55
|
},
|
|
63
56
|
});
|
|
@@ -78,31 +71,19 @@ export default function driverSettings(server: FastMCP): void {
|
|
|
78
71
|
args: z.infer<typeof updateSettingsSchema>,
|
|
79
72
|
_context: Record<string, unknown> | undefined
|
|
80
73
|
): Promise<ContentResult> => {
|
|
81
|
-
const
|
|
82
|
-
if (!
|
|
83
|
-
|
|
74
|
+
const resolved = resolveDriver();
|
|
75
|
+
if (!resolved.ok) {
|
|
76
|
+
return resolved.result;
|
|
84
77
|
}
|
|
78
|
+
const { driver } = resolved;
|
|
85
79
|
|
|
86
80
|
try {
|
|
87
81
|
await updateSessionDriverSettings(driver, args.settings);
|
|
88
|
-
return
|
|
89
|
-
content: [
|
|
90
|
-
{
|
|
91
|
-
type: 'text',
|
|
92
|
-
text: 'Successfully updated driver settings.',
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
};
|
|
82
|
+
return textResult('Successfully updated driver settings.');
|
|
96
83
|
} catch (err: unknown) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
{
|
|
101
|
-
type: 'text',
|
|
102
|
-
text: `Failed to update driver settings. Error: ${message}`,
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
};
|
|
84
|
+
return errorResult(
|
|
85
|
+
`Failed to update driver settings. Error: ${toolErrorMessage(err)}`
|
|
86
|
+
);
|
|
106
87
|
}
|
|
107
88
|
},
|
|
108
89
|
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ContentResult } from 'fastmcp';
|
|
2
|
+
import type { DriverInstance } from '../session-store.js';
|
|
3
|
+
import { getDriver } from '../session-store.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Normalizes unknown errors into a message string for tool responses.
|
|
7
|
+
*/
|
|
8
|
+
export function toolErrorMessage(err: unknown): string {
|
|
9
|
+
return err instanceof Error ? err.message : String(err);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Standard success ContentResult.
|
|
14
|
+
*/
|
|
15
|
+
export function textResult(text: string): ContentResult {
|
|
16
|
+
return { content: [{ type: 'text', text }] };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Standard error ContentResult. Sets isError so MCP clients can handle
|
|
21
|
+
* failures consistently without throwing (which adds an unhelpful prefix).
|
|
22
|
+
*/
|
|
23
|
+
export function errorResult(text: string): ContentResult {
|
|
24
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type DriverOrError =
|
|
28
|
+
| { ok: true; driver: DriverInstance }
|
|
29
|
+
| { ok: false; result: ContentResult };
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolves the driver for a tool call or returns a standardised error result.
|
|
33
|
+
* Named resolveDriver (not requireDriver / getDriverOrThrow) to make clear
|
|
34
|
+
* it never throws.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveDriver(sessionId?: string): DriverOrError {
|
|
37
|
+
const driver = getDriver(sessionId);
|
|
38
|
+
if (!driver) {
|
|
39
|
+
const ctx = sessionId ? ` for session '${sessionId}'` : '';
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
result: errorResult(
|
|
43
|
+
`No active driver session${ctx}. Call create_session first or pass a valid sessionId.`
|
|
44
|
+
),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { ok: true, driver };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Returns a standard error result for platform-mismatch cases
|
|
52
|
+
* (e.g. shake is iOS-only, open-notifications is Android-only).
|
|
53
|
+
*/
|
|
54
|
+
export function platformMismatch(
|
|
55
|
+
action: string,
|
|
56
|
+
expected: string,
|
|
57
|
+
actual: string
|
|
58
|
+
): ContentResult {
|
|
59
|
+
return errorResult(
|
|
60
|
+
`action=${action} is ${expected}-only. Current session platform is '${actual}'.`
|
|
61
|
+
);
|
|
62
|
+
}
|