appium-mcp 1.89.0 → 1.90.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 +57 -1
- package/dist/create-server.d.ts.map +1 -1
- package/dist/create-server.js +1 -2
- package/dist/create-server.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +5 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/page-source-inspector.d.ts +4 -0
- package/dist/resources/page-source-inspector.d.ts.map +1 -0
- package/dist/resources/page-source-inspector.js +15 -0
- package/dist/resources/page-source-inspector.js.map +1 -0
- package/dist/tools/gestures/schema.d.ts +1 -1
- package/dist/tools/interactions/get-page-source.d.ts.map +1 -1
- package/dist/tools/interactions/get-page-source.js +11 -2
- package/dist/tools/interactions/get-page-source.js.map +1 -1
- package/dist/tools/ios/prepare-ios-real-device.d.ts.map +1 -1
- package/dist/tools/ios/prepare-ios-real-device.js +2 -4
- package/dist/tools/ios/prepare-ios-real-device.js.map +1 -1
- package/dist/ui/mcp-apps.d.ts +15 -0
- package/dist/ui/mcp-apps.d.ts.map +1 -0
- package/dist/ui/mcp-apps.js +44 -0
- package/dist/ui/mcp-apps.js.map +1 -0
- package/dist/ui/page-source-inspector-app.d.ts +8 -0
- package/dist/ui/page-source-inspector-app.d.ts.map +1 -0
- package/dist/ui/page-source-inspector-app.js +250 -0
- package/dist/ui/page-source-inspector-app.js.map +1 -0
- package/package.json +4 -4
- package/server.json +2 -2
- package/src/create-server.ts +1 -2
- package/src/resources/index.ts +5 -0
- package/src/resources/page-source-inspector.ts +18 -0
- package/src/tools/interactions/get-page-source.ts +12 -5
- package/src/tools/ios/prepare-ios-real-device.ts +2 -5
- package/src/ui/mcp-apps.ts +59 -0
- package/src/ui/page-source-inspector-app.ts +249 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.90.1](https://github.com/appium/appium-mcp/compare/v1.90.0...v1.90.1) (2026-07-29)
|
|
2
|
+
|
|
3
|
+
### Miscellaneous Chores
|
|
4
|
+
|
|
5
|
+
* tweak lint more ([90edd2d](https://github.com/appium/appium-mcp/commit/90edd2d065d55362b0dc8ce1ebada381d6003cae))
|
|
6
|
+
|
|
7
|
+
## [1.90.0](https://github.com/appium/appium-mcp/compare/v1.89.0...v1.90.0) (2026-07-28)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* avoid duplicate page source UI payloads ([#477](https://github.com/appium/appium-mcp/issues/477)) ([b8370df](https://github.com/appium/appium-mcp/commit/b8370df42e6f6f46e043ba31b0935bede44465a3))
|
|
12
|
+
|
|
1
13
|
## [1.89.0](https://github.com/appium/appium-mcp/compare/v1.88.5...v1.89.0) (2026-07-26)
|
|
2
14
|
|
|
3
15
|
### Features
|
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@ MCP Appium is an intelligent MCP (Model Context Protocol) server designed to emp
|
|
|
12
12
|
- [Prerequisites](#-prerequisites)
|
|
13
13
|
- [Installation](#️-installation)
|
|
14
14
|
- [Configuration](#️-configuration)
|
|
15
|
+
- [Remote server security and trust model](#remote-server-security-and-trust-model)
|
|
15
16
|
- [Available Tools](#-available-tools)
|
|
16
17
|
- [Plugin API](#-plugin-api)
|
|
17
18
|
- [Client Support](#-client-support)
|
|
@@ -149,9 +150,10 @@ This will automatically configure the MCP server for use with Claude Code. Make
|
|
|
149
150
|
| `CAPABILITIES_CONFIG` | Optional | Absolute path to a `capabilities.json` file with per-platform capability presets |
|
|
150
151
|
| `SCREENSHOTS_DIR` | Optional | Directory where screenshots and screen recordings are saved. Defaults to the current working directory |
|
|
151
152
|
| `NO_UI` | Optional | Set to `true` or `1` to disable HTML UI components — faster responses, fewer tokens. See [NO_UI Mode](#no_ui-mode) |
|
|
153
|
+
| `APPIUM_MCP_APPS_ENABLED` | Optional | MCP Apps static UI mode. Enabled by default. Set to `false` or `0` to force the embedded UI compatibility fallback. See [MCP Apps Mode](#mcp-apps-mode) |
|
|
152
154
|
| `APPIUM_MCP_ON_CLIENT_DISCONNECT` | Optional | Session cleanup when the MCP client disconnects: `delete_all` (default) deletes **MCP-owned** Appium sessions (`safeDeleteAllSessions`); `skip` keeps those sessions across disconnects (e.g. HTTP/stream clients that reconnect). Attached/remote sessions are not removed by this path. See [MCP disconnect behavior](#mcp-disconnect-behavior). |
|
|
153
155
|
| `APPIUM_MCP_WDA_APP_PATH` | Optional | Absolute path to a pre-extracted `WebDriverAgentRunner-Runner.app` bundle. When set, `prepare_ios_simulator` skips all GitHub downloads and uses this bundle directly — useful in environments where external downloads are blocked |
|
|
154
|
-
|
|
|
156
|
+
| REMOTE_SERVER_URL_ALLOW_REGEX | Optional | Regular expression applied to the complete remoteServerUrl value before MCP Appium connects to a remote Appium/WebDriver server. When unset, any HTTP(S) destination is accepted. Set this in shared infrastructure or CI environments that require an explicit destination policy. See Remote server security and trust model. |
|
|
155
157
|
| `AI_VISION_ENABLED` | Optional | Set to `true` to register the `appium_ai` tool (vision-based element finding). When unset or `false`, the AI tool is **not registered** and the LLM has no way to invoke vision-based finding. Requires `AI_VISION_API_BASE_URL` and `AI_VISION_API_KEY` to also be set, otherwise the server fails to start. |
|
|
156
158
|
| `AI_VISION_API_BASE_URL` | Required when `AI_VISION_ENABLED=true` | Base URL of the OpenAI-compatible vision model API |
|
|
157
159
|
| `AI_VISION_API_KEY` | Required when `AI_VISION_ENABLED=true` | API key for the vision model provider |
|
|
@@ -328,6 +330,30 @@ More models benchmarked can be found [here](src/tests/benchmark_model/TEST_REPOR
|
|
|
328
330
|
|
|
329
331
|
### Performance Optimization
|
|
330
332
|
|
|
333
|
+
#### MCP Apps Mode
|
|
334
|
+
|
|
335
|
+
`appium_get_page_source` uses a static MCP App inspector by default when the client advertises MCP Apps support.
|
|
336
|
+
The XML remains in the normal text result for the LLM, while the inspector reads that same result instead of
|
|
337
|
+
receiving a duplicated XML copy.
|
|
338
|
+
|
|
339
|
+
For clients with unreliable MCP Apps rendering, set `APPIUM_MCP_APPS_ENABLED` to `false` or `0`:
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"appium-mcp": {
|
|
344
|
+
"env": {
|
|
345
|
+
"APPIUM_MCP_APPS_ENABLED": "false"
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
This keeps interactive UI enabled but forces the previous embedded page-source inspector. The compatibility mode
|
|
352
|
+
duplicates the XML inside the inspector HTML and therefore uses more result tokens and bandwidth. With a synthetic
|
|
353
|
+
95,000-character page source, the static mode reduced the result from approximately 267 KB to 95 KB (about 64%).
|
|
354
|
+
|
|
355
|
+
`NO_UI=true` or `NO_UI=1` takes precedence over this setting and disables both static and embedded UI.
|
|
356
|
+
|
|
331
357
|
#### NO_UI Mode
|
|
332
358
|
|
|
333
359
|
Set the `NO_UI` environment variable to `true` or `1` to disable UI components and improve performance:
|
|
@@ -421,6 +447,36 @@ HTTP and streamable MCP clients may **disconnect briefly** (reconnect, reload, p
|
|
|
421
447
|
|
|
422
448
|
**Tradeoff:** `skip` can leave **orphaned sessions** on your Appium server if nothing cleans up — use it when disconnect is not the same as “automation finished.”
|
|
423
449
|
|
|
450
|
+
### Remote server security and trust model
|
|
451
|
+
|
|
452
|
+
MCP Appium is designed to run as a local, single-user MCP server or as part of a trusted CI job. It is not intended to be exposed as a shared service to untrusted MCP clients.
|
|
453
|
+
|
|
454
|
+
The `remoteServerUrl` argument is intentionally configurable because MCP Appium acts as an Appium/WebDriver client and may need to connect to local, remote, private-network, or CI-hosted Appium servers.
|
|
455
|
+
|
|
456
|
+
Only allow trusted users and trusted workflow configuration to control `remoteServerUrl`. In particular:
|
|
457
|
+
|
|
458
|
+
* Do not expose the MCP tool surface directly to untrusted users.
|
|
459
|
+
* In CI, do not construct `remoteServerUrl` from untrusted pull request content, repository data, prompts, or other externally controlled input.
|
|
460
|
+
* Keep remote server URLs in trusted MCP or CI configuration where possible.
|
|
461
|
+
* Use `REMOTE_SERVER_URL_ALLOW_REGEX` to restrict the permitted Appium server URLs when the execution environment requires an explicit destination policy.
|
|
462
|
+
|
|
463
|
+
When `REMOTE_SERVER_URL_ALLOW_REGEX` is not set, MCP Appium accepts any syntactically valid HTTP or HTTPS destination. The variable is a regular-expression check against the complete `remoteServerUrl` value.
|
|
464
|
+
|
|
465
|
+
For example, to permit only a specific Appium server:
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
REMOTE_SERVER_URL_ALLOW_REGEX='^https://appium\.example\.com:4723(?:/wd/hub)?/?$'
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
To permit Appium servers under a controlled internal domain:
|
|
472
|
+
|
|
473
|
+
```bash
|
|
474
|
+
REMOTE_SERVER_URL_ALLOW_REGEX='^https://[a-z0-9-]+\.appium\.example\.internal(?::[0-9]+)?(?:/.*)?$'
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
Treat this setting as an additional deployment safeguard. Network-level controls, CI isolation, and trusted MCP client configuration should remain the primary security boundaries.
|
|
478
|
+
|
|
479
|
+
|
|
424
480
|
## 🔌 Plugin API
|
|
425
481
|
|
|
426
482
|
Use `appium-mcp/core` to compose the default Appium MCP server with custom business logic without maintaining a fork. Plugins can register MCP tools, prompts, resources, and resource templates, and can wrap tool execution with lifecycle hooks. Call hooks are tool-only: prompts, resources, and resource templates are registered with FastMCP but are not wrapped by `beforeCall` or `afterCall`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAKhC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAgB,KAAK,eAAe,EAAC,MAAM,aAAa,CAAC;AA0BhE,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAE5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IAEhD;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAQD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAKhC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAgB,KAAK,eAAe,EAAC,MAAM,aAAa,CAAC;AA0BhE,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAE5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IAEhD;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAQD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,OAAO,CAAC,OAAO,CAAC,CAsKxG"}
|
package/dist/create-server.js
CHANGED
|
@@ -172,8 +172,7 @@ export async function createAppiumMcpServer(options = {}) {
|
|
|
172
172
|
const policy = disconnectSessionPolicyFromEnv();
|
|
173
173
|
const ownedSessions = listSessions().filter((session) => session.ownership === 'owned');
|
|
174
174
|
if (ownedSessions.length > 0 && policy === 'skip') {
|
|
175
|
-
log.info(`${ownedSessions.length} owned session(s) retained after MCP disconnect
|
|
176
|
-
'(APPIUM_MCP_ON_CLIENT_DISCONNECT=skip).');
|
|
175
|
+
log.info(`${ownedSessions.length} owned session(s) retained after MCP disconnect (APPIUM_MCP_ON_CLIENT_DISCONNECT=skip).`);
|
|
177
176
|
}
|
|
178
177
|
else if (ownedSessions.length > 0) {
|
|
179
178
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAEhC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AACtD,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAC,aAAa,EAAuB,MAAM,aAAa,CAAC;AAChE,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAC,qBAAqB,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,wBAAwB,EAAC,MAAM,+BAA+B,CAAC;AACvE,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAE7C,MAAM,cAAc,GAAG,GAAG,CAAC,OAA0C,CAAC;AAEtE,MAAM,mBAAmB,GAAG;IAC1B,yEAAyE;IACzE,6LAA6L;IAC7L,+JAA+J;IAC/J,8GAA8G;IAC9G,oJAAoJ;IACpJ,iGAAiG;CAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACjD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACjD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChD,CAAC;AAsCF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IACpF,MAAM,EACJ,OAAO,GAAG,EAAE,EACZ,UAAU,GAAG,YAAY,EACzB,aAAa,GAAG,cAAc,EAC9B,sBAAsB,EACtB,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,sBAAsB;QACzC,CAAC,CAAC,GAAG,mBAAmB,KAAK,sBAAsB,EAAE;QACrD,CAAC,CAAC,mBAAmB,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,YAAY;QACZ,MAAM,EAAE,eAAe;QACvB,+EAA+E;QAC/E,KAAK,EAAE;YACL,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,uBAAuB,EAAE,CAAC;QAChC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,sEAAsE,EAAE,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED,4EAA4E;IAC5E,8EAA8E;IAC9E,6DAA6D;IAC7D,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,4EAA4E;IAC5E,uDAAuD;IACvD,4EAA4E;IAC5E,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,4EAA4E;IAC5E,6EAA6E;IAC7E,sEAAsE;IACtE,4EAA4E;IAC5E,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAErC,4EAA4E;IAC5E,4EAA4E;IAC5E,yDAAyD;IACzD,4EAA4E;IAC5E,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,gFAAgF;IAChF,uDAAuD;IACvD,IAAI,uBAAuB,GAAyB,IAAI,CAAC;IACzD,IAAI,oBAAoB,GAAyB,IAAI,CAAC;IAEtD;;;;;OAKG;IACH,MAAM,wBAAwB,GAAG,KAAK,IAAmB,EAAE;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,oBAAoB,CAAC;QAC7B,CAAC;QAED,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,uBAAuB,KAAK,CAAC,KAAK,IAAI,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC3B,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;oBAAS,CAAC;gBACT,uBAAuB,GAAG,IAAI,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,uBAAuB,CAAC;IAChC,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;QACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,uBAAuB,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,uBAAuB,CAAC;QAChC,CAAC;QAED,IAAI,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,oBAAoB,KAAK,CAAC,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,iBAAiB,GAAG,KAAK,CAAC;YAC5B,CAAC;oBAAS,CAAC;gBACT,oBAAoB,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,oBAAoB,CAAC;IAC7B,CAAC,CAAC;IAEF,4EAA4E;IAC5E,iDAAiD;IACjD,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7C,iBAAiB,IAAI,CAAC,CAAC;QAEvB,kDAAkD;QAClD,MAAM,wBAAwB,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACtC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAEvD,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,8BAA8B,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;QAExF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,CACN,GAAG,aAAa,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAMpD"}
|
package/dist/resources/index.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import log from '../logger.js';
|
|
2
|
+
import { isMcpAppsEnabled } from '../ui/mcp-apps.js';
|
|
2
3
|
// Export all resources
|
|
3
4
|
import javaTemplatesResource from './java/template.js';
|
|
5
|
+
import pageSourceInspectorResource from './page-source-inspector.js';
|
|
4
6
|
export default function registerResources(server) {
|
|
5
7
|
javaTemplatesResource(server);
|
|
8
|
+
if (isMcpAppsEnabled()) {
|
|
9
|
+
pageSourceInspectorResource(server);
|
|
10
|
+
}
|
|
6
11
|
log.info('All resources registered');
|
|
7
12
|
}
|
|
8
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,uBAAuB;AACvB,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACnD,uBAAuB;AACvB,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AACvD,OAAO,2BAA2B,MAAM,4BAA4B,CAAC;AAErE,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAW;IACnD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-source-inspector.d.ts","sourceRoot":"","sources":["../../src/resources/page-source-inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAKrC,eAAO,MAAM,yBAAyB,0CAA0C,CAAC;AAEjF,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAUzE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MCP_APP_MIME_TYPE } from '../ui/mcp-apps.js';
|
|
2
|
+
import { createPageSourceInspectorAppUI } from '../ui/page-source-inspector-app.js';
|
|
3
|
+
export const PAGE_SOURCE_INSPECTOR_URI = 'ui://appium-mcp/page-source-inspector';
|
|
4
|
+
export default function pageSourceInspectorResource(server) {
|
|
5
|
+
server.addResource({
|
|
6
|
+
uri: PAGE_SOURCE_INSPECTOR_URI,
|
|
7
|
+
name: 'Appium Page Source Inspector',
|
|
8
|
+
description: 'Interactive inspector for appium_get_page_source results',
|
|
9
|
+
mimeType: MCP_APP_MIME_TYPE,
|
|
10
|
+
async load() {
|
|
11
|
+
return { text: createPageSourceInspectorAppUI() };
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=page-source-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-source-inspector.js","sourceRoot":"","sources":["../../src/resources/page-source-inspector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAC,8BAA8B,EAAC,MAAM,oCAAoC,CAAC;AAElF,MAAM,CAAC,MAAM,yBAAyB,GAAG,uCAAuC,CAAC;AAEjF,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,MAAe;IACjE,MAAM,CAAC,WAAW,CAAC;QACjB,GAAG,EAAE,yBAAyB;QAC9B,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,0DAA0D;QACvE,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,CAAC,IAAI;YACR,OAAO,EAAC,IAAI,EAAE,8BAA8B,EAAE,EAAC,CAAC;QAClD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -8,10 +8,10 @@ export type ScrollDistancePreset = (typeof SCROLL_DISTANCE_PRESETS)[number];
|
|
|
8
8
|
export declare const LOCATOR_STRATEGIES: readonly ["accessibility id", "id", "-ios predicate string", "-ios class chain", "-android uiautomator", "xpath", "name", "class name", "css selector"];
|
|
9
9
|
export declare const gestureSchema: z.ZodObject<{
|
|
10
10
|
action: z.ZodEnum<{
|
|
11
|
-
scroll: "scroll";
|
|
12
11
|
tap: "tap";
|
|
13
12
|
double_tap: "double_tap";
|
|
14
13
|
long_press: "long_press";
|
|
14
|
+
scroll: "scroll";
|
|
15
15
|
swipe: "swipe";
|
|
16
16
|
pinch_zoom: "pinch_zoom";
|
|
17
17
|
scroll_to_element: "scroll_to_element";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-page-source.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-page-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"get-page-source.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-page-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AASpD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA+C3D"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { getPageSource as _getPageSource } from '../../command.js';
|
|
3
|
+
import { PAGE_SOURCE_INSPECTOR_URI } from '../../resources/page-source-inspector.js';
|
|
4
|
+
import { clientSupportsMcpApps, isMcpAppsEnabled } from '../../ui/mcp-apps.js';
|
|
3
5
|
import { createUIResource, createPageSourceInspectorUI, addUIResourceToResponse } from '../../ui/mcp-ui-utils.js';
|
|
4
6
|
import { resolveDriver, textResult, errorResult, toolErrorMessage } from '../tool-response.js';
|
|
5
7
|
export default function getPageSource(server) {
|
|
8
|
+
const mcpAppsEnabled = isMcpAppsEnabled();
|
|
6
9
|
const pageSourceSchema = z.object({
|
|
7
10
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
8
11
|
});
|
|
9
12
|
server.addTool({
|
|
10
13
|
name: 'appium_get_page_source',
|
|
11
14
|
description: 'Get the page source (XML) from the current screen',
|
|
15
|
+
_meta: mcpAppsEnabled ? { ui: { resourceUri: PAGE_SOURCE_INSPECTOR_URI } } : undefined,
|
|
12
16
|
parameters: pageSourceSchema,
|
|
13
17
|
annotations: {
|
|
14
18
|
readOnlyHint: true,
|
|
15
19
|
openWorldHint: false,
|
|
16
20
|
},
|
|
17
|
-
execute: async (args,
|
|
21
|
+
execute: async (args, context) => {
|
|
18
22
|
const resolved = await resolveDriver(args.sessionId);
|
|
19
23
|
if (!resolved.ok) {
|
|
20
24
|
return resolved.result;
|
|
@@ -26,8 +30,13 @@ export default function getPageSource(server) {
|
|
|
26
30
|
return errorResult('Page source is empty or null');
|
|
27
31
|
}
|
|
28
32
|
const textResponse = textResult('Page source retrieved successfully: \n' + '```xml ' + pageSource + '```');
|
|
33
|
+
// MCP Apps-capable clients fetch the static inspector once and pass
|
|
34
|
+
// this existing text result to it, avoiding a second copy of the XML.
|
|
35
|
+
if (mcpAppsEnabled && clientSupportsMcpApps(server, context)) {
|
|
36
|
+
return textResponse;
|
|
37
|
+
}
|
|
29
38
|
// Add interactive page source inspector UI
|
|
30
|
-
return addUIResourceToResponse(textResponse, () => createUIResource(
|
|
39
|
+
return addUIResourceToResponse(textResponse, () => createUIResource(`${PAGE_SOURCE_INSPECTOR_URI}/${Date.now()}`, createPageSourceInspectorUI(pageSource)));
|
|
31
40
|
}
|
|
32
41
|
catch (err) {
|
|
33
42
|
return errorResult(`Failed to get page source. Error: ${toolErrorMessage(err)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-page-source.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-page-source.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,aAAa,IAAI,cAAc,EAAC,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAC,gBAAgB,EAAE,2BAA2B,EAAE,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAE7F,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAe;IACnD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;KACxG,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,mDAAmD;QAChE,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAsC,EACtC,
|
|
1
|
+
{"version":3,"file":"get-page-source.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-page-source.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,aAAa,IAAI,cAAc,EAAC,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAC,yBAAyB,EAAC,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAC,qBAAqB,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAE,2BAA2B,EAAE,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAE7F,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAe;IACnD,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;IAC1C,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;KACxG,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,mDAAmD;QAChE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,EAAC,WAAW,EAAE,yBAAyB,EAAC,EAAC,CAAC,CAAC,CAAC,SAAS;QAClF,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAsC,EACtC,OAA4C,EACpB,EAAE;YAC1B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAC,MAAM,EAAC,GAAG,QAAQ,CAAC;YAE1B,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,WAAW,CAAC,8BAA8B,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,YAAY,GAAG,UAAU,CAAC,wCAAwC,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC;gBAE3G,oEAAoE;gBACpE,sEAAsE;gBACtE,IAAI,cAAc,IAAI,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC7D,OAAO,YAAY,CAAC;gBACtB,CAAC;gBAED,2CAA2C;gBAC3C,OAAO,uBAAuB,CAAC,YAAY,EAAE,GAAG,EAAE,CAChD,gBAAgB,CAAC,GAAG,yBAAyB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC,CACxG,CAAC;YACJ,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAAC,qCAAqC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-ios-real-device.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"prepare-ios-real-device.d.ts","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AA8YpD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2DlE"}
|
|
@@ -83,8 +83,7 @@ async function downloadWdaApp(version, downloadDir) {
|
|
|
83
83
|
}
|
|
84
84
|
const appPath = path.join(downloadDir, 'WebDriverAgentRunner-Runner.app');
|
|
85
85
|
if (!(await fileExists(appPath))) {
|
|
86
|
-
throw new Error(`WebDriverAgentRunner-Runner.app not found after extracting ${url}.
|
|
87
|
-
`The release asset format may have changed.`);
|
|
86
|
+
throw new Error(`WebDriverAgentRunner-Runner.app not found after extracting ${url}. The release asset format may have changed.`);
|
|
88
87
|
}
|
|
89
88
|
return appPath;
|
|
90
89
|
}
|
|
@@ -176,8 +175,7 @@ async function runPipeline(inputs) {
|
|
|
176
175
|
if (!match) {
|
|
177
176
|
result.validate_device = {
|
|
178
177
|
status: 'failed',
|
|
179
|
-
detail: `No connected real iOS device with UDID "${inputs.udid}".
|
|
180
|
-
`Connect the device, trust the host, and try again.`,
|
|
178
|
+
detail: `No connected real iOS device with UDID "${inputs.udid}". Connect the device, trust the host, and try again.`,
|
|
181
179
|
};
|
|
182
180
|
return result;
|
|
183
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-ios-real-device.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prepare-ios-real-device.js","sourceRoot":"","sources":["../../../src/tools/ios/prepare-ios-real-device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { FastMCP } from 'fastmcp';
|
|
2
|
+
export declare const MCP_APPS_EXTENSION_ID = "io.modelcontextprotocol/ui";
|
|
3
|
+
export declare const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app";
|
|
4
|
+
export declare function isUIEnabled(): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* MCP Apps are enabled by default when UI is enabled. Set
|
|
7
|
+
* APPIUM_MCP_APPS_ENABLED=false or 0 to force the embedded UI compatibility
|
|
8
|
+
* path for clients whose MCP Apps renderer is unreliable.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isMcpAppsEnabled(): boolean;
|
|
11
|
+
export declare function supportsMcpAppsCapability(capabilities: unknown): boolean;
|
|
12
|
+
export declare function clientSupportsMcpApps(server: Pick<FastMCP, 'sessions'>, context: {
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
} | undefined): boolean;
|
|
15
|
+
//# sourceMappingURL=mcp-apps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-apps.d.ts","sourceRoot":"","sources":["../../src/ui/mcp-apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,qBAAqB,+BAA+B,CAAC;AAClE,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAiBxE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EACjC,OAAO,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,GACxC,OAAO,CAST"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const MCP_APPS_EXTENSION_ID = 'io.modelcontextprotocol/ui';
|
|
2
|
+
export const MCP_APP_MIME_TYPE = 'text/html;profile=mcp-app';
|
|
3
|
+
export function isUIEnabled() {
|
|
4
|
+
return process.env.NO_UI !== 'true' && process.env.NO_UI !== '1';
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* MCP Apps are enabled by default when UI is enabled. Set
|
|
8
|
+
* APPIUM_MCP_APPS_ENABLED=false or 0 to force the embedded UI compatibility
|
|
9
|
+
* path for clients whose MCP Apps renderer is unreliable.
|
|
10
|
+
*/
|
|
11
|
+
export function isMcpAppsEnabled() {
|
|
12
|
+
const configuredValue = process.env.APPIUM_MCP_APPS_ENABLED;
|
|
13
|
+
return isUIEnabled() && configuredValue !== 'false' && configuredValue !== '0';
|
|
14
|
+
}
|
|
15
|
+
export function supportsMcpAppsCapability(capabilities) {
|
|
16
|
+
if (!isRecord(capabilities) || !isRecord(capabilities.extensions)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const uiCapability = capabilities.extensions[MCP_APPS_EXTENSION_ID];
|
|
20
|
+
if (!isRecord(uiCapability) || !Array.isArray(uiCapability.mimeTypes)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return uiCapability.mimeTypes.some((mimeType) => {
|
|
24
|
+
if (typeof mimeType !== 'string') {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return normalizeMimeType(mimeType) === MCP_APP_MIME_TYPE;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function clientSupportsMcpApps(server, context) {
|
|
31
|
+
const session = context?.sessionId !== undefined
|
|
32
|
+
? server.sessions.find((candidate) => candidate.sessionId === context.sessionId)
|
|
33
|
+
: server.sessions.length === 1
|
|
34
|
+
? server.sessions[0]
|
|
35
|
+
: undefined;
|
|
36
|
+
return supportsMcpAppsCapability(session?.clientCapabilities);
|
|
37
|
+
}
|
|
38
|
+
function isRecord(value) {
|
|
39
|
+
return typeof value === 'object' && value !== null;
|
|
40
|
+
}
|
|
41
|
+
function normalizeMimeType(mimeType) {
|
|
42
|
+
return mimeType.replace(/[\s"]/g, '').toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mcp-apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-apps.js","sourceRoot":"","sources":["../../src/ui/mcp-apps.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAE7D,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC5D,OAAO,WAAW,EAAE,IAAI,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,GAAG,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,YAAqB;IAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,iBAAiB,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAiC,EACjC,OAAyC;IAEzC,MAAM,OAAO,GACX,OAAO,EAAE,SAAS,KAAK,SAAS;QAC9B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC;QAChF,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpB,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static MCP App used by appium_get_page_source.
|
|
3
|
+
*
|
|
4
|
+
* The page source is read from the tool's existing text result, so it is sent
|
|
5
|
+
* to the client only once instead of being duplicated inside inline HTML.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createPageSourceInspectorAppUI(): string;
|
|
8
|
+
//# sourceMappingURL=page-source-inspector-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-source-inspector-app.d.ts","sourceRoot":"","sources":["../../src/ui/page-source-inspector-app.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAkPvD"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static MCP App used by appium_get_page_source.
|
|
3
|
+
*
|
|
4
|
+
* The page source is read from the tool's existing text result, so it is sent
|
|
5
|
+
* to the client only once instead of being duplicated inside inline HTML.
|
|
6
|
+
*/
|
|
7
|
+
export function createPageSourceInspectorAppUI() {
|
|
8
|
+
return `
|
|
9
|
+
<!DOCTYPE html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8">
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
14
|
+
<title>Page Source Inspector</title>
|
|
15
|
+
<style>
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
body {
|
|
18
|
+
margin: 0;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
background: #1e1e1e;
|
|
21
|
+
color: #d4d4d4;
|
|
22
|
+
font-family: Monaco, Menlo, "Courier New", monospace;
|
|
23
|
+
}
|
|
24
|
+
.toolbar {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
gap: 12px;
|
|
29
|
+
padding: 12px 16px;
|
|
30
|
+
border-bottom: 1px solid #3e3e3e;
|
|
31
|
+
background: #2d2d2d;
|
|
32
|
+
}
|
|
33
|
+
.toolbar-left, .toolbar-right {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
gap: 8px;
|
|
37
|
+
}
|
|
38
|
+
.title { font-size: 14px; font-weight: 500; }
|
|
39
|
+
.info { color: #999; font-size: 12px; }
|
|
40
|
+
.btn {
|
|
41
|
+
padding: 6px 12px;
|
|
42
|
+
border: 0;
|
|
43
|
+
border-radius: 4px;
|
|
44
|
+
background: #007aff;
|
|
45
|
+
color: #fff;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
font: 13px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
48
|
+
}
|
|
49
|
+
.btn:hover { background: #0056b3; }
|
|
50
|
+
.btn-secondary { background: #444; }
|
|
51
|
+
.btn-secondary:hover { background: #555; }
|
|
52
|
+
.search-box {
|
|
53
|
+
width: 200px;
|
|
54
|
+
padding: 6px 12px;
|
|
55
|
+
border: 1px solid #555;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
outline: none;
|
|
58
|
+
background: #3e3e3e;
|
|
59
|
+
color: #d4d4d4;
|
|
60
|
+
font-size: 13px;
|
|
61
|
+
}
|
|
62
|
+
.search-box:focus { border-color: #007aff; }
|
|
63
|
+
.viewer {
|
|
64
|
+
height: calc(100vh - 50px);
|
|
65
|
+
overflow: auto;
|
|
66
|
+
padding: 16px;
|
|
67
|
+
}
|
|
68
|
+
.xml-content {
|
|
69
|
+
margin: 0;
|
|
70
|
+
white-space: pre;
|
|
71
|
+
color: #d4d4d4;
|
|
72
|
+
font-size: 13px;
|
|
73
|
+
line-height: 1.6;
|
|
74
|
+
}
|
|
75
|
+
mark {
|
|
76
|
+
border-radius: 2px;
|
|
77
|
+
background: #ffd54f;
|
|
78
|
+
color: #1e1e1e;
|
|
79
|
+
}
|
|
80
|
+
.empty {
|
|
81
|
+
color: #999;
|
|
82
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
85
|
+
</head>
|
|
86
|
+
<body>
|
|
87
|
+
<div class="toolbar">
|
|
88
|
+
<div class="toolbar-left">
|
|
89
|
+
<span class="title">📄 Page Source Inspector</span>
|
|
90
|
+
<span class="info" id="sourceInfo">Waiting for page source…</span>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="toolbar-right">
|
|
93
|
+
<input type="text" class="search-box" id="searchBox" placeholder="Search…">
|
|
94
|
+
<button class="btn btn-secondary" id="copyButton">Copy</button>
|
|
95
|
+
<button class="btn btn-secondary" id="formatButton">Format</button>
|
|
96
|
+
<button class="btn" id="generateButton">Generate Locators</button>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="viewer">
|
|
100
|
+
<pre class="xml-content empty" id="xmlContent">Waiting for page source…</pre>
|
|
101
|
+
</div>
|
|
102
|
+
<script>
|
|
103
|
+
(() => {
|
|
104
|
+
const PAGE_SOURCE_PREFIX = 'Page source retrieved successfully: \\n\\\`\\\`\\\`xml ';
|
|
105
|
+
const xmlContent = document.getElementById('xmlContent');
|
|
106
|
+
const sourceInfo = document.getElementById('sourceInfo');
|
|
107
|
+
const searchBox = document.getElementById('searchBox');
|
|
108
|
+
let source = '';
|
|
109
|
+
let nextRequestId = 1;
|
|
110
|
+
const pendingRequests = new Map();
|
|
111
|
+
|
|
112
|
+
function sendRequest(method, params) {
|
|
113
|
+
const id = nextRequestId++;
|
|
114
|
+
window.parent.postMessage({jsonrpc: '2.0', id, method, params}, '*');
|
|
115
|
+
return new Promise((resolve, reject) => pendingRequests.set(id, {resolve, reject}));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function sendNotification(method, params) {
|
|
119
|
+
window.parent.postMessage({jsonrpc: '2.0', method, params}, '*');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function sourceFromToolResult(result) {
|
|
123
|
+
const textBlock = result && Array.isArray(result.content)
|
|
124
|
+
? result.content.find((item) => item && item.type === 'text' && typeof item.text === 'string')
|
|
125
|
+
: undefined;
|
|
126
|
+
if (!textBlock) {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let text = textBlock.text;
|
|
131
|
+
if (text.startsWith(PAGE_SOURCE_PREFIX) && text.endsWith('\`\`\`')) {
|
|
132
|
+
text = text.slice(PAGE_SOURCE_PREFIX.length, -3);
|
|
133
|
+
}
|
|
134
|
+
return text;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function appendHighlightedText(container, text, query) {
|
|
138
|
+
const lowerText = text.toLowerCase();
|
|
139
|
+
const lowerQuery = query.toLowerCase();
|
|
140
|
+
let position = 0;
|
|
141
|
+
|
|
142
|
+
while (position < text.length) {
|
|
143
|
+
const matchIndex = lowerText.indexOf(lowerQuery, position);
|
|
144
|
+
if (matchIndex === -1) {
|
|
145
|
+
container.appendChild(document.createTextNode(text.slice(position)));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (matchIndex > position) {
|
|
149
|
+
container.appendChild(document.createTextNode(text.slice(position, matchIndex)));
|
|
150
|
+
}
|
|
151
|
+
const mark = document.createElement('mark');
|
|
152
|
+
mark.textContent = text.slice(matchIndex, matchIndex + query.length);
|
|
153
|
+
container.appendChild(mark);
|
|
154
|
+
position = matchIndex + query.length;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function renderSource() {
|
|
159
|
+
const query = searchBox.value.trim();
|
|
160
|
+
xmlContent.textContent = '';
|
|
161
|
+
xmlContent.classList.toggle('empty', source.length === 0);
|
|
162
|
+
if (!source) {
|
|
163
|
+
xmlContent.textContent = 'No page source was returned.';
|
|
164
|
+
} else if (!query) {
|
|
165
|
+
xmlContent.textContent = source;
|
|
166
|
+
} else {
|
|
167
|
+
appendHighlightedText(xmlContent, source, query);
|
|
168
|
+
}
|
|
169
|
+
sourceInfo.textContent = source.length + ' characters';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function setSource(nextSource) {
|
|
173
|
+
source = nextSource;
|
|
174
|
+
renderSource();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function formatXML() {
|
|
178
|
+
if (!source) return;
|
|
179
|
+
try {
|
|
180
|
+
const parser = new DOMParser();
|
|
181
|
+
const documentNode = parser.parseFromString(source, 'text/xml');
|
|
182
|
+
if (documentNode.querySelector('parsererror')) {
|
|
183
|
+
throw new Error('Invalid XML');
|
|
184
|
+
}
|
|
185
|
+
source = new XMLSerializer().serializeToString(documentNode);
|
|
186
|
+
renderSource();
|
|
187
|
+
} catch {
|
|
188
|
+
window.alert('Failed to format XML');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function copyToClipboard() {
|
|
193
|
+
if (!source) return;
|
|
194
|
+
try {
|
|
195
|
+
await navigator.clipboard.writeText(source);
|
|
196
|
+
} catch {
|
|
197
|
+
window.alert('Failed to copy page source');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function generateLocators() {
|
|
202
|
+
try {
|
|
203
|
+
await sendRequest('tools/call', {name: 'generate_locators', arguments: {}});
|
|
204
|
+
} catch {
|
|
205
|
+
window.alert('Failed to generate locators');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
window.addEventListener('message', (event) => {
|
|
210
|
+
if (event.source !== window.parent) return;
|
|
211
|
+
const message = event.data;
|
|
212
|
+
if (!message || message.jsonrpc !== '2.0') return;
|
|
213
|
+
|
|
214
|
+
if (message.id !== undefined && pendingRequests.has(message.id)) {
|
|
215
|
+
const pending = pendingRequests.get(message.id);
|
|
216
|
+
pendingRequests.delete(message.id);
|
|
217
|
+
if (message.error) {
|
|
218
|
+
pending.reject(new Error(message.error.message || 'MCP App request failed'));
|
|
219
|
+
} else {
|
|
220
|
+
pending.resolve(message.result);
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (message.method === 'ui/notifications/tool-result') {
|
|
226
|
+
setSource(sourceFromToolResult(message.params));
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
searchBox.addEventListener('input', renderSource);
|
|
231
|
+
document.getElementById('copyButton').addEventListener('click', copyToClipboard);
|
|
232
|
+
document.getElementById('formatButton').addEventListener('click', formatXML);
|
|
233
|
+
document.getElementById('generateButton').addEventListener('click', generateLocators);
|
|
234
|
+
|
|
235
|
+
sendRequest('ui/initialize', {
|
|
236
|
+
protocolVersion: '2026-01-26',
|
|
237
|
+
appInfo: {name: 'Appium Page Source Inspector', version: '1.0.0'},
|
|
238
|
+
appCapabilities: {availableDisplayModes: ['inline', 'fullscreen']},
|
|
239
|
+
})
|
|
240
|
+
.then(() => sendNotification('ui/notifications/initialized', {}))
|
|
241
|
+
.catch(() => {
|
|
242
|
+
sourceInfo.textContent = 'Unable to initialize inspector';
|
|
243
|
+
});
|
|
244
|
+
})();
|
|
245
|
+
</script>
|
|
246
|
+
</body>
|
|
247
|
+
</html>
|
|
248
|
+
`;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=page-source-inspector-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-source-inspector-app.js","sourceRoot":"","sources":["../../src/ui/page-source-inspector-app.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgPN,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.90.1",
|
|
4
4
|
"description": "Intelligent MCP server providing AI assistants with powerful tools and resources for Appium mobile automation",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/appium/appium-mcp/issues"
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"fastmcp": "^4.0.0",
|
|
80
80
|
"ios-mobileprovision-finder": "^1.2.1",
|
|
81
81
|
"lru-cache": "^11.5.0",
|
|
82
|
-
"node-simctl": "^
|
|
82
|
+
"node-simctl": "^9.1.0",
|
|
83
83
|
"webdriver": "^9.30.0",
|
|
84
84
|
"xpath": "^0.0.34",
|
|
85
85
|
"zod": "^4.3.6"
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"devDependencies": {
|
|
88
88
|
"@appium/oxc-config": "^1.1.0",
|
|
89
89
|
"@appium/semantic-release-config": "^1.1.0",
|
|
90
|
-
"@appium/tsconfig": "^1.
|
|
90
|
+
"@appium/tsconfig": "^1.2.0",
|
|
91
91
|
"@jest/globals": "^30.2.0",
|
|
92
92
|
"@types/jest": "^30.0.0",
|
|
93
93
|
"@types/node": "^26.0.0",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"prettier": "^3.5.3",
|
|
98
98
|
"rimraf": "^6.0.1",
|
|
99
99
|
"ts-node": "^10.9.2",
|
|
100
|
-
"typescript": "^6.0.
|
|
100
|
+
"typescript": "^6.0.3"
|
|
101
101
|
},
|
|
102
102
|
"peerDependencies": {
|
|
103
103
|
"@appium/mcp-documentation": "^1.0.1"
|
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.90.1",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.
|
|
11
|
+
"version": "1.90.1",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
package/src/create-server.ts
CHANGED
|
@@ -244,8 +244,7 @@ export async function createAppiumMcpServer(options: CreateAppiumMcpServerOption
|
|
|
244
244
|
|
|
245
245
|
if (ownedSessions.length > 0 && policy === 'skip') {
|
|
246
246
|
log.info(
|
|
247
|
-
`${ownedSessions.length} owned session(s) retained after MCP disconnect
|
|
248
|
-
'(APPIUM_MCP_ON_CLIENT_DISCONNECT=skip).',
|
|
247
|
+
`${ownedSessions.length} owned session(s) retained after MCP disconnect (APPIUM_MCP_ON_CLIENT_DISCONNECT=skip).`,
|
|
249
248
|
);
|
|
250
249
|
} else if (ownedSessions.length > 0) {
|
|
251
250
|
try {
|
package/src/resources/index.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import log from '../logger.js';
|
|
2
|
+
import {isMcpAppsEnabled} from '../ui/mcp-apps.js';
|
|
2
3
|
// Export all resources
|
|
3
4
|
import javaTemplatesResource from './java/template.js';
|
|
5
|
+
import pageSourceInspectorResource from './page-source-inspector.js';
|
|
4
6
|
|
|
5
7
|
export default function registerResources(server: any) {
|
|
6
8
|
javaTemplatesResource(server);
|
|
9
|
+
if (isMcpAppsEnabled()) {
|
|
10
|
+
pageSourceInspectorResource(server);
|
|
11
|
+
}
|
|
7
12
|
log.info('All resources registered');
|
|
8
13
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type {FastMCP} from 'fastmcp';
|
|
2
|
+
|
|
3
|
+
import {MCP_APP_MIME_TYPE} from '../ui/mcp-apps.js';
|
|
4
|
+
import {createPageSourceInspectorAppUI} from '../ui/page-source-inspector-app.js';
|
|
5
|
+
|
|
6
|
+
export const PAGE_SOURCE_INSPECTOR_URI = 'ui://appium-mcp/page-source-inspector';
|
|
7
|
+
|
|
8
|
+
export default function pageSourceInspectorResource(server: FastMCP): void {
|
|
9
|
+
server.addResource({
|
|
10
|
+
uri: PAGE_SOURCE_INSPECTOR_URI,
|
|
11
|
+
name: 'Appium Page Source Inspector',
|
|
12
|
+
description: 'Interactive inspector for appium_get_page_source results',
|
|
13
|
+
mimeType: MCP_APP_MIME_TYPE,
|
|
14
|
+
async load() {
|
|
15
|
+
return {text: createPageSourceInspectorAppUI()};
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -2,16 +2,20 @@ import type {ContentResult, FastMCP} from 'fastmcp';
|
|
|
2
2
|
import {z} from 'zod';
|
|
3
3
|
|
|
4
4
|
import {getPageSource as _getPageSource} from '../../command.js';
|
|
5
|
+
import {PAGE_SOURCE_INSPECTOR_URI} from '../../resources/page-source-inspector.js';
|
|
6
|
+
import {clientSupportsMcpApps, isMcpAppsEnabled} from '../../ui/mcp-apps.js';
|
|
5
7
|
import {createUIResource, createPageSourceInspectorUI, addUIResourceToResponse} from '../../ui/mcp-ui-utils.js';
|
|
6
8
|
import {resolveDriver, textResult, errorResult, toolErrorMessage} from '../tool-response.js';
|
|
7
9
|
|
|
8
10
|
export default function getPageSource(server: FastMCP): void {
|
|
11
|
+
const mcpAppsEnabled = isMcpAppsEnabled();
|
|
9
12
|
const pageSourceSchema = z.object({
|
|
10
13
|
sessionId: z.string().optional().describe('Session ID to target. If omitted, uses the active session.'),
|
|
11
14
|
});
|
|
12
15
|
server.addTool({
|
|
13
16
|
name: 'appium_get_page_source',
|
|
14
17
|
description: 'Get the page source (XML) from the current screen',
|
|
18
|
+
_meta: mcpAppsEnabled ? {ui: {resourceUri: PAGE_SOURCE_INSPECTOR_URI}} : undefined,
|
|
15
19
|
parameters: pageSourceSchema,
|
|
16
20
|
annotations: {
|
|
17
21
|
readOnlyHint: true,
|
|
@@ -19,7 +23,7 @@ export default function getPageSource(server: FastMCP): void {
|
|
|
19
23
|
},
|
|
20
24
|
execute: async (
|
|
21
25
|
args: z.infer<typeof pageSourceSchema>,
|
|
22
|
-
|
|
26
|
+
context: Record<string, unknown> | undefined,
|
|
23
27
|
): Promise<ContentResult> => {
|
|
24
28
|
const resolved = await resolveDriver(args.sessionId);
|
|
25
29
|
if (!resolved.ok) {
|
|
@@ -35,12 +39,15 @@ export default function getPageSource(server: FastMCP): void {
|
|
|
35
39
|
|
|
36
40
|
const textResponse = textResult('Page source retrieved successfully: \n' + '```xml ' + pageSource + '```');
|
|
37
41
|
|
|
42
|
+
// MCP Apps-capable clients fetch the static inspector once and pass
|
|
43
|
+
// this existing text result to it, avoiding a second copy of the XML.
|
|
44
|
+
if (mcpAppsEnabled && clientSupportsMcpApps(server, context)) {
|
|
45
|
+
return textResponse;
|
|
46
|
+
}
|
|
47
|
+
|
|
38
48
|
// Add interactive page source inspector UI
|
|
39
49
|
return addUIResourceToResponse(textResponse, () =>
|
|
40
|
-
createUIResource(
|
|
41
|
-
`ui://appium-mcp/page-source-inspector/${Date.now()}`,
|
|
42
|
-
createPageSourceInspectorUI(pageSource),
|
|
43
|
-
),
|
|
50
|
+
createUIResource(`${PAGE_SOURCE_INSPECTOR_URI}/${Date.now()}`, createPageSourceInspectorUI(pageSource)),
|
|
44
51
|
);
|
|
45
52
|
} catch (err: unknown) {
|
|
46
53
|
return errorResult(`Failed to get page source. Error: ${toolErrorMessage(err)}`);
|
|
@@ -156,8 +156,7 @@ async function downloadWdaApp(version: string, downloadDir: string): Promise<str
|
|
|
156
156
|
const appPath = path.join(downloadDir, 'WebDriverAgentRunner-Runner.app');
|
|
157
157
|
if (!(await fileExists(appPath))) {
|
|
158
158
|
throw new Error(
|
|
159
|
-
`WebDriverAgentRunner-Runner.app not found after extracting ${url}.
|
|
160
|
-
`The release asset format may have changed.`,
|
|
159
|
+
`WebDriverAgentRunner-Runner.app not found after extracting ${url}. The release asset format may have changed.`,
|
|
161
160
|
);
|
|
162
161
|
}
|
|
163
162
|
return appPath;
|
|
@@ -268,9 +267,7 @@ async function runPipeline(inputs: PipelineInputs): Promise<PrepareRealDeviceRes
|
|
|
268
267
|
if (!match) {
|
|
269
268
|
result.validate_device = {
|
|
270
269
|
status: 'failed',
|
|
271
|
-
detail:
|
|
272
|
-
`No connected real iOS device with UDID "${inputs.udid}". ` +
|
|
273
|
-
`Connect the device, trust the host, and try again.`,
|
|
270
|
+
detail: `No connected real iOS device with UDID "${inputs.udid}". Connect the device, trust the host, and try again.`,
|
|
274
271
|
};
|
|
275
272
|
return result;
|
|
276
273
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type {FastMCP} from 'fastmcp';
|
|
2
|
+
|
|
3
|
+
export const MCP_APPS_EXTENSION_ID = 'io.modelcontextprotocol/ui';
|
|
4
|
+
export const MCP_APP_MIME_TYPE = 'text/html;profile=mcp-app';
|
|
5
|
+
|
|
6
|
+
export function isUIEnabled(): boolean {
|
|
7
|
+
return process.env.NO_UI !== 'true' && process.env.NO_UI !== '1';
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* MCP Apps are enabled by default when UI is enabled. Set
|
|
12
|
+
* APPIUM_MCP_APPS_ENABLED=false or 0 to force the embedded UI compatibility
|
|
13
|
+
* path for clients whose MCP Apps renderer is unreliable.
|
|
14
|
+
*/
|
|
15
|
+
export function isMcpAppsEnabled(): boolean {
|
|
16
|
+
const configuredValue = process.env.APPIUM_MCP_APPS_ENABLED;
|
|
17
|
+
return isUIEnabled() && configuredValue !== 'false' && configuredValue !== '0';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function supportsMcpAppsCapability(capabilities: unknown): boolean {
|
|
21
|
+
if (!isRecord(capabilities) || !isRecord(capabilities.extensions)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const uiCapability = capabilities.extensions[MCP_APPS_EXTENSION_ID];
|
|
26
|
+
if (!isRecord(uiCapability) || !Array.isArray(uiCapability.mimeTypes)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return uiCapability.mimeTypes.some((mimeType) => {
|
|
31
|
+
if (typeof mimeType !== 'string') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return normalizeMimeType(mimeType) === MCP_APP_MIME_TYPE;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function clientSupportsMcpApps(
|
|
40
|
+
server: Pick<FastMCP, 'sessions'>,
|
|
41
|
+
context: {sessionId?: string} | undefined,
|
|
42
|
+
): boolean {
|
|
43
|
+
const session =
|
|
44
|
+
context?.sessionId !== undefined
|
|
45
|
+
? server.sessions.find((candidate) => candidate.sessionId === context.sessionId)
|
|
46
|
+
: server.sessions.length === 1
|
|
47
|
+
? server.sessions[0]
|
|
48
|
+
: undefined;
|
|
49
|
+
|
|
50
|
+
return supportsMcpAppsCapability(session?.clientCapabilities);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
54
|
+
return typeof value === 'object' && value !== null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function normalizeMimeType(mimeType: string): string {
|
|
58
|
+
return mimeType.replace(/[\s"]/g, '').toLowerCase();
|
|
59
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static MCP App used by appium_get_page_source.
|
|
3
|
+
*
|
|
4
|
+
* The page source is read from the tool's existing text result, so it is sent
|
|
5
|
+
* to the client only once instead of being duplicated inside inline HTML.
|
|
6
|
+
*/
|
|
7
|
+
export function createPageSourceInspectorAppUI(): string {
|
|
8
|
+
return `
|
|
9
|
+
<!DOCTYPE html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8">
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
14
|
+
<title>Page Source Inspector</title>
|
|
15
|
+
<style>
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
body {
|
|
18
|
+
margin: 0;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
background: #1e1e1e;
|
|
21
|
+
color: #d4d4d4;
|
|
22
|
+
font-family: Monaco, Menlo, "Courier New", monospace;
|
|
23
|
+
}
|
|
24
|
+
.toolbar {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
gap: 12px;
|
|
29
|
+
padding: 12px 16px;
|
|
30
|
+
border-bottom: 1px solid #3e3e3e;
|
|
31
|
+
background: #2d2d2d;
|
|
32
|
+
}
|
|
33
|
+
.toolbar-left, .toolbar-right {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
gap: 8px;
|
|
37
|
+
}
|
|
38
|
+
.title { font-size: 14px; font-weight: 500; }
|
|
39
|
+
.info { color: #999; font-size: 12px; }
|
|
40
|
+
.btn {
|
|
41
|
+
padding: 6px 12px;
|
|
42
|
+
border: 0;
|
|
43
|
+
border-radius: 4px;
|
|
44
|
+
background: #007aff;
|
|
45
|
+
color: #fff;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
font: 13px -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
48
|
+
}
|
|
49
|
+
.btn:hover { background: #0056b3; }
|
|
50
|
+
.btn-secondary { background: #444; }
|
|
51
|
+
.btn-secondary:hover { background: #555; }
|
|
52
|
+
.search-box {
|
|
53
|
+
width: 200px;
|
|
54
|
+
padding: 6px 12px;
|
|
55
|
+
border: 1px solid #555;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
outline: none;
|
|
58
|
+
background: #3e3e3e;
|
|
59
|
+
color: #d4d4d4;
|
|
60
|
+
font-size: 13px;
|
|
61
|
+
}
|
|
62
|
+
.search-box:focus { border-color: #007aff; }
|
|
63
|
+
.viewer {
|
|
64
|
+
height: calc(100vh - 50px);
|
|
65
|
+
overflow: auto;
|
|
66
|
+
padding: 16px;
|
|
67
|
+
}
|
|
68
|
+
.xml-content {
|
|
69
|
+
margin: 0;
|
|
70
|
+
white-space: pre;
|
|
71
|
+
color: #d4d4d4;
|
|
72
|
+
font-size: 13px;
|
|
73
|
+
line-height: 1.6;
|
|
74
|
+
}
|
|
75
|
+
mark {
|
|
76
|
+
border-radius: 2px;
|
|
77
|
+
background: #ffd54f;
|
|
78
|
+
color: #1e1e1e;
|
|
79
|
+
}
|
|
80
|
+
.empty {
|
|
81
|
+
color: #999;
|
|
82
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
85
|
+
</head>
|
|
86
|
+
<body>
|
|
87
|
+
<div class="toolbar">
|
|
88
|
+
<div class="toolbar-left">
|
|
89
|
+
<span class="title">📄 Page Source Inspector</span>
|
|
90
|
+
<span class="info" id="sourceInfo">Waiting for page source…</span>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="toolbar-right">
|
|
93
|
+
<input type="text" class="search-box" id="searchBox" placeholder="Search…">
|
|
94
|
+
<button class="btn btn-secondary" id="copyButton">Copy</button>
|
|
95
|
+
<button class="btn btn-secondary" id="formatButton">Format</button>
|
|
96
|
+
<button class="btn" id="generateButton">Generate Locators</button>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="viewer">
|
|
100
|
+
<pre class="xml-content empty" id="xmlContent">Waiting for page source…</pre>
|
|
101
|
+
</div>
|
|
102
|
+
<script>
|
|
103
|
+
(() => {
|
|
104
|
+
const PAGE_SOURCE_PREFIX = 'Page source retrieved successfully: \\n\\\`\\\`\\\`xml ';
|
|
105
|
+
const xmlContent = document.getElementById('xmlContent');
|
|
106
|
+
const sourceInfo = document.getElementById('sourceInfo');
|
|
107
|
+
const searchBox = document.getElementById('searchBox');
|
|
108
|
+
let source = '';
|
|
109
|
+
let nextRequestId = 1;
|
|
110
|
+
const pendingRequests = new Map();
|
|
111
|
+
|
|
112
|
+
function sendRequest(method, params) {
|
|
113
|
+
const id = nextRequestId++;
|
|
114
|
+
window.parent.postMessage({jsonrpc: '2.0', id, method, params}, '*');
|
|
115
|
+
return new Promise((resolve, reject) => pendingRequests.set(id, {resolve, reject}));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function sendNotification(method, params) {
|
|
119
|
+
window.parent.postMessage({jsonrpc: '2.0', method, params}, '*');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function sourceFromToolResult(result) {
|
|
123
|
+
const textBlock = result && Array.isArray(result.content)
|
|
124
|
+
? result.content.find((item) => item && item.type === 'text' && typeof item.text === 'string')
|
|
125
|
+
: undefined;
|
|
126
|
+
if (!textBlock) {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let text = textBlock.text;
|
|
131
|
+
if (text.startsWith(PAGE_SOURCE_PREFIX) && text.endsWith('\`\`\`')) {
|
|
132
|
+
text = text.slice(PAGE_SOURCE_PREFIX.length, -3);
|
|
133
|
+
}
|
|
134
|
+
return text;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function appendHighlightedText(container, text, query) {
|
|
138
|
+
const lowerText = text.toLowerCase();
|
|
139
|
+
const lowerQuery = query.toLowerCase();
|
|
140
|
+
let position = 0;
|
|
141
|
+
|
|
142
|
+
while (position < text.length) {
|
|
143
|
+
const matchIndex = lowerText.indexOf(lowerQuery, position);
|
|
144
|
+
if (matchIndex === -1) {
|
|
145
|
+
container.appendChild(document.createTextNode(text.slice(position)));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (matchIndex > position) {
|
|
149
|
+
container.appendChild(document.createTextNode(text.slice(position, matchIndex)));
|
|
150
|
+
}
|
|
151
|
+
const mark = document.createElement('mark');
|
|
152
|
+
mark.textContent = text.slice(matchIndex, matchIndex + query.length);
|
|
153
|
+
container.appendChild(mark);
|
|
154
|
+
position = matchIndex + query.length;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function renderSource() {
|
|
159
|
+
const query = searchBox.value.trim();
|
|
160
|
+
xmlContent.textContent = '';
|
|
161
|
+
xmlContent.classList.toggle('empty', source.length === 0);
|
|
162
|
+
if (!source) {
|
|
163
|
+
xmlContent.textContent = 'No page source was returned.';
|
|
164
|
+
} else if (!query) {
|
|
165
|
+
xmlContent.textContent = source;
|
|
166
|
+
} else {
|
|
167
|
+
appendHighlightedText(xmlContent, source, query);
|
|
168
|
+
}
|
|
169
|
+
sourceInfo.textContent = source.length + ' characters';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function setSource(nextSource) {
|
|
173
|
+
source = nextSource;
|
|
174
|
+
renderSource();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function formatXML() {
|
|
178
|
+
if (!source) return;
|
|
179
|
+
try {
|
|
180
|
+
const parser = new DOMParser();
|
|
181
|
+
const documentNode = parser.parseFromString(source, 'text/xml');
|
|
182
|
+
if (documentNode.querySelector('parsererror')) {
|
|
183
|
+
throw new Error('Invalid XML');
|
|
184
|
+
}
|
|
185
|
+
source = new XMLSerializer().serializeToString(documentNode);
|
|
186
|
+
renderSource();
|
|
187
|
+
} catch {
|
|
188
|
+
window.alert('Failed to format XML');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function copyToClipboard() {
|
|
193
|
+
if (!source) return;
|
|
194
|
+
try {
|
|
195
|
+
await navigator.clipboard.writeText(source);
|
|
196
|
+
} catch {
|
|
197
|
+
window.alert('Failed to copy page source');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function generateLocators() {
|
|
202
|
+
try {
|
|
203
|
+
await sendRequest('tools/call', {name: 'generate_locators', arguments: {}});
|
|
204
|
+
} catch {
|
|
205
|
+
window.alert('Failed to generate locators');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
window.addEventListener('message', (event) => {
|
|
210
|
+
if (event.source !== window.parent) return;
|
|
211
|
+
const message = event.data;
|
|
212
|
+
if (!message || message.jsonrpc !== '2.0') return;
|
|
213
|
+
|
|
214
|
+
if (message.id !== undefined && pendingRequests.has(message.id)) {
|
|
215
|
+
const pending = pendingRequests.get(message.id);
|
|
216
|
+
pendingRequests.delete(message.id);
|
|
217
|
+
if (message.error) {
|
|
218
|
+
pending.reject(new Error(message.error.message || 'MCP App request failed'));
|
|
219
|
+
} else {
|
|
220
|
+
pending.resolve(message.result);
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (message.method === 'ui/notifications/tool-result') {
|
|
226
|
+
setSource(sourceFromToolResult(message.params));
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
searchBox.addEventListener('input', renderSource);
|
|
231
|
+
document.getElementById('copyButton').addEventListener('click', copyToClipboard);
|
|
232
|
+
document.getElementById('formatButton').addEventListener('click', formatXML);
|
|
233
|
+
document.getElementById('generateButton').addEventListener('click', generateLocators);
|
|
234
|
+
|
|
235
|
+
sendRequest('ui/initialize', {
|
|
236
|
+
protocolVersion: '2026-01-26',
|
|
237
|
+
appInfo: {name: 'Appium Page Source Inspector', version: '1.0.0'},
|
|
238
|
+
appCapabilities: {availableDisplayModes: ['inline', 'fullscreen']},
|
|
239
|
+
})
|
|
240
|
+
.then(() => sendNotification('ui/notifications/initialized', {}))
|
|
241
|
+
.catch(() => {
|
|
242
|
+
sourceInfo.textContent = 'Unable to initialize inspector';
|
|
243
|
+
});
|
|
244
|
+
})();
|
|
245
|
+
</script>
|
|
246
|
+
</body>
|
|
247
|
+
</html>
|
|
248
|
+
`;
|
|
249
|
+
}
|