@wdio/mcp 3.5.0 → 3.5.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/lib/trace.js CHANGED
@@ -18,10 +18,109 @@ function buildTraceZip(session) {
18
18
  });
19
19
  }
20
20
 
21
+ // package.json
22
+ var package_default = {
23
+ name: "@wdio/mcp",
24
+ mcpName: "io.github.webdriverio/mcp",
25
+ author: "Vince Graics",
26
+ repository: {
27
+ type: "git",
28
+ url: "git://github.com/webdriverio/mcp.git"
29
+ },
30
+ version: "3.5.0",
31
+ description: "MCP server with WebdriverIO for browser and mobile app automation (iOS/Android via Appium)",
32
+ main: "./lib/server.js",
33
+ module: "./lib/server.js",
34
+ types: "./lib/server.d.ts",
35
+ exports: {
36
+ ".": {
37
+ import: "./lib/server.js",
38
+ types: "./lib/server.d.ts"
39
+ },
40
+ "./snapshot": {
41
+ import: "./lib/snapshot.js",
42
+ types: "./lib/snapshot.d.ts"
43
+ },
44
+ "./trace": {
45
+ import: "./lib/trace.js",
46
+ types: "./lib/trace.d.ts"
47
+ }
48
+ },
49
+ bin: {
50
+ "wdio-mcp": "lib/server.js",
51
+ "wdio-show-trace": "lib/show-trace.js"
52
+ },
53
+ license: "MIT",
54
+ publishConfig: {
55
+ access: "public"
56
+ },
57
+ type: "module",
58
+ files: [
59
+ "lib",
60
+ "README.md"
61
+ ],
62
+ scripts: {
63
+ prebundle: "rimraf lib --glob ./*.tgz",
64
+ bundle: "tsup && shx chmod +x lib/server.js",
65
+ postbundle: "npm pack",
66
+ lint: "eslint src/ tests/ --fix && tsc --noEmit",
67
+ start: "node lib/server.js",
68
+ "start:http": "node lib/server.js --http --allowedOrigins http://localhost:8080",
69
+ dev: "tsx --watch src/server.ts",
70
+ "dev:http": "tsx --watch src/server.ts --http --allowedOrigins http://localhost:8080",
71
+ prepare: "husky",
72
+ test: "vitest run"
73
+ },
74
+ dependencies: {
75
+ "@modelcontextprotocol/sdk": "^1.27.1",
76
+ "@toon-format/toon": "^2.1.0",
77
+ "@wdio/protocols": "^9.27.0",
78
+ "@xmldom/xmldom": "^0.9.10",
79
+ "browserstack-local": "^1.5.12",
80
+ "puppeteer-core": "^24.40.0",
81
+ sharp: "^0.34.5",
82
+ webdriverio: "^9.27.0",
83
+ xpath: "^0.0.34",
84
+ yazl: "^3.3.1",
85
+ zod: "^4.3.6"
86
+ },
87
+ devDependencies: {
88
+ "@release-it/conventional-changelog": "^10.0.6",
89
+ "@types/node": "^20.19.37",
90
+ "@types/yauzl": "^2.10.3",
91
+ "@types/yazl": "^3.3.1",
92
+ "@wdio/eslint": "^0.1.3",
93
+ "@wdio/types": "^9.27.0",
94
+ eslint: "^9.39.4",
95
+ "happy-dom": "^20.8.9",
96
+ husky: "^9.1.7",
97
+ "release-it": "^19.2.4",
98
+ rimraf: "^6.1.3",
99
+ shx: "^0.4.0",
100
+ tsup: "^8.5.1",
101
+ tsx: "^4.21.0",
102
+ typescript: "~5.9.3",
103
+ vitest: "^4.1.2",
104
+ yauzl: "^3.3.0"
105
+ },
106
+ packageManager: "pnpm@10.32.1",
107
+ pnpm: {
108
+ overrides: {
109
+ "release-it>undici": "^6.24.0",
110
+ "basic-ftp": "^5.3.1",
111
+ lodash: "^4.18.1",
112
+ hono: "^4.12.18",
113
+ "@hono/node-server": "^1.19.14",
114
+ "fast-xml-parser": "^5.7.3",
115
+ defu: "^6.1.7",
116
+ "vitest>vite": "^7.3.2",
117
+ "ip-address": "^10.1.1"
118
+ }
119
+ }
120
+ };
121
+
21
122
  // src/trace/state.ts
22
- import { createRequire } from "module";
23
- var require2 = createRequire(import.meta.url);
24
- var { version: LIBRARY_VERSION } = require2("../../package.json");
123
+ var libraryVersion = package_default.version;
25
124
  var traceSessions = /* @__PURE__ */ new Map();
26
125
  function createTraceSession(sessionId, browserName, viewport, title, sessionType = "browser") {
27
126
  const prefix = sessionId.slice(0, 8);
@@ -45,7 +144,7 @@ function createTraceSession(sessionId, browserName, viewport, title, sessionType
45
144
  type: "context-options",
46
145
  origin: "library",
47
146
  libraryName: "@wdio/mcp",
48
- libraryVersion: LIBRARY_VERSION,
147
+ libraryVersion,
49
148
  browserName,
50
149
  platform: process.platform === "darwin" ? "darwin" : process.platform === "win32" ? "windows" : "linux",
51
150
  wallTime: session.startWallTime,
package/lib/trace.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/trace/zip-writer.ts","../src/trace/state.ts","../src/trace/tool-mapping.ts"],"sourcesContent":["import yazl from 'yazl';\nimport type { TraceSession } from './types.js';\n\nexport function buildTraceZip(session: TraceSession): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const zipFile = new yazl.ZipFile();\n\n const traceNdjson = session.events.map((e) => JSON.stringify(e)).join('\\n');\n const traceBuffer = Buffer.from(traceNdjson, 'utf8');\n zipFile.addBuffer(traceBuffer, 'trace.trace');\n zipFile.addBuffer(Buffer.alloc(0), 'trace.network');\n\n for (const screenshot of session.screenshots) {\n zipFile.addBuffer(screenshot.data, `resources/${screenshot.resourceName}`);\n }\n\n zipFile.end();\n\n const chunks: Buffer[] = [];\n zipFile.outputStream.on('data', (chunk: Buffer) => chunks.push(chunk));\n zipFile.outputStream.on('end', () => resolve(Buffer.concat(chunks)));\n zipFile.outputStream.on('error', reject);\n });\n}\n","import { createRequire } from 'node:module';\nimport type { TraceSession } from './types.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: LIBRARY_VERSION } = require('../../package.json') as { version: string };\n\nconst traceSessions = new Map<string, TraceSession>();\n\nexport function createTraceSession(\n sessionId: string,\n browserName: string,\n viewport: { width: number; height: number },\n title: string,\n sessionType: 'browser' | 'ios' | 'android' = 'browser',\n): TraceSession {\n const prefix = sessionId.slice(0, 8);\n const session: TraceSession = {\n sessionId,\n startWallTime: Date.now(),\n startHrTime: process.hrtime.bigint(),\n pageId: `page@${prefix}`,\n contextId: `context@${prefix}`,\n callCounter: 0,\n events: [],\n screenshots: [],\n browserName,\n viewport,\n sessionType,\n lastAfterEndTime: 0,\n screenshotChain: Promise.resolve(),\n };\n\n session.events.push({\n version: 8,\n type: 'context-options',\n origin: 'library',\n libraryName: '@wdio/mcp',\n libraryVersion: LIBRARY_VERSION,\n browserName,\n platform: process.platform === 'darwin' ? 'darwin' : process.platform === 'win32' ? 'windows' : 'linux',\n wallTime: session.startWallTime,\n monotonicTime: 0,\n sdkLanguage: 'javascript',\n title,\n contextId: session.contextId,\n options: { viewport },\n });\n\n traceSessions.set(sessionId, session);\n return session;\n}\n\nexport function getTraceSession(sessionId: string): TraceSession | undefined {\n return traceSessions.get(sessionId);\n}\n\nexport function deleteTraceSession(sessionId: string): void {\n traceSessions.delete(sessionId);\n}\n\nexport function getMonotonicMs(session: TraceSession): number {\n return Number((process.hrtime.bigint() - session.startHrTime) / 1_000_000n);\n}\n","export interface TraceAction {\n class: string;\n method: string;\n}\n\nconst TOOL_MAP: Record<string, TraceAction> = {\n navigate: { class: 'Page', method: 'navigate' },\n click_element: { class: 'Element', method: 'click' },\n set_value: { class: 'Element', method: 'fill' },\n scroll: { class: 'Page', method: 'scroll' },\n tap_element: { class: 'Element', method: 'tap' },\n swipe: { class: 'Page', method: 'swipe' },\n drag_and_drop: { class: 'Element', method: 'dragTo' },\n execute_script: { class: 'Page', method: 'evaluate' },\n launch_chrome: { class: 'Browser', method: 'launch' },\n};\n\nexport function mapToolToTraceAction(toolName: string): TraceAction | null {\n return TOOL_MAP[toolName] ?? null;\n}\n\nfunction extractSelectorLabel(selector: string): string {\n // UiAutomator: android=new UiSelector().text(\"Label\") or .description(\"Label\")\n const uiautomator = selector.match(/\\.(?:text|description|textContains)\\(\"([^\"]+)\"\\)/);\n if (uiautomator) return uiautomator[1];\n\n // Accessibility ID: ~label\n if (selector.startsWith('~')) return selector.slice(1);\n\n // iOS predicate: -ios predicate string:label == \"X\" or name == \"X\"\n const predicate = selector.match(/(?:label|name|value)\\s*==\\s*\"([^\"]+)\"/);\n if (predicate) return predicate[1];\n\n // XPath attribute: [@text=\"X\"] [@label=\"X\"] [@name=\"X\"] [@content-desc=\"X\"]\n const xpath = selector.match(/@(?:text|label|name|content-desc)=\"([^\"]+)\"/);\n if (xpath) return xpath[1];\n\n return selector;\n}\n\nexport function formatActionTitle(action: TraceAction, params: Record<string, unknown>): string {\n const { class: cls, method } = action;\n const firstKey = Object.keys(params)[0];\n const firstVal = Object.values(params)[0];\n if (firstVal === undefined) return `${cls}.${method}()`;\n\n const raw = String(firstVal);\n const label = firstKey === 'selector' ? extractSelectorLabel(raw) : raw;\n return `${cls}.${method}(\"${label.slice(0, 80)}\")`;\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../src/trace/zip-writer.ts","../package.json","../src/trace/state.ts","../src/trace/tool-mapping.ts"],"sourcesContent":["import yazl from 'yazl';\nimport type { TraceSession } from './types.js';\n\nexport function buildTraceZip(session: TraceSession): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const zipFile = new yazl.ZipFile();\n\n const traceNdjson = session.events.map((e) => JSON.stringify(e)).join('\\n');\n const traceBuffer = Buffer.from(traceNdjson, 'utf8');\n zipFile.addBuffer(traceBuffer, 'trace.trace');\n zipFile.addBuffer(Buffer.alloc(0), 'trace.network');\n\n for (const screenshot of session.screenshots) {\n zipFile.addBuffer(screenshot.data, `resources/${screenshot.resourceName}`);\n }\n\n zipFile.end();\n\n const chunks: Buffer[] = [];\n zipFile.outputStream.on('data', (chunk: Buffer) => chunks.push(chunk));\n zipFile.outputStream.on('end', () => resolve(Buffer.concat(chunks)));\n zipFile.outputStream.on('error', reject);\n });\n}\n","{\n \"name\": \"@wdio/mcp\",\n \"mcpName\": \"io.github.webdriverio/mcp\",\n \"author\": \"Vince Graics\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/webdriverio/mcp.git\"\n },\n \"version\": \"3.5.0\",\n \"description\": \"MCP server with WebdriverIO for browser and mobile app automation (iOS/Android via Appium)\",\n \"main\": \"./lib/server.js\",\n \"module\": \"./lib/server.js\",\n \"types\": \"./lib/server.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": \"./lib/server.js\",\n \"types\": \"./lib/server.d.ts\"\n },\n \"./snapshot\": {\n \"import\": \"./lib/snapshot.js\",\n \"types\": \"./lib/snapshot.d.ts\"\n },\n \"./trace\": {\n \"import\": \"./lib/trace.js\",\n \"types\": \"./lib/trace.d.ts\"\n }\n },\n \"bin\": {\n \"wdio-mcp\": \"lib/server.js\",\n \"wdio-show-trace\": \"lib/show-trace.js\"\n },\n \"license\": \"MIT\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"type\": \"module\",\n \"files\": [\n \"lib\",\n \"README.md\"\n ],\n \"scripts\": {\n \"prebundle\": \"rimraf lib --glob ./*.tgz\",\n \"bundle\": \"tsup && shx chmod +x lib/server.js\",\n \"postbundle\": \"npm pack\",\n \"lint\": \"eslint src/ tests/ --fix && tsc --noEmit\",\n \"start\": \"node lib/server.js\",\n \"start:http\": \"node lib/server.js --http --allowedOrigins http://localhost:8080\",\n \"dev\": \"tsx --watch src/server.ts\",\n \"dev:http\": \"tsx --watch src/server.ts --http --allowedOrigins http://localhost:8080\",\n \"prepare\": \"husky\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"@toon-format/toon\": \"^2.1.0\",\n \"@wdio/protocols\": \"^9.27.0\",\n \"@xmldom/xmldom\": \"^0.9.10\",\n \"browserstack-local\": \"^1.5.12\",\n \"puppeteer-core\": \"^24.40.0\",\n \"sharp\": \"^0.34.5\",\n \"webdriverio\": \"^9.27.0\",\n \"xpath\": \"^0.0.34\",\n \"yazl\": \"^3.3.1\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@release-it/conventional-changelog\": \"^10.0.6\",\n \"@types/node\": \"^20.19.37\",\n \"@types/yauzl\": \"^2.10.3\",\n \"@types/yazl\": \"^3.3.1\",\n \"@wdio/eslint\": \"^0.1.3\",\n \"@wdio/types\": \"^9.27.0\",\n \"eslint\": \"^9.39.4\",\n \"happy-dom\": \"^20.8.9\",\n \"husky\": \"^9.1.7\",\n \"release-it\": \"^19.2.4\",\n \"rimraf\": \"^6.1.3\",\n \"shx\": \"^0.4.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"~5.9.3\",\n \"vitest\": \"^4.1.2\",\n \"yauzl\": \"^3.3.0\"\n },\n \"packageManager\": \"pnpm@10.32.1\",\n \"pnpm\": {\n \"overrides\": {\n \"release-it>undici\": \"^6.24.0\",\n \"basic-ftp\": \"^5.3.1\",\n \"lodash\": \"^4.18.1\",\n \"hono\": \"^4.12.18\",\n \"@hono/node-server\": \"^1.19.14\",\n \"fast-xml-parser\": \"^5.7.3\",\n \"defu\": \"^6.1.7\",\n \"vitest>vite\": \"^7.3.2\",\n \"ip-address\": \"^10.1.1\"\n }\n }\n}\n","import type { TraceSession } from './types.js';\nimport pkg from '../../package.json' with { type: 'json' };\n\nconst libraryVersion = pkg.version;\nconst traceSessions = new Map<string, TraceSession>();\n\nexport function createTraceSession(\n sessionId: string,\n browserName: string,\n viewport: { width: number; height: number },\n title: string,\n sessionType: 'browser' | 'ios' | 'android' = 'browser',\n): TraceSession {\n const prefix = sessionId.slice(0, 8);\n const session: TraceSession = {\n sessionId,\n startWallTime: Date.now(),\n startHrTime: process.hrtime.bigint(),\n pageId: `page@${prefix}`,\n contextId: `context@${prefix}`,\n callCounter: 0,\n events: [],\n screenshots: [],\n browserName,\n viewport,\n sessionType,\n lastAfterEndTime: 0,\n screenshotChain: Promise.resolve(),\n };\n\n session.events.push({\n version: 8,\n type: 'context-options',\n origin: 'library',\n libraryName: '@wdio/mcp',\n libraryVersion,\n browserName,\n platform: process.platform === 'darwin' ? 'darwin' : process.platform === 'win32' ? 'windows' : 'linux',\n wallTime: session.startWallTime,\n monotonicTime: 0,\n sdkLanguage: 'javascript',\n title,\n contextId: session.contextId,\n options: { viewport },\n });\n\n traceSessions.set(sessionId, session);\n return session;\n}\n\nexport function getTraceSession(sessionId: string): TraceSession | undefined {\n return traceSessions.get(sessionId);\n}\n\nexport function deleteTraceSession(sessionId: string): void {\n traceSessions.delete(sessionId);\n}\n\nexport function getMonotonicMs(session: TraceSession): number {\n return Number((process.hrtime.bigint() - session.startHrTime) / 1_000_000n);\n}\n","export interface TraceAction {\n class: string;\n method: string;\n}\n\nconst TOOL_MAP: Record<string, TraceAction> = {\n navigate: { class: 'Page', method: 'navigate' },\n click_element: { class: 'Element', method: 'click' },\n set_value: { class: 'Element', method: 'fill' },\n scroll: { class: 'Page', method: 'scroll' },\n tap_element: { class: 'Element', method: 'tap' },\n swipe: { class: 'Page', method: 'swipe' },\n drag_and_drop: { class: 'Element', method: 'dragTo' },\n execute_script: { class: 'Page', method: 'evaluate' },\n launch_chrome: { class: 'Browser', method: 'launch' },\n};\n\nexport function mapToolToTraceAction(toolName: string): TraceAction | null {\n return TOOL_MAP[toolName] ?? null;\n}\n\nfunction extractSelectorLabel(selector: string): string {\n // UiAutomator: android=new UiSelector().text(\"Label\") or .description(\"Label\")\n const uiautomator = selector.match(/\\.(?:text|description|textContains)\\(\"([^\"]+)\"\\)/);\n if (uiautomator) return uiautomator[1];\n\n // Accessibility ID: ~label\n if (selector.startsWith('~')) return selector.slice(1);\n\n // iOS predicate: -ios predicate string:label == \"X\" or name == \"X\"\n const predicate = selector.match(/(?:label|name|value)\\s*==\\s*\"([^\"]+)\"/);\n if (predicate) return predicate[1];\n\n // XPath attribute: [@text=\"X\"] [@label=\"X\"] [@name=\"X\"] [@content-desc=\"X\"]\n const xpath = selector.match(/@(?:text|label|name|content-desc)=\"([^\"]+)\"/);\n if (xpath) return xpath[1];\n\n return selector;\n}\n\nexport function formatActionTitle(action: TraceAction, params: Record<string, unknown>): string {\n const { class: cls, method } = action;\n const firstKey = Object.keys(params)[0];\n const firstVal = Object.values(params)[0];\n if (firstVal === undefined) return `${cls}.${method}()`;\n\n const raw = String(firstVal);\n const label = firstKey === 'selector' ? extractSelectorLabel(raw) : raw;\n return `${cls}.${method}(\"${label.slice(0, 80)}\")`;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "type": "git",
7
7
  "url": "git://github.com/webdriverio/mcp.git"
8
8
  },
9
- "version": "3.5.0",
9
+ "version": "3.5.1",
10
10
  "description": "MCP server with WebdriverIO for browser and mobile app automation (iOS/Android via Appium)",
11
11
  "main": "./lib/server.js",
12
12
  "module": "./lib/server.js",