real-browser-mcp-server 1.3.3 → 1.4.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.
Files changed (118) hide show
  1. package/README.md +96 -9
  2. package/dist/lib/cjs/index.d.ts +2 -0
  3. package/dist/lib/cjs/index.d.ts.map +1 -0
  4. package/dist/lib/cjs/index.js +386 -0
  5. package/dist/lib/cjs/index.js.map +1 -0
  6. package/dist/lib/cjs/module/pageController.d.ts +2 -0
  7. package/dist/lib/cjs/module/pageController.d.ts.map +1 -0
  8. package/{lib → dist/lib}/cjs/module/pageController.js +28 -29
  9. package/dist/lib/cjs/module/pageController.js.map +1 -0
  10. package/dist/lib/cjs/module/turnstile.d.ts +2 -0
  11. package/dist/lib/cjs/module/turnstile.d.ts.map +1 -0
  12. package/{lib → dist/lib}/cjs/module/turnstile.js +24 -12
  13. package/dist/lib/cjs/module/turnstile.js.map +1 -0
  14. package/dist/src/index.d.ts +11 -0
  15. package/dist/src/index.d.ts.map +1 -0
  16. package/dist/src/index.js +118 -0
  17. package/dist/src/index.js.map +1 -0
  18. package/dist/src/mcp/handlers/browser.d.ts +30 -0
  19. package/dist/src/mcp/handlers/browser.d.ts.map +1 -0
  20. package/dist/src/mcp/handlers/browser.js +232 -0
  21. package/dist/src/mcp/handlers/browser.js.map +1 -0
  22. package/dist/src/mcp/handlers/dom.d.ts +149 -0
  23. package/dist/src/mcp/handlers/dom.d.ts.map +1 -0
  24. package/dist/src/mcp/handlers/dom.js +577 -0
  25. package/dist/src/mcp/handlers/dom.js.map +1 -0
  26. package/dist/src/mcp/handlers/extract.d.ts +59 -0
  27. package/dist/src/mcp/handlers/extract.d.ts.map +1 -0
  28. package/dist/src/mcp/handlers/extract.js +455 -0
  29. package/dist/src/mcp/handlers/extract.js.map +1 -0
  30. package/dist/src/mcp/handlers/form-handlers.d.ts +9 -0
  31. package/dist/src/mcp/handlers/form-handlers.d.ts.map +1 -0
  32. package/dist/src/mcp/handlers/form-handlers.js +56 -0
  33. package/dist/src/mcp/handlers/form-handlers.js.map +1 -0
  34. package/dist/src/mcp/handlers/helpers.d.ts +47 -0
  35. package/dist/src/mcp/handlers/helpers.d.ts.map +1 -0
  36. package/dist/src/mcp/handlers/helpers.js +515 -0
  37. package/dist/src/mcp/handlers/helpers.js.map +1 -0
  38. package/dist/src/mcp/handlers/index.d.ts +6 -0
  39. package/dist/src/mcp/handlers/index.d.ts.map +1 -0
  40. package/dist/src/mcp/handlers/index.js +61 -0
  41. package/dist/src/mcp/handlers/index.js.map +1 -0
  42. package/dist/src/mcp/handlers/media-handlers.d.ts +10 -0
  43. package/dist/src/mcp/handlers/media-handlers.d.ts.map +1 -0
  44. package/dist/src/mcp/handlers/media-handlers.js +535 -0
  45. package/dist/src/mcp/handlers/media-handlers.js.map +1 -0
  46. package/dist/src/mcp/handlers/network.d.ts +147 -0
  47. package/dist/src/mcp/handlers/network.d.ts.map +1 -0
  48. package/dist/src/mcp/handlers/network.js +1135 -0
  49. package/dist/src/mcp/handlers/network.js.map +1 -0
  50. package/dist/src/mcp/handlers/state.d.ts +34 -0
  51. package/dist/src/mcp/handlers/state.d.ts.map +1 -0
  52. package/dist/src/mcp/handlers/state.js +226 -0
  53. package/dist/src/mcp/handlers/state.js.map +1 -0
  54. package/dist/src/mcp/handlers/utility-handlers.d.ts +167 -0
  55. package/dist/src/mcp/handlers/utility-handlers.d.ts.map +1 -0
  56. package/dist/src/mcp/handlers/utility-handlers.js +280 -0
  57. package/dist/src/mcp/handlers/utility-handlers.js.map +1 -0
  58. package/dist/src/mcp/handlers/vision.d.ts +127 -0
  59. package/dist/src/mcp/handlers/vision.d.ts.map +1 -0
  60. package/dist/src/mcp/handlers/vision.js +549 -0
  61. package/dist/src/mcp/handlers/vision.js.map +1 -0
  62. package/dist/src/mcp/index.d.ts +3 -0
  63. package/dist/src/mcp/index.d.ts.map +1 -0
  64. package/dist/src/mcp/index.js +166 -0
  65. package/dist/src/mcp/index.js.map +1 -0
  66. package/dist/src/mcp/server.d.ts +2 -0
  67. package/dist/src/mcp/server.d.ts.map +1 -0
  68. package/dist/src/mcp/server.js +117 -0
  69. package/dist/src/mcp/server.js.map +1 -0
  70. package/dist/src/mcp/tools.d.ts +8 -0
  71. package/dist/src/mcp/tools.d.ts.map +1 -0
  72. package/{src → dist/src}/mcp/tools.js +12 -11
  73. package/dist/src/mcp/tools.js.map +1 -0
  74. package/dist/src/shared/cache-manager.d.ts +80 -0
  75. package/dist/src/shared/cache-manager.d.ts.map +1 -0
  76. package/dist/src/shared/cache-manager.js +221 -0
  77. package/dist/src/shared/cache-manager.js.map +1 -0
  78. package/dist/src/shared/tools.d.ts +2 -0
  79. package/dist/src/shared/tools.d.ts.map +1 -0
  80. package/dist/src/shared/tools.js +606 -0
  81. package/dist/src/shared/tools.js.map +1 -0
  82. package/dist/src/types.d.ts +376 -0
  83. package/dist/src/types.d.ts.map +1 -0
  84. package/dist/src/types.js +9 -0
  85. package/dist/src/types.js.map +1 -0
  86. package/dist/test/cjs/test.d.ts +11 -0
  87. package/dist/test/cjs/test.d.ts.map +1 -0
  88. package/dist/test/cjs/test.js +289 -0
  89. package/dist/test/cjs/test.js.map +1 -0
  90. package/dist/test/mcp/smoke-test.d.ts +29 -0
  91. package/dist/test/mcp/smoke-test.d.ts.map +1 -0
  92. package/dist/test/mcp/smoke-test.js +132 -0
  93. package/dist/test/mcp/smoke-test.js.map +1 -0
  94. package/lib/esm/index.mjs +230 -154
  95. package/lib/esm/module/pageController.mjs +21 -18
  96. package/lib/esm/module/turnstile.mjs +7 -0
  97. package/package.json +25 -16
  98. package/typings.d.ts +7 -1
  99. package/.github/ISSUE_TEMPLATE/general_issue.yaml +0 -58
  100. package/.github/SETUP.md +0 -111
  101. package/.github/workflows/publish.yml +0 -135
  102. package/Dockerfile +0 -79
  103. package/lib/cjs/adblocker.bin +0 -0
  104. package/lib/cjs/index.js +0 -321
  105. package/src/ai/action-parser.js +0 -274
  106. package/src/ai/core.js +0 -378
  107. package/src/ai/element-finder.js +0 -466
  108. package/src/ai/index.js +0 -82
  109. package/src/ai/page-analyzer.js +0 -304
  110. package/src/ai/selector-healer.js +0 -236
  111. package/src/index.js +0 -121
  112. package/src/mcp/handlers.js +0 -5071
  113. package/src/mcp/index.js +0 -190
  114. package/src/mcp/server.js +0 -144
  115. package/src/shared/tools.js +0 -618
  116. package/test/cjs/test.js +0 -259
  117. package/test/esm/package.json +0 -13
  118. package/test/esm/test.js +0 -226
@@ -1,15 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
1
3
  const { checkTurnstile } = require('./turnstile.js');
2
-
3
4
  async function pageController({ browser, page, proxy, turnstile }) {
4
- if (page._pageControllerApplied) return page;
5
+ if (page._pageControllerApplied)
6
+ return page;
5
7
  page._pageControllerApplied = true;
6
-
7
8
  let solveStatus = turnstile;
8
-
9
9
  page.on('close', () => {
10
10
  solveStatus = false;
11
11
  });
12
-
13
12
  async function turnstileSolver() {
14
13
  while (solveStatus) {
15
14
  await checkTurnstile({ page }).catch(() => { });
@@ -17,34 +16,35 @@ async function pageController({ browser, page, proxy, turnstile }) {
17
16
  }
18
17
  return;
19
18
  }
20
-
21
19
  if (solveStatus) {
22
20
  turnstileSolver();
23
21
  }
24
-
25
22
  // === POPUP AD BLOCKING ===
26
23
  const context = page.context();
27
- context.on('page', async (newPage) => {
28
- try {
29
- const opener = await newPage.opener();
30
- if (opener) {
31
- const url = newPage.url();
32
- const isAdPopup = url === 'about:blank' ||
33
- url.includes('ad') ||
34
- url.includes('pop') ||
35
- url.includes('click') ||
36
- url.includes('redirect') ||
37
- url.includes('track');
38
- if (isAdPopup) {
39
- await newPage.close().catch(() => { });
40
- console.error('[popup-blocker] Blocked popup ad:', url.substring(0, 50));
24
+ if (!context._popupBlockerApplied) {
25
+ context._popupBlockerApplied = true;
26
+ context.on('page', async (newPage) => {
27
+ try {
28
+ const opener = await newPage.opener();
29
+ if (opener) {
30
+ const url = newPage.url();
31
+ const isAdPopup = url === 'about:blank' ||
32
+ url.includes('ad') ||
33
+ url.includes('pop') ||
34
+ url.includes('click') ||
35
+ url.includes('redirect') ||
36
+ url.includes('track');
37
+ if (isAdPopup) {
38
+ await newPage.close().catch(() => { });
39
+ console.error('[popup-blocker] Blocked popup ad:', url.substring(0, 50));
40
+ }
41
41
  }
42
42
  }
43
- } catch (e) {
44
- // Ignore errors
45
- }
46
- });
47
-
43
+ catch (e) {
44
+ // Ignore errors
45
+ }
46
+ });
47
+ }
48
48
  // NOTE: JS stealth overrides are commented out because Patchright natively handles automation hiding.
49
49
  // Manual JS overrides trigger Pixelscan fingerprint masking detectors.
50
50
  /*
@@ -63,8 +63,7 @@ async function pageController({ browser, page, proxy, turnstile }) {
63
63
  }
64
64
  });
65
65
  */
66
-
67
66
  return page;
68
67
  }
69
-
70
- module.exports = { pageController };
68
+ module.exports = { pageController };
69
+ //# sourceMappingURL=pageController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageController.js","sourceRoot":"","sources":["../../../../lib/cjs/module/pageController.ts"],"names":[],"mappings":";;AAEA,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAErD,KAAK,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7D,IAAI,IAAI,CAAC,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAEnC,IAAI,WAAW,GAAG,SAAS,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,eAAe;QAC1B,OAAO,WAAW,EAAE,CAAC;YACjB,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAChD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;IACX,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;IACtB,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACpC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa;wBACnC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAClB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACrB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;wBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1B,IAAI,SAAS,EAAE,CAAC;wBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBACvC,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,gBAAgB;YACpB,CAAC;QACL,CAAC,CAAC,CAAC;IACH,CAAC;IAED,sGAAsG;IACtG,uEAAuE;IACvE;;;;;;;;;;;;;;;MAeE;IAEF,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=turnstile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnstile.d.ts","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
@@ -1,7 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
1
3
  const checkTurnstile = async ({ page }) => {
2
4
  try {
3
5
  const elements = await page.locator('[name="cf-turnstile-response"]').all();
4
6
  if (elements.length <= 0) {
7
+ const isChallenge = await page.evaluate(() => {
8
+ return document.title.includes('Just a moment') ||
9
+ document.querySelector('#challenge-stage') !== null ||
10
+ document.querySelector('.cf-turnstile') !== null;
11
+ });
12
+ if (!isChallenge)
13
+ return false;
5
14
  const coordinates = await page.evaluate(() => {
6
15
  let coordinates = [];
7
16
  document.querySelectorAll('div').forEach(item => {
@@ -11,9 +20,9 @@ const checkTurnstile = async ({ page }) => {
11
20
  if (itemCss.margin == "0px" && itemCss.padding == "0px" && itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
12
21
  coordinates.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
13
22
  }
14
- } catch (err) { }
23
+ }
24
+ catch (err) { }
15
25
  });
16
-
17
26
  if (coordinates.length <= 0) {
18
27
  document.querySelectorAll('div').forEach(item => {
19
28
  try {
@@ -21,28 +30,29 @@ const checkTurnstile = async ({ page }) => {
21
30
  if (itemCoordinates.width > 290 && itemCoordinates.width <= 310 && !item.querySelector('*')) {
22
31
  coordinates.push({ x: itemCoordinates.x, y: item.getBoundingClientRect().y, w: item.getBoundingClientRect().width, h: item.getBoundingClientRect().height });
23
32
  }
24
- } catch (err) { }
33
+ }
34
+ catch (err) { }
25
35
  });
26
36
  }
27
37
  return coordinates;
28
38
  });
29
-
30
39
  for (const item of coordinates) {
31
40
  try {
32
41
  let x = item.x + 30;
33
42
  let y = item.y + item.h / 2;
34
43
  await page.mouse.click(x, y);
35
- } catch (err) { }
44
+ }
45
+ catch (err) { }
36
46
  }
37
47
  return true;
38
48
  }
39
-
40
49
  for (const element of elements) {
41
50
  try {
42
51
  // Get the parent element bounding box
43
52
  const box = await element.evaluate(el => {
44
53
  const parent = el.parentElement;
45
- if (!parent) return null;
54
+ if (!parent)
55
+ return null;
46
56
  const rect = parent.getBoundingClientRect();
47
57
  return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
48
58
  });
@@ -51,12 +61,14 @@ const checkTurnstile = async ({ page }) => {
51
61
  let y = box.y + box.height / 2;
52
62
  await page.mouse.click(x, y);
53
63
  }
54
- } catch (err) { }
64
+ }
65
+ catch (err) { }
55
66
  }
56
67
  return true;
57
- } catch (err) {
68
+ }
69
+ catch (err) {
58
70
  return false;
59
71
  }
60
- }
61
-
62
- module.exports = { checkTurnstile };
72
+ };
73
+ module.exports = { checkTurnstile };
74
+ //# sourceMappingURL=turnstile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../../../../lib/cjs/module/turnstile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Real Browser MCP Server
4
+ *
5
+ * Usage:
6
+ * node src/index.js - Start MCP Server (default)
7
+ * node src/index.js --help - Show help
8
+ * node src/index.js --list - List all available tools
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AA0HH,OAAO,EAAE,CAAA"}
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // @ts-nocheck
4
+ /**
5
+ * Real Browser MCP Server
6
+ *
7
+ * Usage:
8
+ * node src/index.js - Start MCP Server (default)
9
+ * node src/index.js --help - Show help
10
+ * node src/index.js --list - List all available tools
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ const { TOOLS, TOOL_DISPLAY, CATEGORIES } = require('./shared/tools');
14
+ // ANSI colors for terminal
15
+ const colors = {
16
+ reset: '\x1b[0m',
17
+ bright: '\x1b[1m',
18
+ dim: '\x1b[2m',
19
+ green: '\x1b[32m',
20
+ yellow: '\x1b[33m',
21
+ blue: '\x1b[34m',
22
+ magenta: '\x1b[35m',
23
+ cyan: '\x1b[36m',
24
+ red: '\x1b[31m',
25
+ };
26
+ /**
27
+ * Display help message
28
+ */
29
+ function showHelp() {
30
+ console.log(`
31
+ ${colors.bright}${colors.cyan}🦁 Real Browser MCP Server${colors.reset}
32
+
33
+ ${colors.bright}USAGE:${colors.reset}
34
+ node src/index.js [options]
35
+
36
+ ${colors.bright}OPTIONS:${colors.reset}
37
+ ${colors.yellow}--help, -h${colors.reset} Show this help message
38
+ ${colors.yellow}--verbose, -v${colors.reset} Show detailed tool information
39
+ ${colors.yellow}--list${colors.reset} List all available tools
40
+
41
+ ${colors.bright}EXAMPLES:${colors.reset}
42
+ node src/index.js # Start MCP server
43
+ node src/index.js --list # List all tools
44
+
45
+ ${colors.bright}NPM SCRIPTS:${colors.reset}
46
+ npm run dev # Start MCP server
47
+ npm run mcp # Start MCP server only
48
+
49
+ ${colors.bright}ARCHITECTURE:${colors.reset}
50
+ ${colors.cyan}MCP Server${colors.reset} → STDIO transport → AI Agents (Claude, Cursor, Copilot)
51
+
52
+ ${colors.bright}TOOL CATEGORIES (${TOOLS.length} tools):${colors.reset}
53
+ ${Object.entries(CATEGORIES).map(([key, cat]) => {
54
+ const count = TOOLS.filter(t => t.category === key).length;
55
+ return ` ${cat.emoji} ${colors.yellow}${cat.name.padEnd(15)}${colors.reset} ${colors.dim}(${count} tools)${colors.reset}`;
56
+ }).join('\n')}
57
+ `);
58
+ }
59
+ /**
60
+ * List all available tools
61
+ */
62
+ function listTools() {
63
+ console.log(`\n${colors.bright}${colors.cyan}🦁 Available Tools (${TOOLS.length}):${colors.reset}\n`);
64
+ for (const [key, category] of Object.entries(CATEGORIES)) {
65
+ const cat = category;
66
+ const tools = TOOLS.filter(t => t.category === key);
67
+ if (tools.length === 0)
68
+ continue;
69
+ console.log(`${colors.bright}${cat.emoji} ${cat.name}${colors.reset} ${colors.dim}(${tools.length})${colors.reset}`);
70
+ console.log(`${colors.dim}${'─'.repeat(50)}${colors.reset}`);
71
+ for (const tool of tools) {
72
+ console.log(` ${tool.emoji} ${colors.yellow}${tool.name.padEnd(25)}${colors.reset} ${colors.dim}${tool.description.substring(0, 40)}${colors.reset}`);
73
+ }
74
+ console.log('');
75
+ }
76
+ }
77
+ /**
78
+ * Main entry point
79
+ */
80
+ async function main() {
81
+ const args = process.argv.slice(2);
82
+ // Parse arguments
83
+ const hasHelp = args.includes('--help') || args.includes('-h');
84
+ const hasList = args.includes('--list');
85
+ if (hasHelp) {
86
+ showHelp();
87
+ process.exit(0);
88
+ }
89
+ if (hasList) {
90
+ listTools();
91
+ process.exit(0);
92
+ }
93
+ console.error('');
94
+ console.error(`${colors.bright}${colors.cyan}╔════════════════════════════════════════════════════════════╗${colors.reset}`);
95
+ console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.bright}${colors.magenta}🦁 Real Browser MCP Server${colors.reset} ${colors.cyan}║${colors.reset}`);
96
+ console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.dim}MCP (AI Agents) Server running on STDIO${colors.reset} ${colors.cyan}║${colors.reset}`);
97
+ console.error(`${colors.bright}${colors.cyan}╚════════════════════════════════════════════════════════════╝${colors.reset}`);
98
+ console.error('');
99
+ console.error(`${colors.bright}${colors.blue}🚀 Starting MCP Server...${colors.reset}`);
100
+ // Import and run MCP server
101
+ require('./mcp/index');
102
+ }
103
+ // Export for programmatic use
104
+ module.exports = {
105
+ TOOLS,
106
+ TOOL_DISPLAY,
107
+ CATEGORIES,
108
+ startMCP: () => require('./mcp/index'),
109
+ startBoth: () => require('./mcp/index'),
110
+ };
111
+ // Run if called directly
112
+ if (require.main === module) {
113
+ main().catch(error => {
114
+ console.error(`${colors.red}❌ Fatal error:${colors.reset}`, error.message);
115
+ process.exit(1);
116
+ });
117
+ }
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare const browserHandlers: {
2
+ browser_init(params?: {}): Promise<{
3
+ success: boolean;
4
+ message: string;
5
+ pid: any;
6
+ headless: any;
7
+ blockerEnabled: any;
8
+ }>;
9
+ navigate(params: any): Promise<{
10
+ success: boolean;
11
+ url: string;
12
+ title: string;
13
+ recovered?: undefined;
14
+ } | {
15
+ success: boolean;
16
+ url: string;
17
+ title: string;
18
+ recovered: boolean;
19
+ }>;
20
+ wait(params: any): Promise<{
21
+ success: boolean;
22
+ type: any;
23
+ value: any;
24
+ }>;
25
+ browser_close(params?: {}): Promise<{
26
+ success: boolean;
27
+ message: string;
28
+ }>;
29
+ };
30
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/mcp/handlers/browser.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiQ3B,CAAC"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browserHandlers = void 0;
4
+ const state_1 = require("./state");
5
+ // Auto-generated browser handlers
6
+ exports.browserHandlers = {
7
+ async browser_init(params = {}) {
8
+ (0, state_1.notifyProgress)('browser_init', 'started', 'Initializing browser...');
9
+ const { connect } = require('../../../lib/cjs/index.js');
10
+ // Get headless from params OR environment variable
11
+ const envHeadless = (0, state_1.getHeadlessFromEnv)();
12
+ const headless = params.headless !== undefined ? params.headless : envHeadless;
13
+ const { proxy = {}, contextOptions = {}, turnstile = false, enableBlocker = true } = params;
14
+ (0, state_1.notifyProgress)('browser_init', 'progress', `Mode: ${headless ? 'Headless' : 'GUI (Visible)'}`, { headless });
15
+ const result = await connect({
16
+ headless,
17
+ proxy,
18
+ contextOptions,
19
+ turnstile,
20
+ enableBlocker,
21
+ });
22
+ state_1.state.browserInstance = result.browser;
23
+ state_1.state.pageInstance = result.page;
24
+ state_1.state.blockerInstance = result.blocker;
25
+ state_1.state.setupPageFn = result.setupPage; // Store CDP early injection function
26
+ // ═══════════════════════════════════════════════════════════════
27
+ // GLOBAL DIALOG HANDLER - Auto-handle dialogs
28
+ // Logic: BLOCK redirects to external sites, ACCEPT everything else
29
+ // ═══════════════════════════════════════════════════════════════
30
+ state_1.state.pageInstance.on('dialog', async (dialog) => {
31
+ const dialogType = dialog.type();
32
+ const msg = dialog.message().toLowerCase();
33
+ (0, state_1.notifyProgress)('browser_init', 'progress', `🔔 Handling dialog: ${dialogType} - ${dialog.message().substring(0, 100)}...`);
34
+ try {
35
+ // Critical Fix: BLOCK redirects to external sites (e.g., eCommittee)
36
+ // These redirects take the user away from the search page
37
+ if (msg.includes('redirect') || msg.includes('external') || msg.includes('leaving')) {
38
+ console.error('🚫 Blocking redirect dialog (Dismiss)');
39
+ await dialog.dismiss(); // Simulate clicking 'Cancel'
40
+ }
41
+ else {
42
+ // Auto-accept other dialogs (like alerts or simple confirmations)
43
+ await dialog.accept(); // Simulate clicking 'OK'
44
+ }
45
+ }
46
+ catch (e) {
47
+ // Ignore errors (dialog might be closed by injected script)
48
+ }
49
+ });
50
+ // ═══════════════════════════════════════════════════════════════
51
+ // INJECTED SCRIPT - Silent Handling of Popups
52
+ // Override window.confirm/alert to handle them inside the page context
53
+ // Note: Using addInitScript (Playwright) to intercept popups early
54
+ // ═══════════════════════════════════════════════════════════════
55
+ await state_1.state.pageInstance.addInitScript(() => {
56
+ window.originalConfirm = window.confirm;
57
+ window.originalAlert = window.alert;
58
+ // Smart Confirm Handler
59
+ window.confirm = (msg) => {
60
+ console.log('Intercepted Confirm Dialog:', msg);
61
+ if (msg && (msg.toLowerCase().includes('redirect') || msg.toLowerCase().includes('external'))) {
62
+ console.log('🚫 Blocking redirect confirmation inside page');
63
+ return false; // Return FALSE = Click Cancel
64
+ }
65
+ return true; // Return TRUE = Click OK
66
+ };
67
+ // Silently ignore alerts (always OK)
68
+ window.alert = (msg) => {
69
+ console.log('Blocked Alert Dialog:', msg);
70
+ return true;
71
+ };
72
+ // Silently return null for prompts
73
+ window.prompt = (msg) => {
74
+ console.log('Blocked Prompt Dialog:', msg);
75
+ return null;
76
+ };
77
+ });
78
+ const pid = (typeof state_1.state.browserInstance.process === 'function') ? state_1.state.browserInstance.process()?.pid : null;
79
+ (0, state_1.notifyProgress)('browser_init', 'completed', `Browser started (PID: ${pid})`, {
80
+ headless,
81
+ pid,
82
+ blockerEnabled: enableBlocker
83
+ });
84
+ return {
85
+ success: true,
86
+ message: `Browser initialized in ${headless ? 'headless' : 'GUI'} mode`,
87
+ pid,
88
+ headless,
89
+ blockerEnabled: enableBlocker
90
+ };
91
+ },
92
+ async navigate(params) {
93
+ const { page } = (0, state_1.requireBrowser)();
94
+ let { url, waitUntil = 'networkidle', timeout = 30000, retries = 2 } = params;
95
+ // Playwright/Patchright wait states: load | domcontentloaded | networkidle | commit
96
+ waitUntil = (0, state_1.resolveWaitUntil)(waitUntil);
97
+ (0, state_1.notifyProgress)('navigate', 'started', `Navigating to: ${url}`);
98
+ // ═══════════════════════════════════════════════════════════════
99
+ // CDP EARLY INJECTION - Setup BEFORE navigation for better ad blocking
100
+ // This ensures CSS and scripts are injected before page scripts run
101
+ // ═══════════════════════════════════════════════════════════════
102
+ console.error('[Navigate] state.setupPageFn available:', !!state_1.state.setupPageFn);
103
+ if (state_1.state.setupPageFn) {
104
+ try {
105
+ await state_1.state.setupPageFn(page);
106
+ (0, state_1.notifyProgress)('navigate', 'progress', 'CDP early injection setup complete');
107
+ console.error('[Navigate] CDP early injection SUCCESS');
108
+ }
109
+ catch (e) {
110
+ // Non-critical error, continue navigation
111
+ console.error('[Navigate] CDP early injection failed:', e.message);
112
+ }
113
+ }
114
+ else {
115
+ console.error('[Navigate] No state.setupPageFn available - CDP early injection skipped');
116
+ }
117
+ let lastError = null;
118
+ for (let attempt = 0; attempt <= retries; attempt++) {
119
+ try {
120
+ // Wait a bit if this is a retry
121
+ if (attempt > 0) {
122
+ (0, state_1.notifyProgress)('navigate', 'progress', `Retry attempt ${attempt}...`);
123
+ await new Promise(r => setTimeout(r, 1000));
124
+ }
125
+ await page.goto(url, { waitUntil, timeout });
126
+ // Wait for page to stabilize after navigation
127
+ await new Promise(r => setTimeout(r, 500));
128
+ // Try to get title with error handling
129
+ let title = '';
130
+ try {
131
+ title = await page.title();
132
+ }
133
+ catch (e) {
134
+ // Title might fail if page is still loading
135
+ title = 'Loading...';
136
+ }
137
+ (0, state_1.notifyProgress)('navigate', 'completed', `Loaded: ${title}`, { url: page.url(), title });
138
+ return {
139
+ success: true,
140
+ url: page.url(),
141
+ title
142
+ };
143
+ }
144
+ catch (error) {
145
+ lastError = error;
146
+ // Handle specific errors that might be recoverable
147
+ if (error.message?.includes('Execution context was destroyed') ||
148
+ error.message?.includes('context') ||
149
+ error.message?.includes('Target closed')) {
150
+ (0, state_1.notifyProgress)('navigate', 'progress', `Navigation interrupted (${error.message.substring(0, 50)}...), waiting for page...`);
151
+ // Wait for any ongoing navigation to complete
152
+ try {
153
+ await page.waitForNavigation({ timeout: 5000, waitUntil: 'domcontentloaded' }).catch(() => { });
154
+ }
155
+ catch (e) {
156
+ // Ignore timeout
157
+ }
158
+ // Check if we actually landed on the page
159
+ try {
160
+ const currentUrl = page.url();
161
+ if (currentUrl && currentUrl !== 'about:blank') {
162
+ const title = await page.title().catch(() => 'Unknown');
163
+ (0, state_1.notifyProgress)('navigate', 'completed', `Loaded after recovery: ${title}`, { url: currentUrl, title });
164
+ return {
165
+ success: true,
166
+ url: currentUrl,
167
+ title,
168
+ recovered: true
169
+ };
170
+ }
171
+ }
172
+ catch (e) {
173
+ // Continue to retry
174
+ }
175
+ }
176
+ else {
177
+ // Non-recoverable error, throw immediately
178
+ throw error;
179
+ }
180
+ }
181
+ }
182
+ // All retries failed
183
+ (0, state_1.notifyProgress)('navigate', 'error', `Navigation failed after ${retries + 1} attempts: ${lastError?.message}`);
184
+ throw lastError || new Error('Navigation failed');
185
+ },
186
+ async wait(params) {
187
+ const { page } = (0, state_1.requireBrowser)();
188
+ const { type = 'timeout', value, timeout = 30000 } = params;
189
+ (0, state_1.notifyProgress)('wait', 'started', `Waiting for ${type}: ${value}`);
190
+ switch (type) {
191
+ case 'selector':
192
+ await page.waitForSelector(value, { timeout });
193
+ break;
194
+ case 'navigation':
195
+ await page.waitForNavigation({ timeout });
196
+ break;
197
+ case 'networkidle':
198
+ await page.waitForLoadState('networkidle', { timeout });
199
+ break;
200
+ case 'timeout':
201
+ default:
202
+ await new Promise(r => setTimeout(r, parseInt(value) || 1000));
203
+ }
204
+ (0, state_1.notifyProgress)('wait', 'completed', `Wait completed: ${type}`, { type, value });
205
+ return { success: true, type, value };
206
+ },
207
+ async browser_close(params = {}) {
208
+ const { force = false } = params;
209
+ (0, state_1.notifyProgress)('browser_close', 'started', 'Closing browser...');
210
+ if (state_1.state.browserInstance) {
211
+ try {
212
+ await state_1.state.browserInstance.close();
213
+ (0, state_1.notifyProgress)('browser_close', 'progress', 'Browser closed gracefully');
214
+ }
215
+ catch (e) {
216
+ if (force) {
217
+ if (typeof state_1.state.browserInstance.process === 'function') {
218
+ state_1.state.browserInstance.process()?.kill('SIGKILL');
219
+ }
220
+ (0, state_1.notifyProgress)('browser_close', 'progress', 'Browser force killed');
221
+ }
222
+ }
223
+ state_1.state.browserInstance = null;
224
+ state_1.state.pageInstance = null;
225
+ state_1.state.blockerInstance = null;
226
+ state_1.state.setupPageFn = null;
227
+ }
228
+ (0, state_1.notifyProgress)('browser_close', 'completed', 'Browser closed');
229
+ return { success: true, message: 'Browser closed' };
230
+ }
231
+ };
232
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../../src/mcp/handlers/browser.ts"],"names":[],"mappings":"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"}