userflow-mcp 0.2.0 → 0.2.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/dist/server.js
CHANGED
|
@@ -28,7 +28,7 @@ function serializePageState(page) {
|
|
|
28
28
|
export function createServer() {
|
|
29
29
|
const server = new McpServer({
|
|
30
30
|
name: "userflow-mcp",
|
|
31
|
-
version: "0.2.
|
|
31
|
+
version: "0.2.1",
|
|
32
32
|
});
|
|
33
33
|
// ═══════════════════════════════════════════════════════════════
|
|
34
34
|
// STEP-BY-STEP TOOLS (Claude drives the simulation)
|
package/dist/utils/browser.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { type Browser, type Page } from "puppeteer-core";
|
|
2
2
|
/**
|
|
3
3
|
* Get or create a shared browser instance.
|
|
4
|
+
*
|
|
5
|
+
* Connection priority:
|
|
6
|
+
* 1. CHROME_WS_ENDPOINT env var — connect to existing browser via WebSocket
|
|
7
|
+
* 2. CHROME_CDP_URL env var — connect via CDP HTTP endpoint (e.g. http://localhost:9222)
|
|
8
|
+
* 3. Launch a fresh headless Chrome
|
|
9
|
+
*
|
|
10
|
+
* Using options 1 or 2 preserves the user's login sessions and cookies.
|
|
4
11
|
*/
|
|
5
12
|
export declare function getBrowser(): Promise<Browser>;
|
|
6
13
|
/**
|
|
@@ -17,6 +24,7 @@ export declare function navigateAndWait(page: Page, url: string, delay?: number)
|
|
|
17
24
|
export declare function closePage(page: Page): Promise<void>;
|
|
18
25
|
/**
|
|
19
26
|
* Shut down the shared browser instance.
|
|
27
|
+
* If connected via CDP, disconnects without closing the user's browser.
|
|
20
28
|
*/
|
|
21
29
|
export declare function closeBrowser(): Promise<void>;
|
|
22
30
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA4DpE
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA4DpE;;;;;;;;;GASG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAmCnD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAU,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzD;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAclD"}
|
package/dist/utils/browser.js
CHANGED
|
@@ -52,11 +52,31 @@ function findChromePath() {
|
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Get or create a shared browser instance.
|
|
55
|
+
*
|
|
56
|
+
* Connection priority:
|
|
57
|
+
* 1. CHROME_WS_ENDPOINT env var — connect to existing browser via WebSocket
|
|
58
|
+
* 2. CHROME_CDP_URL env var — connect via CDP HTTP endpoint (e.g. http://localhost:9222)
|
|
59
|
+
* 3. Launch a fresh headless Chrome
|
|
60
|
+
*
|
|
61
|
+
* Using options 1 or 2 preserves the user's login sessions and cookies.
|
|
55
62
|
*/
|
|
56
63
|
export async function getBrowser() {
|
|
57
64
|
if (browserInstance && browserInstance.connected) {
|
|
58
65
|
return browserInstance;
|
|
59
66
|
}
|
|
67
|
+
// Option 1: Direct WebSocket endpoint
|
|
68
|
+
const wsEndpoint = process.env.CHROME_WS_ENDPOINT;
|
|
69
|
+
if (wsEndpoint) {
|
|
70
|
+
browserInstance = await puppeteer.connect({ browserWSEndpoint: wsEndpoint });
|
|
71
|
+
return browserInstance;
|
|
72
|
+
}
|
|
73
|
+
// Option 2: CDP URL (auto-discovers WebSocket endpoint)
|
|
74
|
+
const cdpUrl = process.env.CHROME_CDP_URL;
|
|
75
|
+
if (cdpUrl) {
|
|
76
|
+
browserInstance = await puppeteer.connect({ browserURL: cdpUrl });
|
|
77
|
+
return browserInstance;
|
|
78
|
+
}
|
|
79
|
+
// Option 3: Launch fresh headless Chrome
|
|
60
80
|
const executablePath = findChromePath();
|
|
61
81
|
browserInstance = await puppeteer.launch({
|
|
62
82
|
executablePath,
|
|
@@ -107,14 +127,21 @@ export async function closePage(page) {
|
|
|
107
127
|
}
|
|
108
128
|
/**
|
|
109
129
|
* Shut down the shared browser instance.
|
|
130
|
+
* If connected via CDP, disconnects without closing the user's browser.
|
|
110
131
|
*/
|
|
111
132
|
export async function closeBrowser() {
|
|
112
133
|
if (browserInstance) {
|
|
134
|
+
const isRemote = !!(process.env.CHROME_WS_ENDPOINT || process.env.CHROME_CDP_URL);
|
|
113
135
|
try {
|
|
114
|
-
|
|
136
|
+
if (isRemote) {
|
|
137
|
+
browserInstance.disconnect();
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
await browserInstance.close();
|
|
141
|
+
}
|
|
115
142
|
}
|
|
116
143
|
catch {
|
|
117
|
-
// Browser may already be closed
|
|
144
|
+
// Browser may already be closed/disconnected
|
|
118
145
|
}
|
|
119
146
|
browserInstance = null;
|
|
120
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,SAAsC,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,IAAI,eAAe,GAAmB,IAAI,CAAC;AAE3C;;;GAGG;AACH,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACjF,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,QAAQ;QACR,8DAA8D;QAC9D,4EAA4E;QAC5E,oDAAoD;QACpD,gEAAgE;QAChE,8DAA8D;QAC9D,QAAQ;QACR,wBAAwB;QACxB,+BAA+B;QAC/B,mBAAmB;QACnB,2BAA2B;QAC3B,oBAAoB;QACpB,gBAAgB;QAChB,2DAA2D;QAC3D,iEAAiE;KAClE,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,iEAAiE,EAAE;YACzF,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,kGAAkG;QAClG,8CAA8C;QAC9C,kDAAkD;QAClD,8CAA8C,CAC/C,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,SAAsC,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,IAAI,eAAe,GAAmB,IAAI,CAAC;AAE3C;;;GAGG;AACH,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACjF,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,QAAQ;QACR,8DAA8D;QAC9D,4EAA4E;QAC5E,oDAAoD;QACpD,gEAAgE;QAChE,8DAA8D;QAC9D,QAAQ;QACR,wBAAwB;QACxB,+BAA+B;QAC/B,mBAAmB;QACnB,2BAA2B;QAC3B,oBAAoB;QACpB,gBAAgB;QAChB,2DAA2D;QAC3D,iEAAiE;KAClE,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,iEAAiE,EAAE;YACzF,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,kGAAkG;QAClG,8CAA8C;QAC9C,kDAAkD;QAClD,8CAA8C,CAC/C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,eAAe,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC;QACjD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,sCAAsC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,eAAe,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7E,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,wDAAwD;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,eAAe,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,yCAAyC;IACzC,MAAM,cAAc,GAAG,cAAc,EAAE,CAAC;IAExC,eAAe,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;QACvC,cAAc;QACd,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE;YACJ,cAAc;YACd,0BAA0B;YAC1B,yBAAyB;YACzB,eAAe;YACf,sBAAsB;SACvB;KACF,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,MAAc,EACd,oBAA4B,CAAC;IAE7B,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,GAAW,EACX,QAAgB,CAAC;IAEjB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACnB,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU;IACxC,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,eAAe,CAAC,UAAU,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;QACD,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "userflow-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"mcpName": "io.github.prembobby39-gif/userflow-mcp",
|
|
5
5
|
"description": "UserFlow MCP — Simulates real users navigating your app with different personas and delivers qualitative UX feedback. Free for Pro plan users.",
|
|
6
6
|
"type": "module",
|