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.
Files changed (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +57 -1
  3. package/dist/create-server.d.ts.map +1 -1
  4. package/dist/create-server.js +1 -2
  5. package/dist/create-server.js.map +1 -1
  6. package/dist/resources/index.d.ts.map +1 -1
  7. package/dist/resources/index.js +5 -0
  8. package/dist/resources/index.js.map +1 -1
  9. package/dist/resources/page-source-inspector.d.ts +4 -0
  10. package/dist/resources/page-source-inspector.d.ts.map +1 -0
  11. package/dist/resources/page-source-inspector.js +15 -0
  12. package/dist/resources/page-source-inspector.js.map +1 -0
  13. package/dist/tools/gestures/schema.d.ts +1 -1
  14. package/dist/tools/interactions/get-page-source.d.ts.map +1 -1
  15. package/dist/tools/interactions/get-page-source.js +11 -2
  16. package/dist/tools/interactions/get-page-source.js.map +1 -1
  17. package/dist/tools/ios/prepare-ios-real-device.d.ts.map +1 -1
  18. package/dist/tools/ios/prepare-ios-real-device.js +2 -4
  19. package/dist/tools/ios/prepare-ios-real-device.js.map +1 -1
  20. package/dist/ui/mcp-apps.d.ts +15 -0
  21. package/dist/ui/mcp-apps.d.ts.map +1 -0
  22. package/dist/ui/mcp-apps.js +44 -0
  23. package/dist/ui/mcp-apps.js.map +1 -0
  24. package/dist/ui/page-source-inspector-app.d.ts +8 -0
  25. package/dist/ui/page-source-inspector-app.d.ts.map +1 -0
  26. package/dist/ui/page-source-inspector-app.js +250 -0
  27. package/dist/ui/page-source-inspector-app.js.map +1 -0
  28. package/package.json +4 -4
  29. package/server.json +2 -2
  30. package/src/create-server.ts +1 -2
  31. package/src/resources/index.ts +5 -0
  32. package/src/resources/page-source-inspector.ts +18 -0
  33. package/src/tools/interactions/get-page-source.ts +12 -5
  34. package/src/tools/ios/prepare-ios-real-device.ts +2 -5
  35. package/src/ui/mcp-apps.ts +59 -0
  36. 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
- | `REMOTE_SERVER_URL_ALLOW_REGEX` | Optional | Regex pattern that remote Appium server URLs must match. Defaults to `^https?://` |
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,CAuKxG"}
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"}
@@ -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":"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"}
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":"AAIA,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAGpD"}
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"}
@@ -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;AAEvD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAW;IACnD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AACvC,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,4 @@
1
+ import type { FastMCP } from 'fastmcp';
2
+ export declare const PAGE_SOURCE_INSPECTOR_URI = "ui://appium-mcp/page-source-inspector";
3
+ export default function pageSourceInspectorResource(server: FastMCP): void;
4
+ //# sourceMappingURL=page-source-inspector.d.ts.map
@@ -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;AAOpD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA0C3D"}
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, _context) => {
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(`ui://appium-mcp/page-source-inspector/${Date.now()}`, createPageSourceInspectorUI(pageSource)));
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,QAA6C,EACrB,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,2CAA2C;gBAC3C,OAAO,uBAAuB,CAAC,YAAY,EAAE,GAAG,EAAE,CAChD,gBAAgB,CACd,yCAAyC,IAAI,CAAC,GAAG,EAAE,EAAE,EACrD,2BAA2B,CAAC,UAAU,CAAC,CACxC,CACF,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
+ {"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;AAiZpD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2DlE"}
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":"AAAA,OAAO,EAAC,EAAE,IAAI,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAiBrD,OAAO,EAAC,SAAS,EAAC,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,UAAU,EAAC,MAAM,oCAAoC,CAAC;AAC9D,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,OAAO,EAAC,yBAAyB,EAAC,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAgC/C,qFAAqF;AACrF,MAAM,+BAA+B,GAAG,6CAA6C,CAAC;AAUtF,uCAAuC;AAEvC,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,OAAO,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,wDAAwD,CAAC,CAAC;AAC3F,CAAC;AAED,+BAA+B;AAE/B,KAAK,UAAU,wBAAwB;IACrC,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,+CAA+C,GAAG,KAAK;YACrD,4EAA4E;YAC5E,0EAA0E;YAC1E,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,KAAK;YAC5C,4EAA4E;YAC5E,0EAA0E;YAC1E,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,sFAAsF;QACtF,MAAM,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,gBAAgB,KAAK,GAAG,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;YACpF,kFAAkF;YAClF,wFAAwF;YACxF,iGAAiG;YACjG,iBAAiB,EAAE,UAAU,IAAI,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxE,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QAClD,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,WAAmB;IAChE,MAAM,GAAG,GAAG,+DAA+D,OAAO,kCAAkC,CAAC;IACrH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;IAE1E,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,oBAAoB,OAAO,SAAS,GAAG,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE;YACnC,OAAO,EAAE,EAAC,YAAY,EAAE,YAAY,EAAC;SACtC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,EAAC,cAAc,EAAE,IAAI,EAAC,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;IAC1E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,8DAA8D,GAAG,8CAA8C,CAChH,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sBAAsB;AAEtB,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,gBAAgB;AAEhB,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,UAAkB;IAChE,8EAA8E;IAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE;QACrE,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAC,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC;IAEtF,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC9B,CAAC;AAED,mDAAmD;AAEnD,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,OAAsB;IAC5D,0GAA0G;IAC1G,uDAAuD;IACvD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtG,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,OAAO;QACb,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,QAAQ,EAAE,cAAc;QACxB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;KACrB,CAAC;IACF,mFAAmF;IACnF,MAAM,EAAC,OAAO,EAAE,SAAS,EAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5E,MAAM,IAAI,KAAK,CACb,wHAAyH,GAAa,CAAC,OAAO,EAAE,CACjJ,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACxG,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,sBAAsB;AAEtB,KAAK,UAAU,sBAAsB,CAAC,OAAe;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,QAA4B,CAAC;IACjC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,cAAc,EAAC,EAAE,EAAE;YAC/D,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAE1D,CAAC;YACF,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsB;IAC/C,MAAM,MAAM,GAA4B;QACtC,eAAe,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAC;QAChD,YAAY,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAC;QAC7C,WAAW,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAC;QAC5C,QAAQ,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAC;QACzC,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;IAEF,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC,eAAe,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,eAAe,GAAG;gBACvB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,2CAA2C,MAAM,CAAC,IAAI,uDAAuD;aACtH,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,CAAC,eAAe,GAAG;YACvB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,eAAe,MAAM,CAAC,IAAI,eAAe;SAClD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,eAAe,GAAG;YACvB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAG,GAAa,CAAC,OAAO;SAC/B,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,uBAAuB,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,YAAY,GAAG;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,8BAA8B,MAAM,CAAC,uBAAuB,6BAA6B;aAClG,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,YAAY,GAAG;YACpB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAG,GAAa,CAAC,OAAO;SAC/B,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,4BAA4B;IAC5B,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAErE,uDAAuD;IACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;IACpF,IAAI,OAAO,GAAG,iBAAiB,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,YAAY,GAAG;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,iCAAiC,iBAAiB,EAAE;aAC7D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACxD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,YAAY,GAAG;gBACpB,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,mBAAmB,UAAU,OAAO,OAAO,EAAE;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,YAAY,GAAG;YACpB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAG,GAAa,CAAC,OAAO;SAC/B,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,WAAW,GAAG;gBACnB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,kCAAkC,eAAe,EAAE;aAC5D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC7C,MAAM,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,GAAG;gBACnB,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,4BAA4B,eAAe,EAAE;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,WAAW,GAAG,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAC,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,8EAA8E;QAC9E,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,gGAAgG;QAChG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,UAAU,MAAM,CAAC,CAAC;QACzF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC3D,6EAA6E;QAC7E,+DAA+D;QAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,GAAG,MAAM,sBAAsB,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,GAAG;YAChB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,iBAAiB,eAAe,cAAc,QAAQ,GAAG;SAClE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,QAAQ,GAAG,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAC,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,aAAa,GAAG,eAAe,CAAC;IACvC,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;IAE9B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,gBAAgB,GAAG;QACxB,2BAA2B,EAAE,IAAI;QACjC,wBAAwB,EAAE,eAAe;QACzC,yBAAyB,EAAE,KAAK;KACjC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0BAA0B;AAE1B,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IACrG,uBAAuB,EAAE,CAAC;SACvB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yJAAyJ,CAC1J;IACH,YAAY,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,wIAAwI,CACzI;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAe;IAC1D,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,gCAAgC;QACtC,WAAW,EACT,iFAAiF;YACjF,wGAAwG;YACxG,iGAAiG;YACjG,6GAA6G;YAC7G,sIAAsI;YACtI,kGAAkG;YAClG,iKAAiK;YACjK,gEAAgE;QAClE,UAAU,EAAE,uBAAuB;QACnC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EAAE,IAA6C,EAA0B,EAAE;YACvF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,EAAC,IAAI,EAAE,uBAAuB,EAAE,YAAY,GAAG,KAAK,EAAC,GAAG,IAAI,CAAC;YAEnE,6EAA6E;YAC7E,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,wBAAwB,EAAE,CAAC;gBAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAChE,OAAO,UAAU,CACf,IAAI,CAAC,SAAS,CACZ;oBACE,IAAI,EAAE,WAAW;oBACjB,IAAI;oBACJ,QAAQ;oBACR,mBAAmB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;oBACrE,YAAY,EACV,4GAA4G;wBAC5G,sIAAsI;wBACtI,sGAAsG;wBACtG,yDAAyD;iBAC5D,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;YAED,GAAG,CAAC,IAAI,CACN,6BAA6B,IAAI,iBAAiB,uBAAuB,kBAAkB,YAAY,GAAG,CAC3G,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;gBAC/B,IAAI;gBACJ,uBAAuB;gBACvB,YAAY;aACb,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -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.89.0",
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": "^8.0.4",
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.1.2",
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.2"
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.89.0",
6
+ "version": "1.90.1",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "appium-mcp",
11
- "version": "1.89.0",
11
+ "version": "1.90.1",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  }
@@ -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 {
@@ -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
- _context: Record<string, unknown> | undefined,
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
+ }