@wdio/mcp 3.5.2 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -39
- package/lib/server.js +386 -39
- package/lib/server.js.map +1 -1
- package/lib/trace.js +1 -0
- package/lib/trace.js.map +1 -1
- package/package.json +2 -1
package/lib/trace.js
CHANGED
package/lib/trace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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.1\",\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 \"saucelabs\": \"^9.0.2\",\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":[]}
|
|
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.1\",\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 \"@lambdatest/node-tunnel\": \"^4.0.11\",\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 \"saucelabs\": \"^9.0.2\",\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.
|
|
9
|
+
"version": "3.6.0",
|
|
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",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"test": "vitest run"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
+
"@lambdatest/node-tunnel": "^4.0.11",
|
|
54
55
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
55
56
|
"@toon-format/toon": "^2.1.0",
|
|
56
57
|
"@wdio/protocols": "^9.27.0",
|