@natchs/browser-mcp 2.0.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 (274) hide show
  1. package/README.md +141 -0
  2. package/dist/core/auth.d.ts +7 -0
  3. package/dist/core/auth.d.ts.map +1 -0
  4. package/dist/core/auth.js +23 -0
  5. package/dist/core/auth.js.map +1 -0
  6. package/dist/core/cache.d.ts +24 -0
  7. package/dist/core/cache.d.ts.map +1 -0
  8. package/dist/core/cache.js +67 -0
  9. package/dist/core/cache.js.map +1 -0
  10. package/dist/core/config.d.ts +362 -0
  11. package/dist/core/config.d.ts.map +1 -0
  12. package/dist/core/config.js +281 -0
  13. package/dist/core/config.js.map +1 -0
  14. package/dist/core/context.d.ts +38 -0
  15. package/dist/core/context.d.ts.map +1 -0
  16. package/dist/core/context.js +19 -0
  17. package/dist/core/context.js.map +1 -0
  18. package/dist/core/errors.d.ts +82 -0
  19. package/dist/core/errors.d.ts.map +1 -0
  20. package/dist/core/errors.js +98 -0
  21. package/dist/core/errors.js.map +1 -0
  22. package/dist/core/logger.d.ts +22 -0
  23. package/dist/core/logger.d.ts.map +1 -0
  24. package/dist/core/logger.js +41 -0
  25. package/dist/core/logger.js.map +1 -0
  26. package/dist/core/metrics.d.ts +24 -0
  27. package/dist/core/metrics.d.ts.map +1 -0
  28. package/dist/core/metrics.js +59 -0
  29. package/dist/core/metrics.js.map +1 -0
  30. package/dist/core/network-capture.d.ts +117 -0
  31. package/dist/core/network-capture.d.ts.map +1 -0
  32. package/dist/core/network-capture.js +349 -0
  33. package/dist/core/network-capture.js.map +1 -0
  34. package/dist/core/network-export.d.ts +6 -0
  35. package/dist/core/network-export.d.ts.map +1 -0
  36. package/dist/core/network-export.js +163 -0
  37. package/dist/core/network-export.js.map +1 -0
  38. package/dist/core/output.d.ts +66 -0
  39. package/dist/core/output.d.ts.map +1 -0
  40. package/dist/core/output.js +114 -0
  41. package/dist/core/output.js.map +1 -0
  42. package/dist/core/pipeline.d.ts +25 -0
  43. package/dist/core/pipeline.d.ts.map +1 -0
  44. package/dist/core/pipeline.js +52 -0
  45. package/dist/core/pipeline.js.map +1 -0
  46. package/dist/core/plugin.d.ts +26 -0
  47. package/dist/core/plugin.d.ts.map +1 -0
  48. package/dist/core/plugin.js +49 -0
  49. package/dist/core/plugin.js.map +1 -0
  50. package/dist/core/rate-limit.d.ts +33 -0
  51. package/dist/core/rate-limit.d.ts.map +1 -0
  52. package/dist/core/rate-limit.js +89 -0
  53. package/dist/core/rate-limit.js.map +1 -0
  54. package/dist/core/registry.d.ts +67 -0
  55. package/dist/core/registry.d.ts.map +1 -0
  56. package/dist/core/registry.js +270 -0
  57. package/dist/core/registry.js.map +1 -0
  58. package/dist/core/sandbox.d.ts +20 -0
  59. package/dist/core/sandbox.d.ts.map +1 -0
  60. package/dist/core/sandbox.js +168 -0
  61. package/dist/core/sandbox.js.map +1 -0
  62. package/dist/core/schema-gen.d.ts +5 -0
  63. package/dist/core/schema-gen.d.ts.map +1 -0
  64. package/dist/core/schema-gen.js +115 -0
  65. package/dist/core/schema-gen.js.map +1 -0
  66. package/dist/core/session.d.ts +88 -0
  67. package/dist/core/session.d.ts.map +1 -0
  68. package/dist/core/session.js +300 -0
  69. package/dist/core/session.js.map +1 -0
  70. package/dist/index.d.ts +5 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +192 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/prompts/index.d.ts +11 -0
  75. package/dist/prompts/index.d.ts.map +1 -0
  76. package/dist/prompts/index.js +121 -0
  77. package/dist/prompts/index.js.map +1 -0
  78. package/dist/tools/admin/cache.d.ts +7 -0
  79. package/dist/tools/admin/cache.d.ts.map +1 -0
  80. package/dist/tools/admin/cache.js +27 -0
  81. package/dist/tools/admin/cache.js.map +1 -0
  82. package/dist/tools/admin/index.d.ts +3 -0
  83. package/dist/tools/admin/index.d.ts.map +1 -0
  84. package/dist/tools/admin/index.js +9 -0
  85. package/dist/tools/admin/index.js.map +1 -0
  86. package/dist/tools/admin/server-status.d.ts +14 -0
  87. package/dist/tools/admin/server-status.d.ts.map +1 -0
  88. package/dist/tools/admin/server-status.js +33 -0
  89. package/dist/tools/admin/server-status.js.map +1 -0
  90. package/dist/tools/browser/cookies.d.ts +46 -0
  91. package/dist/tools/browser/cookies.d.ts.map +1 -0
  92. package/dist/tools/browser/cookies.js +65 -0
  93. package/dist/tools/browser/cookies.js.map +1 -0
  94. package/dist/tools/browser/evaluate.d.ts +12 -0
  95. package/dist/tools/browser/evaluate.d.ts.map +1 -0
  96. package/dist/tools/browser/evaluate.js +61 -0
  97. package/dist/tools/browser/evaluate.js.map +1 -0
  98. package/dist/tools/browser/index.d.ts +3 -0
  99. package/dist/tools/browser/index.d.ts.map +1 -0
  100. package/dist/tools/browser/index.js +17 -0
  101. package/dist/tools/browser/index.js.map +1 -0
  102. package/dist/tools/browser/page-info.d.ts +6 -0
  103. package/dist/tools/browser/page-info.d.ts.map +1 -0
  104. package/dist/tools/browser/page-info.js +25 -0
  105. package/dist/tools/browser/page-info.js.map +1 -0
  106. package/dist/tools/browser/pdf.d.ts +45 -0
  107. package/dist/tools/browser/pdf.d.ts.map +1 -0
  108. package/dist/tools/browser/pdf.js +57 -0
  109. package/dist/tools/browser/pdf.js.map +1 -0
  110. package/dist/tools/browser/screenshot.d.ts +21 -0
  111. package/dist/tools/browser/screenshot.d.ts.map +1 -0
  112. package/dist/tools/browser/screenshot.js +41 -0
  113. package/dist/tools/browser/screenshot.js.map +1 -0
  114. package/dist/tools/extraction/extract-css.d.ts +33 -0
  115. package/dist/tools/extraction/extract-css.d.ts.map +1 -0
  116. package/dist/tools/extraction/extract-css.js +112 -0
  117. package/dist/tools/extraction/extract-css.js.map +1 -0
  118. package/dist/tools/extraction/extract.d.ts +10 -0
  119. package/dist/tools/extraction/extract.d.ts.map +1 -0
  120. package/dist/tools/extraction/extract.js +71 -0
  121. package/dist/tools/extraction/extract.js.map +1 -0
  122. package/dist/tools/extraction/index.d.ts +3 -0
  123. package/dist/tools/extraction/index.d.ts.map +1 -0
  124. package/dist/tools/extraction/index.js +17 -0
  125. package/dist/tools/extraction/index.js.map +1 -0
  126. package/dist/tools/interaction/click.d.ts +15 -0
  127. package/dist/tools/interaction/click.d.ts.map +1 -0
  128. package/dist/tools/interaction/click.js +31 -0
  129. package/dist/tools/interaction/click.js.map +1 -0
  130. package/dist/tools/interaction/drag.d.ts +18 -0
  131. package/dist/tools/interaction/drag.d.ts.map +1 -0
  132. package/dist/tools/interaction/drag.js +27 -0
  133. package/dist/tools/interaction/drag.js.map +1 -0
  134. package/dist/tools/interaction/file-upload.d.ts +18 -0
  135. package/dist/tools/interaction/file-upload.d.ts.map +1 -0
  136. package/dist/tools/interaction/file-upload.js +37 -0
  137. package/dist/tools/interaction/file-upload.js.map +1 -0
  138. package/dist/tools/interaction/fill.d.ts +18 -0
  139. package/dist/tools/interaction/fill.d.ts.map +1 -0
  140. package/dist/tools/interaction/fill.js +34 -0
  141. package/dist/tools/interaction/fill.js.map +1 -0
  142. package/dist/tools/interaction/hover.d.ts +15 -0
  143. package/dist/tools/interaction/hover.d.ts.map +1 -0
  144. package/dist/tools/interaction/hover.js +26 -0
  145. package/dist/tools/interaction/hover.js.map +1 -0
  146. package/dist/tools/interaction/index.d.ts +3 -0
  147. package/dist/tools/interaction/index.d.ts.map +1 -0
  148. package/dist/tools/interaction/index.js +19 -0
  149. package/dist/tools/interaction/index.js.map +1 -0
  150. package/dist/tools/interaction/press-key.d.ts +12 -0
  151. package/dist/tools/interaction/press-key.d.ts.map +1 -0
  152. package/dist/tools/interaction/press-key.js +24 -0
  153. package/dist/tools/interaction/press-key.js.map +1 -0
  154. package/dist/tools/interaction/select.d.ts +18 -0
  155. package/dist/tools/interaction/select.d.ts.map +1 -0
  156. package/dist/tools/interaction/select.js +28 -0
  157. package/dist/tools/interaction/select.js.map +1 -0
  158. package/dist/tools/interaction/type.d.ts +21 -0
  159. package/dist/tools/interaction/type.d.ts.map +1 -0
  160. package/dist/tools/interaction/type.js +30 -0
  161. package/dist/tools/interaction/type.js.map +1 -0
  162. package/dist/tools/navigation/back.d.ts +6 -0
  163. package/dist/tools/navigation/back.d.ts.map +1 -0
  164. package/dist/tools/navigation/back.js +16 -0
  165. package/dist/tools/navigation/back.js.map +1 -0
  166. package/dist/tools/navigation/forward.d.ts +6 -0
  167. package/dist/tools/navigation/forward.d.ts.map +1 -0
  168. package/dist/tools/navigation/forward.js +16 -0
  169. package/dist/tools/navigation/forward.js.map +1 -0
  170. package/dist/tools/navigation/index.d.ts +3 -0
  171. package/dist/tools/navigation/index.d.ts.map +1 -0
  172. package/dist/tools/navigation/index.js +13 -0
  173. package/dist/tools/navigation/index.js.map +1 -0
  174. package/dist/tools/navigation/navigate.d.ts +19 -0
  175. package/dist/tools/navigation/navigate.d.ts.map +1 -0
  176. package/dist/tools/navigation/navigate.js +52 -0
  177. package/dist/tools/navigation/navigate.js.map +1 -0
  178. package/dist/tools/navigation/refresh.d.ts +15 -0
  179. package/dist/tools/navigation/refresh.d.ts.map +1 -0
  180. package/dist/tools/navigation/refresh.js +26 -0
  181. package/dist/tools/navigation/refresh.js.map +1 -0
  182. package/dist/tools/navigation/wait-for.d.ts +12 -0
  183. package/dist/tools/navigation/wait-for.d.ts.map +1 -0
  184. package/dist/tools/navigation/wait-for.js +23 -0
  185. package/dist/tools/navigation/wait-for.js.map +1 -0
  186. package/dist/tools/network/console.d.ts +17 -0
  187. package/dist/tools/network/console.d.ts.map +1 -0
  188. package/dist/tools/network/console.js +29 -0
  189. package/dist/tools/network/console.js.map +1 -0
  190. package/dist/tools/network/dialog.d.ts +14 -0
  191. package/dist/tools/network/dialog.d.ts.map +1 -0
  192. package/dist/tools/network/dialog.js +34 -0
  193. package/dist/tools/network/dialog.js.map +1 -0
  194. package/dist/tools/network/index.d.ts +3 -0
  195. package/dist/tools/network/index.d.ts.map +1 -0
  196. package/dist/tools/network/index.js +21 -0
  197. package/dist/tools/network/index.js.map +1 -0
  198. package/dist/tools/network/network-clear.d.ts +11 -0
  199. package/dist/tools/network/network-clear.d.ts.map +1 -0
  200. package/dist/tools/network/network-clear.js +24 -0
  201. package/dist/tools/network/network-clear.js.map +1 -0
  202. package/dist/tools/network/network-entries.d.ts +35 -0
  203. package/dist/tools/network/network-entries.d.ts.map +1 -0
  204. package/dist/tools/network/network-entries.js +73 -0
  205. package/dist/tools/network/network-entries.js.map +1 -0
  206. package/dist/tools/network/network-export.d.ts +14 -0
  207. package/dist/tools/network/network-export.d.ts.map +1 -0
  208. package/dist/tools/network/network-export.js +24 -0
  209. package/dist/tools/network/network-export.js.map +1 -0
  210. package/dist/tools/network/network-requests.d.ts +20 -0
  211. package/dist/tools/network/network-requests.d.ts.map +1 -0
  212. package/dist/tools/network/network-requests.js +36 -0
  213. package/dist/tools/network/network-requests.js.map +1 -0
  214. package/dist/tools/network/network-response.d.ts +14 -0
  215. package/dist/tools/network/network-response.d.ts.map +1 -0
  216. package/dist/tools/network/network-response.js +56 -0
  217. package/dist/tools/network/network-response.js.map +1 -0
  218. package/dist/tools/network/wait-nav.d.ts +15 -0
  219. package/dist/tools/network/wait-nav.d.ts.map +1 -0
  220. package/dist/tools/network/wait-nav.js +26 -0
  221. package/dist/tools/network/wait-nav.js.map +1 -0
  222. package/dist/tools/network/websocket-frames.d.ts +17 -0
  223. package/dist/tools/network/websocket-frames.d.ts.map +1 -0
  224. package/dist/tools/network/websocket-frames.js +24 -0
  225. package/dist/tools/network/websocket-frames.js.map +1 -0
  226. package/dist/tools/re/api-discover.d.ts +11 -0
  227. package/dist/tools/re/api-discover.d.ts.map +1 -0
  228. package/dist/tools/re/api-discover.js +57 -0
  229. package/dist/tools/re/api-discover.js.map +1 -0
  230. package/dist/tools/re/auth-analyze.d.ts +11 -0
  231. package/dist/tools/re/auth-analyze.d.ts.map +1 -0
  232. package/dist/tools/re/auth-analyze.js +86 -0
  233. package/dist/tools/re/auth-analyze.js.map +1 -0
  234. package/dist/tools/re/index.d.ts +3 -0
  235. package/dist/tools/re/index.d.ts.map +1 -0
  236. package/dist/tools/re/index.js +11 -0
  237. package/dist/tools/re/index.js.map +1 -0
  238. package/dist/tools/re/js-beautify.d.ts +14 -0
  239. package/dist/tools/re/js-beautify.d.ts.map +1 -0
  240. package/dist/tools/re/js-beautify.js +132 -0
  241. package/dist/tools/re/js-beautify.js.map +1 -0
  242. package/dist/tools/re/js-deobfuscate.d.ts +11 -0
  243. package/dist/tools/re/js-deobfuscate.d.ts.map +1 -0
  244. package/dist/tools/re/js-deobfuscate.js +96 -0
  245. package/dist/tools/re/js-deobfuscate.js.map +1 -0
  246. package/dist/tools/session/close.d.ts +11 -0
  247. package/dist/tools/session/close.d.ts.map +1 -0
  248. package/dist/tools/session/close.js +24 -0
  249. package/dist/tools/session/close.js.map +1 -0
  250. package/dist/tools/session/index.d.ts +3 -0
  251. package/dist/tools/session/index.d.ts.map +1 -0
  252. package/dist/tools/session/index.js +9 -0
  253. package/dist/tools/session/index.js.map +1 -0
  254. package/dist/tools/session/list.d.ts +14 -0
  255. package/dist/tools/session/list.d.ts.map +1 -0
  256. package/dist/tools/session/list.js +26 -0
  257. package/dist/tools/session/list.js.map +1 -0
  258. package/dist/tools/session/open.d.ts +11 -0
  259. package/dist/tools/session/open.d.ts.map +1 -0
  260. package/dist/tools/session/open.js +25 -0
  261. package/dist/tools/session/open.js.map +1 -0
  262. package/dist/tools/stealth/fingerprint.d.ts +11 -0
  263. package/dist/tools/stealth/fingerprint.d.ts.map +1 -0
  264. package/dist/tools/stealth/fingerprint.js +72 -0
  265. package/dist/tools/stealth/fingerprint.js.map +1 -0
  266. package/dist/tools/stealth/human-behavior.d.ts +29 -0
  267. package/dist/tools/stealth/human-behavior.d.ts.map +1 -0
  268. package/dist/tools/stealth/human-behavior.js +86 -0
  269. package/dist/tools/stealth/human-behavior.js.map +1 -0
  270. package/dist/tools/stealth/index.d.ts +3 -0
  271. package/dist/tools/stealth/index.d.ts.map +1 -0
  272. package/dist/tools/stealth/index.js +7 -0
  273. package/dist/tools/stealth/index.js.map +1 -0
  274. package/package.json +40 -0
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, okResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ import { sanitizeInput } from '../../core/sandbox.js';
5
+ function deobfuscateJS(code) {
6
+ let result = code;
7
+ const transformations = [];
8
+ const summary = { hexStringsDecoded: 0, unicodeEscapesDecoded: 0, base64StringsDetected: 0, numericExpressionsEvaluated: 0 };
9
+ const hexRegex = /\\x([0-9a-fA-F]{2})/g;
10
+ const hexMatches = result.match(hexRegex);
11
+ if (hexMatches) {
12
+ summary.hexStringsDecoded = hexMatches.length;
13
+ result = result.replace(hexRegex, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
14
+ transformations.push(`Decoded ${summary.hexStringsDecoded} hex escape sequences`);
15
+ }
16
+ const unicodeRegex = /\\u([0-9a-fA-F]{4})/g;
17
+ const unicodeMatches = result.match(unicodeRegex);
18
+ if (unicodeMatches) {
19
+ summary.unicodeEscapesDecoded = unicodeMatches.length;
20
+ result = result.replace(unicodeRegex, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
21
+ transformations.push(`Decoded ${summary.unicodeEscapesDecoded} unicode escape sequences`);
22
+ }
23
+ const unicodeCurlyRegex = /\\u\{([0-9a-fA-F]+)\}/g;
24
+ const unicodeCurlyMatches = result.match(unicodeCurlyRegex);
25
+ if (unicodeCurlyMatches) {
26
+ summary.unicodeEscapesDecoded += unicodeCurlyMatches.length;
27
+ result = result.replace(unicodeCurlyRegex, (_, hex) => String.fromCodePoint(Number.parseInt(hex, 16)));
28
+ transformations.push(`Decoded ${unicodeCurlyMatches.length} extended unicode escape sequences`);
29
+ }
30
+ const base64Regex = /["']([A-Za-z0-9+/]{20,}={0,2})["']/g;
31
+ const base64Candidates = new Set();
32
+ let b64Match;
33
+ while ((b64Match = base64Regex.exec(code)) !== null) {
34
+ const candidate = b64Match[1];
35
+ try {
36
+ const decoded = Buffer.from(candidate, 'base64').toString('utf-8');
37
+ if (decoded.length > 4 && /[\w\s,.;:!?(){}\[\]<>@#$%^&*+=\-|/~`]+/.test(decoded) && !decoded.includes('\uFFFD')) {
38
+ base64Candidates.add(candidate);
39
+ }
40
+ }
41
+ catch { /* not valid base64 */ }
42
+ }
43
+ summary.base64StringsDetected = base64Candidates.size;
44
+ if (base64Candidates.size > 0) {
45
+ transformations.push(`Detected ${base64Candidates.size} potential base64 encoded strings`);
46
+ }
47
+ const numberExprRegex = /0x[0-9a-fA-F]+/g;
48
+ const hexNumberMatches = result.match(numberExprRegex);
49
+ if (hexNumberMatches) {
50
+ summary.numericExpressionsEvaluated = hexNumberMatches.length;
51
+ result = result.replace(numberExprRegex, (match) => String(Number.parseInt(match, 16)));
52
+ transformations.push(`Evaluated ${summary.numericExpressionsEvaluated} hex numeric expressions`);
53
+ }
54
+ const concatBinary = /(\d+)\s*\+\s*(\d+)/g;
55
+ let concatMatch;
56
+ let concatFound = 0;
57
+ const evaluated = new Set();
58
+ while ((concatMatch = concatBinary.exec(result)) !== null) {
59
+ const expr = concatMatch[0];
60
+ if (!evaluated.has(expr)) {
61
+ evaluated.add(expr);
62
+ concatFound++;
63
+ }
64
+ }
65
+ if (concatFound > 0) {
66
+ summary.numericExpressionsEvaluated += concatFound;
67
+ result = result.replace(concatBinary, (_, a, b) => String(Number(a) + Number(b)));
68
+ transformations.push(`Evaluated ${concatFound} simple numeric expressions`);
69
+ }
70
+ return { code: result, transformations, summary };
71
+ }
72
+ export const JsDeobfuscateArgs = z.object({
73
+ code: z.string().min(1).describe('Obfuscated JavaScript code to clean'),
74
+ });
75
+ export const jsDeobfuscateHandler = async (args, _ctx) => {
76
+ const parsed = JsDeobfuscateArgs.safeParse(args);
77
+ if (!parsed.success)
78
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
79
+ const { code } = parsed.data;
80
+ const { sanitized: safeCode } = sanitizeInput(code);
81
+ try {
82
+ const result = deobfuscateJS(safeCode);
83
+ return okResult({
84
+ originalLength: safeCode.length,
85
+ deobfuscatedLength: result.code.length,
86
+ transformations: result.transformations,
87
+ summary: result.summary,
88
+ code: result.code,
89
+ });
90
+ }
91
+ catch (err) {
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ return errorResult(ErrorCode.DEOBFUSCATE_FAILED, message);
94
+ }
95
+ };
96
+ //# sourceMappingURL=js-deobfuscate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-deobfuscate.js","sourceRoot":"","sources":["../../../src/tools/re/js-deobfuscate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../../core/registry.js';
3
+ export declare const CloseSessionArgs: z.ZodObject<{
4
+ sessionId: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ sessionId: string;
7
+ }, {
8
+ sessionId: string;
9
+ }>;
10
+ export declare const closeSessionHandler: ToolHandler;
11
+ //# sourceMappingURL=close.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../src/tools/session/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,gBAAgB;;;;;;EAE3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAajC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, okResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ export const CloseSessionArgs = z.object({
5
+ sessionId: z.string().min(1),
6
+ });
7
+ export const closeSessionHandler = async (args, ctx) => {
8
+ const parsed = CloseSessionArgs.safeParse(args);
9
+ if (!parsed.success)
10
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
11
+ const { sessionId } = parsed.data;
12
+ const sm = ctx.sessionManager;
13
+ if (!sm)
14
+ return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
15
+ try {
16
+ await sm.destroySession(sessionId);
17
+ return okResult({ sessionId, closed: true });
18
+ }
19
+ catch (err) {
20
+ const message = err instanceof Error ? err.message : String(err);
21
+ return errorResult(ErrorCode.SESSION_CLOSE_FAILED, message);
22
+ }
23
+ };
24
+ //# sourceMappingURL=close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/tools/session/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolRegistry } from '../../core/registry.js';
2
+ export declare function registerSessionTools(registry: ToolRegistry): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAK3D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAajE"}
@@ -0,0 +1,9 @@
1
+ import { openSessionHandler, OpenSessionArgs } from './open.js';
2
+ import { closeSessionHandler, CloseSessionArgs } from './close.js';
3
+ import { listSessionsHandler, ListSessionsArgs } from './list.js';
4
+ export function registerSessionTools(registry) {
5
+ registry.register({ name: 'browser_open_session', description: 'Open a new browser session (tab)', category: 'session', schema: OpenSessionArgs }, openSessionHandler);
6
+ registry.register({ name: 'browser_close_session', description: 'Close a browser session by ID', category: 'session', schema: CloseSessionArgs }, closeSessionHandler);
7
+ registry.register({ name: 'browser_list_sessions', description: 'List all active browser sessions', category: 'session', schema: ListSessionsArgs }, listSessionsHandler);
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/session/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,EAC/H,kBAAkB,CACnB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAC9H,mBAAmB,CACpB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,EACjI,mBAAmB,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../../core/registry.js';
3
+ export declare const ListSessionsArgs: z.ZodObject<{
4
+ offset: z.ZodOptional<z.ZodNumber>;
5
+ limit: z.ZodOptional<z.ZodNumber>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ offset?: number | undefined;
8
+ limit?: number | undefined;
9
+ }, {
10
+ offset?: number | undefined;
11
+ limit?: number | undefined;
12
+ }>;
13
+ export declare const listSessionsHandler: ToolHandler;
14
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/tools/session/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAcjC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, applyPagination, paginatedOkResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ export const ListSessionsArgs = z.object({
5
+ offset: z.number().int().min(0).optional(),
6
+ limit: z.number().int().min(1).max(100).optional(),
7
+ });
8
+ export const listSessionsHandler = async (args, ctx) => {
9
+ const sm = ctx.sessionManager;
10
+ if (!sm)
11
+ return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
12
+ try {
13
+ const parsed = ListSessionsArgs.safeParse(args);
14
+ if (!parsed.success)
15
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
16
+ const { offset, limit } = parsed.data;
17
+ const sessions = sm.listSessions ? await sm.listSessions() : [];
18
+ const { items, totalCount } = applyPagination(sessions, { offset, limit });
19
+ return paginatedOkResult(items, totalCount, offset ?? 0, limit ?? 50);
20
+ }
21
+ catch (err) {
22
+ const message = err instanceof Error ? err.message : String(err);
23
+ return errorResult(ErrorCode.LIST_SESSIONS_FAILED, message);
24
+ }
25
+ };
26
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/tools/session/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,OAAO,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../../core/registry.js';
3
+ export declare const OpenSessionArgs: z.ZodObject<{
4
+ sessionId: z.ZodOptional<z.ZodString>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ sessionId?: string | undefined;
7
+ }, {
8
+ sessionId?: string | undefined;
9
+ }>;
10
+ export declare const openSessionHandler: ToolHandler;
11
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/tools/session/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,WAchC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, okResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ export const OpenSessionArgs = z.object({
5
+ sessionId: z.string().optional(),
6
+ });
7
+ export const openSessionHandler = async (args, ctx) => {
8
+ const parsed = OpenSessionArgs.safeParse(args);
9
+ if (!parsed.success)
10
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
11
+ const { sessionId } = parsed.data;
12
+ const sm = ctx.sessionManager;
13
+ if (!sm)
14
+ return errorResult(ErrorCode.SESSION_MANAGER_UNAVAILABLE, 'Session manager not available');
15
+ try {
16
+ const id = sessionId ?? `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
17
+ await sm.getOrCreateSession(id);
18
+ return okResult({ sessionId: id, created: true });
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ return errorResult(ErrorCode.SESSION_OPEN_FAILED, message);
23
+ }
24
+ };
25
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/tools/session/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;IACpG,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,SAAS,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../../core/registry.js';
3
+ export declare const FingerprintArgs: z.ZodObject<{
4
+ platform: z.ZodOptional<z.ZodEnum<["windows", "mac", "linux"]>>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ platform?: "windows" | "mac" | "linux" | undefined;
7
+ }, {
8
+ platform?: "windows" | "mac" | "linux" | undefined;
9
+ }>;
10
+ export declare const fingerprintHandler: ToolHandler;
11
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AA0D1D,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,WAWhC,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, okResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ const USER_AGENTS = [
5
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
6
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
7
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0',
8
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0',
9
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
10
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
11
+ ];
12
+ const VIEWPORTS = [
13
+ { width: 1920, height: 1080 },
14
+ { width: 1366, height: 768 },
15
+ { width: 1536, height: 864 },
16
+ { width: 1440, height: 900 },
17
+ { width: 1280, height: 720 },
18
+ { width: 2560, height: 1440 },
19
+ ];
20
+ const TIMEZONES = [
21
+ 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles',
22
+ 'Europe/London', 'Europe/Berlin', 'Europe/Paris', 'Europe/Istanbul',
23
+ 'Asia/Tokyo', 'Asia/Shanghai', 'Asia/Seoul', 'Asia/Dubai',
24
+ 'Australia/Sydney', 'Pacific/Auckland',
25
+ ];
26
+ const LOCALES = ['en-US', 'en-GB', 'de-DE', 'fr-FR', 'es-ES', 'ja-JP', 'ko-KR', 'zh-CN', 'tr-TR', 'ar-SA'];
27
+ function pickRandom(arr) {
28
+ return arr[Math.floor(Math.random() * arr.length)];
29
+ }
30
+ function generateProfile(platform) {
31
+ let ua;
32
+ if (platform === 'windows') {
33
+ ua = pickRandom(USER_AGENTS.filter(a => a.includes('Windows')));
34
+ }
35
+ else if (platform === 'mac') {
36
+ ua = pickRandom(USER_AGENTS.filter(a => a.includes('Macintosh')));
37
+ }
38
+ else if (platform === 'linux') {
39
+ ua = pickRandom(USER_AGENTS.filter(a => a.includes('Linux')));
40
+ }
41
+ else {
42
+ ua = pickRandom(USER_AGENTS);
43
+ }
44
+ const viewport = pickRandom(VIEWPORTS);
45
+ const timezone = pickRandom(TIMEZONES);
46
+ const locale = pickRandom(LOCALES);
47
+ return {
48
+ userAgent: ua,
49
+ viewport,
50
+ timezone,
51
+ locale,
52
+ platform: platform ?? 'random',
53
+ };
54
+ }
55
+ export const FingerprintArgs = z.object({
56
+ platform: z.enum(['windows', 'mac', 'linux']).optional().describe('Target platform'),
57
+ });
58
+ export const fingerprintHandler = async (args, _ctx) => {
59
+ const parsed = FingerprintArgs.safeParse(args);
60
+ if (!parsed.success)
61
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
62
+ const { platform } = parsed.data;
63
+ try {
64
+ const profile = generateProfile(platform);
65
+ return okResult(profile);
66
+ }
67
+ catch (err) {
68
+ const message = err instanceof Error ? err.message : String(err);
69
+ return errorResult(ErrorCode.FINGERPRINT_FAILED, message);
70
+ }
71
+ };
72
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/tools/stealth/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,WAAW,GAAG;IAClB,iHAAiH;IACjH,uHAAuH;IACvH,kFAAkF;IAClF,sFAAsF;IACtF,+HAA+H;IAC/H,uGAAuG;CACxG,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CAC9B,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB;IAC9E,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB;IACnE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY;IACzD,kBAAkB,EAAE,kBAAkB;CACvC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE3G,SAAS,UAAU,CAAI,GAAQ;IAC7B,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,EAAU,CAAC;IACf,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEnC,OAAO;QACL,SAAS,EAAE,EAAE;QACb,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,QAAQ,EAAE,QAAQ,IAAI,QAAQ;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { ToolHandler } from '../../core/registry.js';
3
+ export declare const HumanBehaviorArgs: z.ZodObject<{
4
+ action: z.ZodEnum<["typing", "mouse", "scroll"]>;
5
+ text: z.ZodOptional<z.ZodString>;
6
+ startX: z.ZodOptional<z.ZodNumber>;
7
+ startY: z.ZodOptional<z.ZodNumber>;
8
+ endX: z.ZodOptional<z.ZodNumber>;
9
+ endY: z.ZodOptional<z.ZodNumber>;
10
+ skillLevel: z.ZodDefault<z.ZodEnum<["slow", "normal", "fast"]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ skillLevel: "slow" | "normal" | "fast";
13
+ action: "scroll" | "typing" | "mouse";
14
+ text?: string | undefined;
15
+ startX?: number | undefined;
16
+ startY?: number | undefined;
17
+ endX?: number | undefined;
18
+ endY?: number | undefined;
19
+ }, {
20
+ action: "scroll" | "typing" | "mouse";
21
+ text?: string | undefined;
22
+ skillLevel?: "slow" | "normal" | "fast" | undefined;
23
+ startX?: number | undefined;
24
+ startY?: number | undefined;
25
+ endX?: number | undefined;
26
+ endY?: number | undefined;
27
+ }>;
28
+ export declare const humanBehaviorHandler: ToolHandler;
29
+ //# sourceMappingURL=human-behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-behavior.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/human-behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAgD1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,WAkClC,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, okResult } from '../../core/output.js';
3
+ import { ErrorCode } from '../../core/errors.js';
4
+ function generateTypingProfile(text, skillLevel) {
5
+ const speedConfig = {
6
+ slow: { minDelay: 120, maxDelay: 350, mistakeRate: 0.08, pauseEvery: 5, pauseDurationMs: 600 },
7
+ normal: { minDelay: 60, maxDelay: 180, mistakeRate: 0.03, pauseEvery: 8, pauseDurationMs: 300 },
8
+ fast: { minDelay: 30, maxDelay: 80, mistakeRate: 0.01, pauseEvery: 12, pauseDurationMs: 150 },
9
+ };
10
+ const config = speedConfig[skillLevel];
11
+ const delays = [];
12
+ for (let i = 0; i < text.length; i++) {
13
+ const delay = config.minDelay + Math.random() * (config.maxDelay - config.minDelay);
14
+ delays.push(Math.round(delay));
15
+ }
16
+ return {
17
+ textLength: text.length,
18
+ skillLevel,
19
+ estimatedTypingTimeMs: delays.reduce((a, b) => a + b, 0),
20
+ delays,
21
+ mistakes: Math.round(text.length * config.mistakeRate),
22
+ pausesEvery: config.pauseEvery,
23
+ pauseDurationMs: config.pauseDurationMs,
24
+ };
25
+ }
26
+ function generateMousePath(startX, startY, endX, endY) {
27
+ const steps = 5 + Math.floor(Math.random() * 10);
28
+ const points = [];
29
+ const totalTime = 200 + Math.random() * 600;
30
+ for (let i = 0; i <= steps; i++) {
31
+ const t = i / steps;
32
+ const eased = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
33
+ const jitterX = (Math.random() - 0.5) * 3;
34
+ const jitterY = (Math.random() - 0.5) * 3;
35
+ points.push({
36
+ x: Math.round(startX + (endX - startX) * eased + jitterX),
37
+ y: Math.round(startY + (endY - startY) * eased + jitterY),
38
+ t: Math.round(t * totalTime),
39
+ });
40
+ }
41
+ return { start: { x: startX, y: startY }, end: { x: endX, y: endY }, points, totalTimeMs: Math.round(totalTime) };
42
+ }
43
+ export const HumanBehaviorArgs = z.object({
44
+ action: z.enum(['typing', 'mouse', 'scroll']).describe('Type of human behavior simulation'),
45
+ text: z.string().optional().describe('Text for typing simulation'),
46
+ startX: z.number().optional().describe('Mouse start X'),
47
+ startY: z.number().optional().describe('Mouse start Y'),
48
+ endX: z.number().optional().describe('Mouse end X'),
49
+ endY: z.number().optional().describe('Mouse end Y'),
50
+ skillLevel: z.enum(['slow', 'normal', 'fast']).default('normal').describe('Typing skill level'),
51
+ });
52
+ export const humanBehaviorHandler = async (args, _ctx) => {
53
+ const parsed = HumanBehaviorArgs.safeParse(args);
54
+ if (!parsed.success)
55
+ return errorResult(ErrorCode.INVALID_ARGS, parsed.error.message);
56
+ const { action, text, startX, startY, endX, endY, skillLevel } = parsed.data;
57
+ try {
58
+ if (action === 'typing') {
59
+ if (!text)
60
+ return errorResult(ErrorCode.INVALID_ARGS, 'text is required for typing simulation');
61
+ const profile = generateTypingProfile(text, skillLevel);
62
+ return okResult({ action: 'typing', ...profile });
63
+ }
64
+ if (action === 'mouse') {
65
+ if (startX === undefined || startY === undefined || endX === undefined || endY === undefined) {
66
+ return errorResult(ErrorCode.INVALID_ARGS, 'startX, startY, endX, endY are required for mouse simulation');
67
+ }
68
+ const path = generateMousePath(startX, startY, endX, endY);
69
+ return okResult({ action: 'mouse', ...path });
70
+ }
71
+ if (action === 'scroll') {
72
+ return okResult({
73
+ action: 'scroll',
74
+ strategy: 'Incremental scroll with variable speed',
75
+ description: 'Scrolls in steps of 100-300px with 50-200ms delays between steps',
76
+ recommendation: 'Use page.evaluate to scroll: window.scrollBy({ top: 300, behavior: "smooth" })',
77
+ });
78
+ }
79
+ return errorResult(ErrorCode.INVALID_ARGS, `Unknown action: ${action}`);
80
+ }
81
+ catch (err) {
82
+ const message = err instanceof Error ? err.message : String(err);
83
+ return errorResult(ErrorCode.HUMAN_BEHAVIOR_FAILED, message);
84
+ }
85
+ };
86
+ //# sourceMappingURL=human-behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-behavior.js","sourceRoot":"","sources":["../../../src/tools/stealth/human-behavior.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolRegistry } from '../../core/registry.js';
2
+ export declare function registerStealthTools(registry: ToolRegistry): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/stealth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CASjE"}
@@ -0,0 +1,7 @@
1
+ import { fingerprintHandler, FingerprintArgs } from './fingerprint.js';
2
+ import { humanBehaviorHandler, HumanBehaviorArgs } from './human-behavior.js';
3
+ export function registerStealthTools(registry) {
4
+ registry.register({ name: 'browser_fingerprint', description: 'Generate randomized browser fingerprint profile', category: 'stealth', needsBrowser: false, schema: FingerprintArgs }, fingerprintHandler);
5
+ registry.register({ name: 'browser_human_behavior', description: 'Generate human-like typing, mouse, or scroll behavior profile', category: 'stealth', needsBrowser: false, schema: HumanBehaviorArgs }, humanBehaviorHandler);
6
+ }
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/stealth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,iDAAiD,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,EAClK,kBAAkB,CACnB,CAAC;IACF,QAAQ,CAAC,QAAQ,CACf,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,+DAA+D,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,EACrL,oBAAoB,CACrB,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@natchs/browser-mcp",
3
+ "version": "2.0.0",
4
+ "description": "MCP server for browser automation with reverse engineering focus",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "lint": "tsc --noEmit",
11
+ "test": "vitest run",
12
+ "test:watch": "vitest",
13
+ "test:coverage": "vitest run --coverage"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "keywords": [
19
+ "mcp",
20
+ "browser",
21
+ "playwright",
22
+ "automation"
23
+ ],
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@modelcontextprotocol/sdk": "^1.25.2",
27
+ "playwright": "^1.51.0",
28
+ "zod": "^3.24.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^24.3.0",
32
+ "@types/ws": "^8.18.1",
33
+ "@vitest/coverage-v8": "^3.2.6",
34
+ "typescript": "^5.8.0",
35
+ "vitest": "^3.2.6"
36
+ },
37
+ "engines": {
38
+ "node": ">=18"
39
+ }
40
+ }