notelm-mcp 1.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.
Files changed (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/auth/auth-manager.d.ts +139 -0
  4. package/dist/auth/auth-manager.d.ts.map +1 -0
  5. package/dist/auth/auth-manager.js +960 -0
  6. package/dist/auth/auth-manager.js.map +1 -0
  7. package/dist/config.d.ts +92 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +219 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/constants.d.ts +58 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +133 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/errors.d.ts +26 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +41 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +32 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +325 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/library/notebook-library.d.ts +70 -0
  24. package/dist/library/notebook-library.d.ts.map +1 -0
  25. package/dist/library/notebook-library.js +279 -0
  26. package/dist/library/notebook-library.js.map +1 -0
  27. package/dist/library/types.d.ts +67 -0
  28. package/dist/library/types.d.ts.map +1 -0
  29. package/dist/library/types.js +8 -0
  30. package/dist/library/types.js.map +1 -0
  31. package/dist/playwright.config.d.ts +3 -0
  32. package/dist/playwright.config.d.ts.map +1 -0
  33. package/dist/playwright.config.js +38 -0
  34. package/dist/playwright.config.js.map +1 -0
  35. package/dist/resources/resource-handlers.d.ts +22 -0
  36. package/dist/resources/resource-handlers.d.ts.map +1 -0
  37. package/dist/resources/resource-handlers.js +216 -0
  38. package/dist/resources/resource-handlers.js.map +1 -0
  39. package/dist/scripts/save-auth-state.d.ts +2 -0
  40. package/dist/scripts/save-auth-state.d.ts.map +1 -0
  41. package/dist/scripts/save-auth-state.js +91 -0
  42. package/dist/scripts/save-auth-state.js.map +1 -0
  43. package/dist/session/browser-session.d.ts +108 -0
  44. package/dist/session/browser-session.d.ts.map +1 -0
  45. package/dist/session/browser-session.js +636 -0
  46. package/dist/session/browser-session.js.map +1 -0
  47. package/dist/session/session-manager.d.ts +76 -0
  48. package/dist/session/session-manager.d.ts.map +1 -0
  49. package/dist/session/session-manager.js +273 -0
  50. package/dist/session/session-manager.js.map +1 -0
  51. package/dist/session/shared-context-manager.d.ts +107 -0
  52. package/dist/session/shared-context-manager.d.ts.map +1 -0
  53. package/dist/session/shared-context-manager.js +447 -0
  54. package/dist/session/shared-context-manager.js.map +1 -0
  55. package/dist/src/auth/auth-manager.d.ts +139 -0
  56. package/dist/src/auth/auth-manager.d.ts.map +1 -0
  57. package/dist/src/auth/auth-manager.js +960 -0
  58. package/dist/src/auth/auth-manager.js.map +1 -0
  59. package/dist/src/config.d.ts +92 -0
  60. package/dist/src/config.d.ts.map +1 -0
  61. package/dist/src/config.js +219 -0
  62. package/dist/src/config.js.map +1 -0
  63. package/dist/src/constants.d.ts +58 -0
  64. package/dist/src/constants.d.ts.map +1 -0
  65. package/dist/src/constants.js +133 -0
  66. package/dist/src/constants.js.map +1 -0
  67. package/dist/src/errors.d.ts +26 -0
  68. package/dist/src/errors.d.ts.map +1 -0
  69. package/dist/src/errors.js +41 -0
  70. package/dist/src/errors.js.map +1 -0
  71. package/dist/src/index.d.ts +32 -0
  72. package/dist/src/index.d.ts.map +1 -0
  73. package/dist/src/index.js +325 -0
  74. package/dist/src/index.js.map +1 -0
  75. package/dist/src/library/notebook-library.d.ts +70 -0
  76. package/dist/src/library/notebook-library.d.ts.map +1 -0
  77. package/dist/src/library/notebook-library.js +279 -0
  78. package/dist/src/library/notebook-library.js.map +1 -0
  79. package/dist/src/library/types.d.ts +67 -0
  80. package/dist/src/library/types.d.ts.map +1 -0
  81. package/dist/src/library/types.js +8 -0
  82. package/dist/src/library/types.js.map +1 -0
  83. package/dist/src/resources/resource-handlers.d.ts +22 -0
  84. package/dist/src/resources/resource-handlers.d.ts.map +1 -0
  85. package/dist/src/resources/resource-handlers.js +216 -0
  86. package/dist/src/resources/resource-handlers.js.map +1 -0
  87. package/dist/src/scripts/health-check.d.ts +13 -0
  88. package/dist/src/scripts/health-check.d.ts.map +1 -0
  89. package/dist/src/scripts/health-check.js +100 -0
  90. package/dist/src/scripts/health-check.js.map +1 -0
  91. package/dist/src/session/browser-session.d.ts +108 -0
  92. package/dist/src/session/browser-session.d.ts.map +1 -0
  93. package/dist/src/session/browser-session.js +642 -0
  94. package/dist/src/session/browser-session.js.map +1 -0
  95. package/dist/src/session/session-manager.d.ts +76 -0
  96. package/dist/src/session/session-manager.d.ts.map +1 -0
  97. package/dist/src/session/session-manager.js +273 -0
  98. package/dist/src/session/session-manager.js.map +1 -0
  99. package/dist/src/session/shared-context-manager.d.ts +107 -0
  100. package/dist/src/session/shared-context-manager.d.ts.map +1 -0
  101. package/dist/src/session/shared-context-manager.js +447 -0
  102. package/dist/src/session/shared-context-manager.js.map +1 -0
  103. package/dist/src/tools/definitions/ask-question.d.ts +8 -0
  104. package/dist/src/tools/definitions/ask-question.d.ts.map +1 -0
  105. package/dist/src/tools/definitions/ask-question.js +211 -0
  106. package/dist/src/tools/definitions/ask-question.js.map +1 -0
  107. package/dist/src/tools/definitions/notebook-management.d.ts +3 -0
  108. package/dist/src/tools/definitions/notebook-management.d.ts.map +1 -0
  109. package/dist/src/tools/definitions/notebook-management.js +243 -0
  110. package/dist/src/tools/definitions/notebook-management.js.map +1 -0
  111. package/dist/src/tools/definitions/session-management.d.ts +3 -0
  112. package/dist/src/tools/definitions/session-management.d.ts.map +1 -0
  113. package/dist/src/tools/definitions/session-management.js +41 -0
  114. package/dist/src/tools/definitions/session-management.js.map +1 -0
  115. package/dist/src/tools/definitions/system.d.ts +3 -0
  116. package/dist/src/tools/definitions/system.d.ts.map +1 -0
  117. package/dist/src/tools/definitions/system.js +143 -0
  118. package/dist/src/tools/definitions/system.js.map +1 -0
  119. package/dist/src/tools/definitions.d.ts +12 -0
  120. package/dist/src/tools/definitions.d.ts.map +1 -0
  121. package/dist/src/tools/definitions.js +26 -0
  122. package/dist/src/tools/definitions.js.map +1 -0
  123. package/dist/src/tools/handlers.d.ts +212 -0
  124. package/dist/src/tools/handlers.d.ts.map +1 -0
  125. package/dist/src/tools/handlers.js +712 -0
  126. package/dist/src/tools/handlers.js.map +1 -0
  127. package/dist/src/tools/index.d.ts +8 -0
  128. package/dist/src/tools/index.d.ts.map +1 -0
  129. package/dist/src/tools/index.js +8 -0
  130. package/dist/src/tools/index.js.map +1 -0
  131. package/dist/src/types.d.ts +88 -0
  132. package/dist/src/types.d.ts.map +1 -0
  133. package/dist/src/types.js +5 -0
  134. package/dist/src/types.js.map +1 -0
  135. package/dist/src/utils/auth-manager.d.ts +2 -0
  136. package/dist/src/utils/auth-manager.d.ts.map +1 -0
  137. package/dist/src/utils/auth-manager.js +25 -0
  138. package/dist/src/utils/auth-manager.js.map +1 -0
  139. package/dist/src/utils/cleanup-manager.d.ts +133 -0
  140. package/dist/src/utils/cleanup-manager.d.ts.map +1 -0
  141. package/dist/src/utils/cleanup-manager.js +673 -0
  142. package/dist/src/utils/cleanup-manager.js.map +1 -0
  143. package/dist/src/utils/cli-handler.d.ts +16 -0
  144. package/dist/src/utils/cli-handler.d.ts.map +1 -0
  145. package/dist/src/utils/cli-handler.js +102 -0
  146. package/dist/src/utils/cli-handler.js.map +1 -0
  147. package/dist/src/utils/logger.d.ts +61 -0
  148. package/dist/src/utils/logger.d.ts.map +1 -0
  149. package/dist/src/utils/logger.js +92 -0
  150. package/dist/src/utils/logger.js.map +1 -0
  151. package/dist/src/utils/page-utils.d.ts +54 -0
  152. package/dist/src/utils/page-utils.d.ts.map +1 -0
  153. package/dist/src/utils/page-utils.js +381 -0
  154. package/dist/src/utils/page-utils.js.map +1 -0
  155. package/dist/src/utils/rate-limit-handler.d.ts +42 -0
  156. package/dist/src/utils/rate-limit-handler.d.ts.map +1 -0
  157. package/dist/src/utils/rate-limit-handler.js +88 -0
  158. package/dist/src/utils/rate-limit-handler.js.map +1 -0
  159. package/dist/src/utils/rate-limit-handler.test.d.ts +7 -0
  160. package/dist/src/utils/rate-limit-handler.test.d.ts.map +1 -0
  161. package/dist/src/utils/rate-limit-handler.test.js +86 -0
  162. package/dist/src/utils/rate-limit-handler.test.js.map +1 -0
  163. package/dist/src/utils/settings-manager.d.ts +37 -0
  164. package/dist/src/utils/settings-manager.d.ts.map +1 -0
  165. package/dist/src/utils/settings-manager.js +121 -0
  166. package/dist/src/utils/settings-manager.js.map +1 -0
  167. package/dist/src/utils/stealth-utils.d.ts +135 -0
  168. package/dist/src/utils/stealth-utils.d.ts.map +1 -0
  169. package/dist/src/utils/stealth-utils.js +396 -0
  170. package/dist/src/utils/stealth-utils.js.map +1 -0
  171. package/dist/src/utils/stealth-utils.test.d.ts +7 -0
  172. package/dist/src/utils/stealth-utils.test.d.ts.map +1 -0
  173. package/dist/src/utils/stealth-utils.test.js +72 -0
  174. package/dist/src/utils/stealth-utils.test.js.map +1 -0
  175. package/dist/tests/e2e/authenticated.spec.d.ts +2 -0
  176. package/dist/tests/e2e/authenticated.spec.d.ts.map +1 -0
  177. package/dist/tests/e2e/authenticated.spec.js +41 -0
  178. package/dist/tests/e2e/authenticated.spec.js.map +1 -0
  179. package/dist/tests/e2e/mocked.spec.d.ts +2 -0
  180. package/dist/tests/e2e/mocked.spec.d.ts.map +1 -0
  181. package/dist/tests/e2e/mocked.spec.js +32 -0
  182. package/dist/tests/e2e/mocked.spec.js.map +1 -0
  183. package/dist/tests/mocks/handlers.d.ts +4 -0
  184. package/dist/tests/mocks/handlers.d.ts.map +1 -0
  185. package/dist/tests/mocks/handlers.js +55 -0
  186. package/dist/tests/mocks/handlers.js.map +1 -0
  187. package/dist/tests/mocks/setup.d.ts +3 -0
  188. package/dist/tests/mocks/setup.d.ts.map +1 -0
  189. package/dist/tests/mocks/setup.js +77 -0
  190. package/dist/tests/mocks/setup.js.map +1 -0
  191. package/dist/tools/definitions/ask-question.d.ts +8 -0
  192. package/dist/tools/definitions/ask-question.d.ts.map +1 -0
  193. package/dist/tools/definitions/ask-question.js +211 -0
  194. package/dist/tools/definitions/ask-question.js.map +1 -0
  195. package/dist/tools/definitions/notebook-management.d.ts +3 -0
  196. package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
  197. package/dist/tools/definitions/notebook-management.js +243 -0
  198. package/dist/tools/definitions/notebook-management.js.map +1 -0
  199. package/dist/tools/definitions/session-management.d.ts +3 -0
  200. package/dist/tools/definitions/session-management.d.ts.map +1 -0
  201. package/dist/tools/definitions/session-management.js +41 -0
  202. package/dist/tools/definitions/session-management.js.map +1 -0
  203. package/dist/tools/definitions/system.d.ts +3 -0
  204. package/dist/tools/definitions/system.d.ts.map +1 -0
  205. package/dist/tools/definitions/system.js +143 -0
  206. package/dist/tools/definitions/system.js.map +1 -0
  207. package/dist/tools/definitions.d.ts +12 -0
  208. package/dist/tools/definitions.d.ts.map +1 -0
  209. package/dist/tools/definitions.js +26 -0
  210. package/dist/tools/definitions.js.map +1 -0
  211. package/dist/tools/handlers.d.ts +212 -0
  212. package/dist/tools/handlers.d.ts.map +1 -0
  213. package/dist/tools/handlers.js +712 -0
  214. package/dist/tools/handlers.js.map +1 -0
  215. package/dist/tools/index.d.ts +8 -0
  216. package/dist/tools/index.d.ts.map +1 -0
  217. package/dist/tools/index.js +8 -0
  218. package/dist/tools/index.js.map +1 -0
  219. package/dist/types.d.ts +82 -0
  220. package/dist/types.d.ts.map +1 -0
  221. package/dist/types.js +5 -0
  222. package/dist/types.js.map +1 -0
  223. package/dist/utils/cleanup-manager.d.ts +133 -0
  224. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  225. package/dist/utils/cleanup-manager.js +673 -0
  226. package/dist/utils/cleanup-manager.js.map +1 -0
  227. package/dist/utils/cli-handler.d.ts +16 -0
  228. package/dist/utils/cli-handler.d.ts.map +1 -0
  229. package/dist/utils/cli-handler.js +102 -0
  230. package/dist/utils/cli-handler.js.map +1 -0
  231. package/dist/utils/logger.d.ts +61 -0
  232. package/dist/utils/logger.d.ts.map +1 -0
  233. package/dist/utils/logger.js +92 -0
  234. package/dist/utils/logger.js.map +1 -0
  235. package/dist/utils/page-utils.d.ts +54 -0
  236. package/dist/utils/page-utils.d.ts.map +1 -0
  237. package/dist/utils/page-utils.js +381 -0
  238. package/dist/utils/page-utils.js.map +1 -0
  239. package/dist/utils/rate-limit-handler.d.ts +42 -0
  240. package/dist/utils/rate-limit-handler.d.ts.map +1 -0
  241. package/dist/utils/rate-limit-handler.js +88 -0
  242. package/dist/utils/rate-limit-handler.js.map +1 -0
  243. package/dist/utils/rate-limit-handler.test.d.ts +7 -0
  244. package/dist/utils/rate-limit-handler.test.d.ts.map +1 -0
  245. package/dist/utils/rate-limit-handler.test.js +91 -0
  246. package/dist/utils/rate-limit-handler.test.js.map +1 -0
  247. package/dist/utils/settings-manager.d.ts +37 -0
  248. package/dist/utils/settings-manager.d.ts.map +1 -0
  249. package/dist/utils/settings-manager.js +121 -0
  250. package/dist/utils/settings-manager.js.map +1 -0
  251. package/dist/utils/stealth-utils.d.ts +135 -0
  252. package/dist/utils/stealth-utils.d.ts.map +1 -0
  253. package/dist/utils/stealth-utils.js +396 -0
  254. package/dist/utils/stealth-utils.js.map +1 -0
  255. package/dist/utils/stealth-utils.test.d.ts +7 -0
  256. package/dist/utils/stealth-utils.test.d.ts.map +1 -0
  257. package/dist/utils/stealth-utils.test.js +72 -0
  258. package/dist/utils/stealth-utils.test.js.map +1 -0
  259. package/docs/01_configuration.md +94 -0
  260. package/docs/02_tools.md +34 -0
  261. package/docs/03_troubleshooting.md +59 -0
  262. package/docs/04_usage-guide.md +245 -0
  263. package/docs/05_project-analysis.qmd +309 -0
  264. package/docs/06_integration-analysis.html +914 -0
  265. package/docs/06_integration-analysis.qmd +255 -0
  266. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
  267. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  268. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  269. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap.min.js +7 -0
  270. package/docs/06_integration-analysis_files/libs/clipboard/clipboard.min.js +7 -0
  271. package/docs/06_integration-analysis_files/libs/quarto-html/anchor.min.js +9 -0
  272. package/docs/06_integration-analysis_files/libs/quarto-html/axe/axe-check.js +145 -0
  273. package/docs/06_integration-analysis_files/libs/quarto-html/popper.min.js +6 -0
  274. package/docs/06_integration-analysis_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  275. package/docs/06_integration-analysis_files/libs/quarto-html/quarto.js +847 -0
  276. package/docs/06_integration-analysis_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  277. package/docs/06_integration-analysis_files/libs/quarto-html/tippy.css +1 -0
  278. package/docs/06_integration-analysis_files/libs/quarto-html/tippy.umd.min.js +2 -0
  279. package/docs/07_e2e-testing-safety.qmd +754 -0
  280. package/docs/08_project-re-evaluation.html +609 -0
  281. package/docs/08_project-re-evaluation.qmd +86 -0
  282. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
  283. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  284. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  285. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap.min.js +7 -0
  286. package/docs/08_project-re-evaluation_files/libs/clipboard/clipboard.min.js +7 -0
  287. package/docs/08_project-re-evaluation_files/libs/quarto-html/anchor.min.js +9 -0
  288. package/docs/08_project-re-evaluation_files/libs/quarto-html/axe/axe-check.js +145 -0
  289. package/docs/08_project-re-evaluation_files/libs/quarto-html/popper.min.js +6 -0
  290. package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  291. package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto.js +847 -0
  292. package/docs/08_project-re-evaluation_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  293. package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.css +1 -0
  294. package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.umd.min.js +2 -0
  295. package/docs/notebooklm-mcp-usage.html +704 -0
  296. package/docs/notebooklm-mcp-usage.qmd +119 -0
  297. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
  298. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  299. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  300. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
  301. package/docs/notebooklm-mcp-usage_files/libs/clipboard/clipboard.min.js +7 -0
  302. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/anchor.min.js +9 -0
  303. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
  304. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/popper.min.js +6 -0
  305. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  306. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto.js +847 -0
  307. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  308. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.css +1 -0
  309. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
  310. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
  311. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  312. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  313. package/docs/repomix-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
  314. package/docs/repomix-usage_files/libs/clipboard/clipboard.min.js +7 -0
  315. package/docs/repomix-usage_files/libs/quarto-html/anchor.min.js +9 -0
  316. package/docs/repomix-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
  317. package/docs/repomix-usage_files/libs/quarto-html/popper.min.js +6 -0
  318. package/docs/repomix-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  319. package/docs/repomix-usage_files/libs/quarto-html/quarto.js +847 -0
  320. package/docs/repomix-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  321. package/docs/repomix-usage_files/libs/quarto-html/tippy.css +1 -0
  322. package/docs/repomix-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
  323. package/package.json +62 -0
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Stealth utilities for human-like browser behavior
3
+ *
4
+ * This module provides functions to simulate realistic human interactions:
5
+ * - Human-like typing (speed configurable via CONFIG.typingWpmMin/Max)
6
+ * - Realistic mouse movements (Bezier curves with jitter)
7
+ * - Random delays (normal distribution)
8
+ * - Smooth scrolling
9
+ * - Reading pauses
10
+ *
11
+ * Based on the Python implementation from stealth_utils.py
12
+ */
13
+ import { CONFIG } from "../config.js";
14
+ // ============================================================================
15
+ // Helper Functions
16
+ // ============================================================================
17
+ /**
18
+ * Sleep for specified milliseconds
19
+ */
20
+ export async function sleep(ms) {
21
+ return new Promise((resolve) => setTimeout(resolve, ms));
22
+ }
23
+ /**
24
+ * Generate random integer between min and max (inclusive)
25
+ */
26
+ export function randomInt(min, max) {
27
+ return Math.floor(Math.random() * (max - min + 1)) + min;
28
+ }
29
+ /**
30
+ * Generate random float between min and max
31
+ */
32
+ export function randomFloat(min, max) {
33
+ return Math.random() * (max - min) + min;
34
+ }
35
+ /**
36
+ * Generate random character (for typos)
37
+ */
38
+ export function randomChar() {
39
+ const chars = "qwertyuiopasdfghjklzxcvbnm";
40
+ return chars[randomInt(0, chars.length - 1)];
41
+ }
42
+ /**
43
+ * Generate Gaussian (normal) distributed random number
44
+ * Uses Box-Muller transform
45
+ */
46
+ export function gaussian(mean, stdDev) {
47
+ const u1 = Math.random();
48
+ const u2 = Math.random();
49
+ const z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);
50
+ return z0 * stdDev + mean;
51
+ }
52
+ // ============================================================================
53
+ // Random Delays
54
+ // ============================================================================
55
+ /**
56
+ * Add a random delay to simulate human thinking/reaction time
57
+ * Uses normal distribution for more realistic delays
58
+ *
59
+ * @param minMs Minimum delay in milliseconds (default: from CONFIG)
60
+ * @param maxMs Maximum delay in milliseconds (default: from CONFIG)
61
+ */
62
+ export async function randomDelay(minMs, maxMs) {
63
+ minMs = minMs ?? CONFIG.minDelayMs;
64
+ maxMs = maxMs ?? CONFIG.maxDelayMs;
65
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
66
+ // Fixed delay (average)
67
+ const target = minMs === maxMs ? minMs : (minMs + maxMs) / 2;
68
+ if (target > 0) {
69
+ await sleep(target);
70
+ }
71
+ return;
72
+ }
73
+ // Use normal distribution for more realistic delays
74
+ // Mean at 60% of range, standard deviation of 20% of range
75
+ const mean = minMs + (maxMs - minMs) * 0.6;
76
+ const stdDev = (maxMs - minMs) * 0.2;
77
+ let delay = gaussian(mean, stdDev);
78
+ delay = Math.max(minMs, Math.min(maxMs, delay)); // Clamp to range
79
+ await sleep(delay);
80
+ }
81
+ // ============================================================================
82
+ // Human Typing
83
+ // ============================================================================
84
+ /**
85
+ * Type text in a human-like manner with variable speed and optional typos
86
+ *
87
+ * Simulates realistic typing patterns:
88
+ * - Variable speed (45-65 WPM by default)
89
+ * - Occasional typos (2% chance)
90
+ * - Longer pauses after punctuation
91
+ * - Realistic character delays
92
+ *
93
+ * @param page Playwright page instance
94
+ * @param selector CSS selector of input element
95
+ * @param text Text to type
96
+ * @param options Typing options (wpm, withTypos)
97
+ */
98
+ export async function humanType(page, selector, text, options = {}) {
99
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthHumanTyping) {
100
+ // Fast typing without stealth
101
+ await page.fill(selector, text);
102
+ return;
103
+ }
104
+ const wpm = options.wpm ?? randomInt(CONFIG.typingWpmMin, CONFIG.typingWpmMax);
105
+ const withTypos = options.withTypos ?? true;
106
+ // Calculate average delay per character (in ms)
107
+ // WPM = (characters / 5) / minutes
108
+ // Average word length ~5 characters
109
+ const charsPerMinute = wpm * 5;
110
+ const avgDelayMs = (60 * 1000) / charsPerMinute;
111
+ // Clear existing text first
112
+ await page.fill(selector, "");
113
+ await randomDelay(30, 80);
114
+ // Click to focus
115
+ await page.click(selector);
116
+ await randomDelay(20, 60);
117
+ // Type each character
118
+ let currentText = "";
119
+ let i = 0;
120
+ while (i < text.length) {
121
+ const char = text[i];
122
+ // Simulate very rare typo (0.3% chance) and shorter correction
123
+ if (withTypos && Math.random() < 0.003 && i > 0) {
124
+ // Type wrong character
125
+ const wrongChar = randomChar();
126
+ currentText += wrongChar;
127
+ await page.fill(selector, currentText);
128
+ // Shorter notice window for faster typing
129
+ const noticeDelay = randomFloat(avgDelayMs * 0.6, avgDelayMs * 1.1);
130
+ await sleep(noticeDelay);
131
+ // Backspace
132
+ currentText = currentText.slice(0, -1);
133
+ await page.fill(selector, currentText);
134
+ await randomDelay(20, 60);
135
+ }
136
+ // Type correct character
137
+ currentText += char;
138
+ await page.fill(selector, currentText);
139
+ // Variable delay between characters – tuned for faster but still human-like typing
140
+ let delay;
141
+ if (char === "." || char === "!" || char === "?") {
142
+ delay = randomFloat(avgDelayMs * 1.05, avgDelayMs * 1.4);
143
+ }
144
+ else if (char === " ") {
145
+ delay = randomFloat(avgDelayMs * 0.5, avgDelayMs * 0.9);
146
+ }
147
+ else if (char === ",") {
148
+ delay = randomFloat(avgDelayMs * 0.9, avgDelayMs * 1.2);
149
+ }
150
+ else {
151
+ // Normal character
152
+ const variation = randomFloat(0.5, 0.9);
153
+ delay = avgDelayMs * variation;
154
+ }
155
+ await sleep(delay);
156
+ i++;
157
+ }
158
+ // Small delay after finishing typing
159
+ await randomDelay(50, 120);
160
+ }
161
+ // ============================================================================
162
+ // Mouse Movement
163
+ // ============================================================================
164
+ /**
165
+ * Move mouse in a realistic curved path to target coordinates
166
+ * Uses Bezier-like curves with jitter for natural movement
167
+ *
168
+ * @param page Playwright page instance
169
+ * @param targetX Target X coordinate (default: random)
170
+ * @param targetY Target Y coordinate (default: random)
171
+ * @param steps Number of steps in movement (default: random 10-25)
172
+ */
173
+ export async function randomMouseMovement(page, targetX, targetY, steps) {
174
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
175
+ return;
176
+ }
177
+ const viewport = page.viewportSize() || CONFIG.viewport;
178
+ targetX = targetX ?? randomInt(100, viewport.width - 100);
179
+ targetY = targetY ?? randomInt(100, viewport.height - 100);
180
+ steps = steps ?? randomInt(10, 25);
181
+ // Start from a random position (we don't know current position)
182
+ const startX = randomInt(0, viewport.width);
183
+ const startY = randomInt(0, viewport.height);
184
+ // Generate curved path using Bezier-like curve
185
+ for (let step = 0; step < steps; step++) {
186
+ const progress = step / steps;
187
+ // Add some randomness to create a natural curve
188
+ const curveOffsetX = Math.sin(progress * Math.PI) * randomInt(-50, 50);
189
+ const curveOffsetY = Math.cos(progress * Math.PI) * randomInt(-30, 30);
190
+ let currentX = startX + (targetX - startX) * progress + curveOffsetX;
191
+ let currentY = startY + (targetY - startY) * progress + curveOffsetY;
192
+ // Add micro-jitter (humans never move in perfectly straight lines)
193
+ const jitterX = randomFloat(-3, 3);
194
+ const jitterY = randomFloat(-3, 3);
195
+ currentX = Math.max(0, Math.min(viewport.width, currentX + jitterX));
196
+ currentY = Math.max(0, Math.min(viewport.height, currentY + jitterY));
197
+ await page.mouse.move(currentX, currentY);
198
+ // Variable delay between movements (faster in middle, slower at ends)
199
+ const delay = 10 + 20 * Math.abs(0.5 - progress);
200
+ await sleep(delay);
201
+ }
202
+ }
203
+ // ============================================================================
204
+ // Realistic Click
205
+ // ============================================================================
206
+ /**
207
+ * Click an element with realistic human behavior
208
+ * Includes mouse movement, pause, and click
209
+ *
210
+ * @param page Playwright page instance
211
+ * @param selector CSS selector of element to click
212
+ * @param withMouseMovement Whether to move mouse first (default: true)
213
+ */
214
+ export async function realisticClick(page, selector, withMouseMovement = true) {
215
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
216
+ await page.click(selector);
217
+ return;
218
+ }
219
+ if (withMouseMovement) {
220
+ // Move mouse to element
221
+ const element = await page.$(selector);
222
+ if (element) {
223
+ const box = await element.boundingBox();
224
+ if (box) {
225
+ // Don't click exactly in center (humans are imperfect)
226
+ const offsetX = randomFloat(-box.width * 0.2, box.width * 0.2);
227
+ const offsetY = randomFloat(-box.height * 0.2, box.height * 0.2);
228
+ const targetX = box.x + box.width / 2 + offsetX;
229
+ const targetY = box.y + box.height / 2 + offsetY;
230
+ await randomMouseMovement(page, targetX, targetY);
231
+ }
232
+ }
233
+ }
234
+ // Small pause before clicking
235
+ await randomDelay(100, 300);
236
+ // Click
237
+ await page.click(selector);
238
+ // Small pause after clicking
239
+ await randomDelay(150, 400);
240
+ }
241
+ // ============================================================================
242
+ // Smooth Scrolling
243
+ // ============================================================================
244
+ /**
245
+ * Scroll the page smoothly like a human
246
+ * Uses multiple small steps for smooth animation
247
+ *
248
+ * @param page Playwright page instance
249
+ * @param amount Scroll amount in pixels (default: random 100-400)
250
+ * @param direction Scroll direction ("down" or "up")
251
+ */
252
+ export async function smoothScroll(page, amount, direction = "down") {
253
+ amount = amount ?? randomInt(100, 400);
254
+ amount = Math.abs(amount);
255
+ if (direction === "up") {
256
+ amount = -amount;
257
+ }
258
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
259
+ await page.evaluate((scrollAmount) => {
260
+ window.scrollBy({ top: scrollAmount, behavior: "auto" });
261
+ }, amount);
262
+ return;
263
+ }
264
+ // Scroll in multiple small steps for smoothness
265
+ const steps = randomInt(8, 15);
266
+ const stepAmount = amount / steps;
267
+ for (let i = 0; i < steps; i++) {
268
+ await page.evaluate((step) => {
269
+ window.scrollBy({ top: step, behavior: "smooth" });
270
+ }, stepAmount);
271
+ await sleep(randomFloat(20, 50));
272
+ }
273
+ // Pause after scrolling (humans look at content)
274
+ await randomDelay(300, 800);
275
+ }
276
+ // ============================================================================
277
+ // Reading Simulation
278
+ // ============================================================================
279
+ /**
280
+ * Pause as if reading text, based on length
281
+ * Calculates realistic reading time based on text length and WPM
282
+ *
283
+ * @param textLength Number of characters to "read"
284
+ * @param wpm Reading speed in words per minute (default: random 200-250)
285
+ */
286
+ export async function readingPause(textLength, wpm) {
287
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
288
+ return;
289
+ }
290
+ wpm = wpm ?? randomInt(200, 250);
291
+ // Calculate reading time
292
+ // Average word length ~5 characters
293
+ const wordCount = textLength / 5;
294
+ const minutes = wordCount / wpm;
295
+ let seconds = minutes * 60;
296
+ // Add some randomness (humans don't read at constant speed)
297
+ seconds *= randomFloat(0.8, 1.2);
298
+ // Cap at reasonable maximum (3 seconds)
299
+ seconds = Math.min(seconds, 3.0);
300
+ await sleep(seconds * 1000);
301
+ }
302
+ // ============================================================================
303
+ // Random Mouse Jitter
304
+ // ============================================================================
305
+ /**
306
+ * Add small random mouse movements to simulate natural fidgeting
307
+ *
308
+ * @param page Playwright page instance
309
+ * @param iterations Number of small movements (default: 3)
310
+ */
311
+ export async function randomMouseJitter(page, iterations = 3) {
312
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
313
+ return;
314
+ }
315
+ const viewport = page.viewportSize() || CONFIG.viewport;
316
+ for (let i = 0; i < iterations; i++) {
317
+ const targetX = randomInt(0, viewport.width);
318
+ const targetY = randomInt(0, viewport.height);
319
+ await page.mouse.move(targetX, targetY, { steps: randomInt(2, 4) });
320
+ await sleep(randomFloat(100, 300));
321
+ }
322
+ }
323
+ // ============================================================================
324
+ // Hover Element
325
+ // ============================================================================
326
+ /**
327
+ * Hover over an element with realistic mouse movement
328
+ *
329
+ * @param page Playwright page instance
330
+ * @param selector CSS selector of element to hover
331
+ */
332
+ export async function hoverElement(page, selector) {
333
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
334
+ await page.hover(selector);
335
+ return;
336
+ }
337
+ const element = await page.$(selector);
338
+ if (element) {
339
+ const box = await element.boundingBox();
340
+ if (box) {
341
+ // Move to center of element
342
+ const targetX = box.x + box.width / 2;
343
+ const targetY = box.y + box.height / 2;
344
+ await randomMouseMovement(page, targetX, targetY);
345
+ await page.hover(selector);
346
+ await randomDelay(200, 500);
347
+ }
348
+ }
349
+ }
350
+ // ============================================================================
351
+ // Simulate Reading Page
352
+ // ============================================================================
353
+ /**
354
+ * Simulate reading a page with scrolling and pauses
355
+ * Adds realistic behavior of scrolling and reading content
356
+ *
357
+ * @param page Playwright page instance
358
+ */
359
+ export async function simulateReadingPage(page) {
360
+ if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
361
+ return;
362
+ }
363
+ // Random number of scroll actions
364
+ const scrollCount = randomInt(1, 3);
365
+ for (let i = 0; i < scrollCount; i++) {
366
+ // Scroll down
367
+ await smoothScroll(page, undefined, "down");
368
+ // "Read" the visible content
369
+ await randomDelay(800, 1500);
370
+ // Sometimes scroll up a bit (humans do this)
371
+ if (Math.random() < 0.3) {
372
+ await smoothScroll(page, randomInt(50, 150), "up");
373
+ await randomDelay(400, 800);
374
+ }
375
+ }
376
+ }
377
+ // ============================================================================
378
+ // Exports
379
+ // ============================================================================
380
+ export default {
381
+ sleep,
382
+ randomInt,
383
+ randomFloat,
384
+ randomChar,
385
+ gaussian,
386
+ randomDelay,
387
+ humanType,
388
+ randomMouseMovement,
389
+ realisticClick,
390
+ smoothScroll,
391
+ readingPause,
392
+ randomMouseJitter,
393
+ hoverElement,
394
+ simulateReadingPage,
395
+ };
396
+ //# sourceMappingURL=stealth-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stealth-utils.js","sourceRoot":"","sources":["../../src/utils/stealth-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for stealth-utils.ts
3
+ *
4
+ * Unit tests for human-like behavior simulation utilities.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=stealth-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stealth-utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/stealth-utils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Tests for stealth-utils.ts
3
+ *
4
+ * Unit tests for human-like behavior simulation utilities.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { randomInt, randomFloat, randomChar, gaussian, sleep, } from './stealth-utils.js';
8
+ describe('stealth-utils', () => {
9
+ describe('randomInt', () => {
10
+ it('should return integer within range', () => {
11
+ for (let i = 0; i < 100; i++) {
12
+ const result = randomInt(1, 10);
13
+ expect(result).toBeGreaterThanOrEqual(1);
14
+ expect(result).toBeLessThanOrEqual(10);
15
+ expect(Number.isInteger(result)).toBe(true);
16
+ }
17
+ });
18
+ it('should handle same min and max', () => {
19
+ expect(randomInt(5, 5)).toBe(5);
20
+ });
21
+ it('should handle zero range', () => {
22
+ expect(randomInt(0, 0)).toBe(0);
23
+ });
24
+ });
25
+ describe('randomFloat', () => {
26
+ it('should return float within range', () => {
27
+ for (let i = 0; i < 100; i++) {
28
+ const result = randomFloat(1.0, 10.0);
29
+ expect(result).toBeGreaterThanOrEqual(1.0);
30
+ expect(result).toBeLessThanOrEqual(10.0);
31
+ }
32
+ });
33
+ it('should handle same min and max', () => {
34
+ expect(randomFloat(5.0, 5.0)).toBe(5.0);
35
+ });
36
+ });
37
+ describe('randomChar', () => {
38
+ it('should return lowercase letter', () => {
39
+ for (let i = 0; i < 100; i++) {
40
+ const result = randomChar();
41
+ expect(result).toMatch(/^[a-z]$/);
42
+ }
43
+ });
44
+ });
45
+ describe('gaussian', () => {
46
+ it('should return values around mean', () => {
47
+ const mean = 100;
48
+ const stdDev = 10;
49
+ const values = [];
50
+ for (let i = 0; i < 1000; i++) {
51
+ values.push(gaussian(mean, stdDev));
52
+ }
53
+ const avg = values.reduce((a, b) => a + b, 0) / values.length;
54
+ // Average should be close to mean (within 2 std devs)
55
+ expect(Math.abs(avg - mean)).toBeLessThan(stdDev * 2);
56
+ });
57
+ });
58
+ describe('sleep', () => {
59
+ it('should delay for specified time', async () => {
60
+ const start = Date.now();
61
+ await sleep(50);
62
+ const elapsed = Date.now() - start;
63
+ // Allow some tolerance for timing
64
+ expect(elapsed).toBeGreaterThanOrEqual(45);
65
+ expect(elapsed).toBeLessThan(100);
66
+ });
67
+ it('should resolve without error', async () => {
68
+ await expect(sleep(10)).resolves.toBeUndefined();
69
+ });
70
+ });
71
+ });
72
+ //# sourceMappingURL=stealth-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stealth-utils.test.js","sourceRoot":"","sources":["../../src/utils/stealth-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ ## Configuration
2
+
3
+ **No config files needed!** The server works out of the box with sensible defaults.
4
+
5
+ ### Configuration Priority (highest to lowest):
6
+ 1. **Tool Parameters** - Claude passes settings like `browser_options` at runtime
7
+ 2. **Environment Variables** - Optional overrides for advanced users
8
+ 3. **Hardcoded Defaults** - Sensible defaults that work for most users
9
+
10
+ ---
11
+
12
+ ## Tool Parameters (Runtime Configuration)
13
+
14
+ Claude can control browser behavior via the `browser_options` parameter in tools like `ask_question`, `setup_auth`, and `re_auth`:
15
+
16
+ ```typescript
17
+ browser_options: {
18
+ show: boolean, // Show browser window (overrides headless)
19
+ headless: boolean, // Run in headless mode (default: true)
20
+ timeout_ms: number, // Browser timeout in ms (default: 30000)
21
+
22
+ stealth: {
23
+ enabled: boolean, // Master switch (default: true)
24
+ random_delays: boolean, // Random delays between actions (default: true)
25
+ human_typing: boolean, // Human-like typing (default: true)
26
+ mouse_movements: boolean, // Realistic mouse movements (default: true)
27
+ typing_wpm_min: number, // Min typing speed (default: 160)
28
+ typing_wpm_max: number, // Max typing speed (default: 240)
29
+ delay_min_ms: number, // Min delay between actions (default: 100)
30
+ delay_max_ms: number, // Max delay between actions (default: 400)
31
+ },
32
+
33
+ viewport: {
34
+ width: number, // Viewport width (default: 1024)
35
+ height: number, // Viewport height (default: 768)
36
+ }
37
+ }
38
+ ```
39
+
40
+ **Example usage:**
41
+ - "Research this and show me the browser" → Sets `show: true`
42
+ - "Use slow typing for this query" → Adjusts typing WPM via stealth settings
43
+
44
+ ---
45
+
46
+ ## Environment Variables (Optional)
47
+
48
+ For advanced users who want to set global defaults:
49
+ - Auth
50
+ - `AUTO_LOGIN_ENABLED` — `true|false` (default `false`)
51
+ - `LOGIN_EMAIL`, `LOGIN_PASSWORD` — for auto‑login if enabled
52
+ - `AUTO_LOGIN_TIMEOUT_MS` (default `120000`)
53
+ - Stealth / Human-like behavior
54
+ - `STEALTH_ENABLED` — `true|false` (default `true`) — Master switch for all stealth features
55
+ - `STEALTH_RANDOM_DELAYS` — `true|false` (default `true`)
56
+ - `STEALTH_HUMAN_TYPING` — `true|false` (default `true`)
57
+ - `STEALTH_MOUSE_MOVEMENTS` — `true|false` (default `true`)
58
+ - Typing speed (human‑like)
59
+ - `TYPING_WPM_MIN` (default 160), `TYPING_WPM_MAX` (default 240)
60
+ - Delays (human‑like)
61
+ - `MIN_DELAY_MS` (default 100), `MAX_DELAY_MS` (default 400)
62
+ - Browser
63
+ - `HEADLESS` (default `true`), `BROWSER_TIMEOUT` (ms, default `30000`)
64
+ - Sessions
65
+ - `MAX_SESSIONS` (default 10), `SESSION_TIMEOUT` (s, default 900)
66
+ - Multi‑instance profile strategy
67
+ - `NOTEBOOK_PROFILE_STRATEGY` — `auto|single|isolated` (default `auto`)
68
+ - `NOTEBOOK_CLONE_PROFILE` — clone base profile into isolated dir (default `false`)
69
+ - Cleanup (to prevent disk bloat)
70
+ - `NOTEBOOK_CLEANUP_ON_STARTUP` (default `true`)
71
+ - `NOTEBOOK_CLEANUP_ON_SHUTDOWN` (default `true`)
72
+ - `NOTEBOOK_INSTANCE_TTL_HOURS` (default `72`)
73
+ - `NOTEBOOK_INSTANCE_MAX_COUNT` (default `20`)
74
+ - Library metadata (optional hints)
75
+ - `NOTEBOOK_DESCRIPTION`, `NOTEBOOK_TOPICS`, `NOTEBOOK_CONTENT_TYPES`, `NOTEBOOK_USE_CASES`
76
+ - `NOTEBOOK_URL` — optional; leave empty and manage notebooks via the library
77
+
78
+ ---
79
+
80
+ ## Storage Paths
81
+
82
+ The server uses platform-specific paths via [env-paths](https://github.com/sindresorhus/env-paths)
83
+ - **Linux**: `~/.local/share/notebooklm-mcp/`
84
+ - **macOS**: `~/Library/Application Support/notebooklm-mcp/`
85
+ - **Windows**: `%LOCALAPPDATA%\notebooklm-mcp\`
86
+
87
+ **What's stored:**
88
+ - `chrome_profile/` - Persistent Chrome browser profile with login session
89
+ - `browser_state/` - Browser context state and cookies
90
+ - `library.json` - Your notebook library with metadata
91
+ - `chrome_profile_instances/` - Isolated Chrome profiles for concurrent sessions
92
+
93
+ **No config.json file** - Configuration is purely via environment variables or tool parameters!
94
+
@@ -0,0 +1,34 @@
1
+ ## Tools
2
+
3
+ ### Core
4
+ - `ask_question`
5
+ - Parameters: `question` (string, required), optional `session_id`, `notebook_id`, `notebook_url`, `show_browser`.
6
+ - Returns NotebookLM's answer plus the follow-up reminder.
7
+ - `list_sessions`, `close_session`, `reset_session`
8
+ - Inspect or manage active browser sessions.
9
+ - `get_health`
10
+ - Summaries auth status, active sessions, and configuration.
11
+ - `setup_auth`
12
+ - Opens the persistent Chrome profile so you can log in manually.
13
+ - `re_auth`
14
+ - Switch to a different Google account or re-authenticate.
15
+ - Use when NotebookLM rate limit is reached (50 queries/day for free accounts).
16
+ - Closes all sessions, clears auth data, and opens browser for fresh login.
17
+
18
+ ### Notebook library
19
+ - `add_notebook` – Safe conversational add; expects confirmation before writing.
20
+ - `list_notebooks` – Returns id, name, topics, URL, metadata for every entry.
21
+ - `get_notebook` – Fetch a single notebook by id.
22
+ - `select_notebook` – Set the active default notebook.
23
+ - `update_notebook` – Modify metadata fields.
24
+ - `remove_notebook` – Removes entries from the library (not the original NotebookLM notebook).
25
+ - `search_notebooks` – Simple query across name/description/topics/tags.
26
+ - `get_library_stats` – Aggregate statistics (total notebooks, usage counts, etc.).
27
+
28
+ ### Resources
29
+ - `notebooklm://library`
30
+ - JSON representation of the full library: active notebook, stats, individual notebooks.
31
+ - `notebooklm://library/{id}`
32
+ - Fetch metadata for a specific notebook. The `{id}` completion pulls from the library automatically.
33
+
34
+ **Remember:** Every `ask_question` response ends with a reminder that nudges your agent to keep asking until the user’s task is fully addressed.