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.0",
31
+ version: "0.2.1",
32
32
  });
33
33
  // ═══════════════════════════════════════════════════════════════
34
34
  // STEP-BY-STEP TOOLS (Claude drives the simulation)
@@ -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;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAoBnD;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;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
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"}
@@ -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
- await browserInstance.close();
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":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "userflow-mcp",
3
- "version": "0.2.0",
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",