@pan-sec/notebooklm-mcp 2026.2.1 → 2026.2.11

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 (117) hide show
  1. package/README.md +39 -18
  2. package/dist/auth/auth-manager.d.ts +37 -2
  3. package/dist/auth/auth-manager.d.ts.map +1 -1
  4. package/dist/auth/auth-manager.js +133 -11
  5. package/dist/auth/auth-manager.js.map +1 -1
  6. package/dist/auth/mcp-auth.d.ts +25 -4
  7. package/dist/auth/mcp-auth.d.ts.map +1 -1
  8. package/dist/auth/mcp-auth.js +145 -29
  9. package/dist/auth/mcp-auth.js.map +1 -1
  10. package/dist/compliance/retention-engine.js +1 -1
  11. package/dist/compliance/retention-engine.js.map +1 -1
  12. package/dist/config.d.ts +24 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +56 -8
  15. package/dist/config.js.map +1 -1
  16. package/dist/gemini/gemini-client.d.ts.map +1 -1
  17. package/dist/gemini/gemini-client.js +58 -20
  18. package/dist/gemini/gemini-client.js.map +1 -1
  19. package/dist/index.js +87 -180
  20. package/dist/index.js.map +1 -1
  21. package/dist/notebook-creation/audio-manager.js +2 -2
  22. package/dist/notebook-creation/audio-manager.js.map +1 -1
  23. package/dist/notebook-creation/data-table-manager.d.ts +13 -3
  24. package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
  25. package/dist/notebook-creation/data-table-manager.js +70 -32
  26. package/dist/notebook-creation/data-table-manager.js.map +1 -1
  27. package/dist/notebook-creation/discover-creation-flow.js +1 -1
  28. package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
  29. package/dist/notebook-creation/discover-quota.js +1 -1
  30. package/dist/notebook-creation/discover-quota.js.map +1 -1
  31. package/dist/notebook-creation/discover-sources.js +1 -1
  32. package/dist/notebook-creation/discover-sources.js.map +1 -1
  33. package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
  34. package/dist/notebook-creation/notebook-creator.js +49 -26
  35. package/dist/notebook-creation/notebook-creator.js.map +1 -1
  36. package/dist/notebook-creation/notebook-sync.js +1 -1
  37. package/dist/notebook-creation/notebook-sync.js.map +1 -1
  38. package/dist/notebook-creation/selectors.d.ts +21 -16
  39. package/dist/notebook-creation/selectors.d.ts.map +1 -1
  40. package/dist/notebook-creation/selectors.js +37 -20
  41. package/dist/notebook-creation/selectors.js.map +1 -1
  42. package/dist/notebook-creation/source-manager.d.ts.map +1 -1
  43. package/dist/notebook-creation/source-manager.js +29 -6
  44. package/dist/notebook-creation/source-manager.js.map +1 -1
  45. package/dist/notebook-creation/video-manager.d.ts +10 -1
  46. package/dist/notebook-creation/video-manager.d.ts.map +1 -1
  47. package/dist/notebook-creation/video-manager.js +103 -42
  48. package/dist/notebook-creation/video-manager.js.map +1 -1
  49. package/dist/quota/quota-manager.d.ts.map +1 -1
  50. package/dist/quota/quota-manager.js +46 -15
  51. package/dist/quota/quota-manager.js.map +1 -1
  52. package/dist/session/browser-session.d.ts.map +1 -1
  53. package/dist/session/browser-session.js +21 -14
  54. package/dist/session/browser-session.js.map +1 -1
  55. package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
  56. package/dist/tools/definitions/notebook-management.js +64 -0
  57. package/dist/tools/definitions/notebook-management.js.map +1 -1
  58. package/dist/tools/handlers/ask-question.d.ts +18 -0
  59. package/dist/tools/handlers/ask-question.d.ts.map +1 -0
  60. package/dist/tools/handlers/ask-question.js +236 -0
  61. package/dist/tools/handlers/ask-question.js.map +1 -0
  62. package/dist/tools/handlers/audio-video.d.ts +42 -0
  63. package/dist/tools/handlers/audio-video.d.ts.map +1 -0
  64. package/dist/tools/handlers/audio-video.js +356 -0
  65. package/dist/tools/handlers/audio-video.js.map +1 -0
  66. package/dist/tools/handlers/auth.d.ts +41 -0
  67. package/dist/tools/handlers/auth.d.ts.map +1 -0
  68. package/dist/tools/handlers/auth.js +171 -0
  69. package/dist/tools/handlers/auth.js.map +1 -0
  70. package/dist/tools/handlers/gemini.d.ts +142 -0
  71. package/dist/tools/handlers/gemini.d.ts.map +1 -0
  72. package/dist/tools/handlers/gemini.js +626 -0
  73. package/dist/tools/handlers/gemini.js.map +1 -0
  74. package/dist/tools/handlers/index.d.ts +295 -0
  75. package/dist/tools/handlers/index.d.ts.map +1 -0
  76. package/dist/tools/handlers/index.js +197 -0
  77. package/dist/tools/handlers/index.js.map +1 -0
  78. package/dist/tools/handlers/notebook-creation.d.ts +75 -0
  79. package/dist/tools/handlers/notebook-creation.d.ts.map +1 -0
  80. package/dist/tools/handlers/notebook-creation.js +598 -0
  81. package/dist/tools/handlers/notebook-creation.js.map +1 -0
  82. package/dist/tools/handlers/notebook-management.d.ts +64 -0
  83. package/dist/tools/handlers/notebook-management.d.ts.map +1 -0
  84. package/dist/tools/handlers/notebook-management.js +214 -0
  85. package/dist/tools/handlers/notebook-management.js.map +1 -0
  86. package/dist/tools/handlers/session-management.d.ts +68 -0
  87. package/dist/tools/handlers/session-management.d.ts.map +1 -0
  88. package/dist/tools/handlers/session-management.js +238 -0
  89. package/dist/tools/handlers/session-management.js.map +1 -0
  90. package/dist/tools/handlers/system.d.ts +102 -0
  91. package/dist/tools/handlers/system.d.ts.map +1 -0
  92. package/dist/tools/handlers/system.js +275 -0
  93. package/dist/tools/handlers/system.js.map +1 -0
  94. package/dist/tools/handlers/types.d.ts +19 -0
  95. package/dist/tools/handlers/types.d.ts.map +1 -0
  96. package/dist/tools/handlers/types.js +5 -0
  97. package/dist/tools/handlers/types.js.map +1 -0
  98. package/dist/tools/handlers/webhooks.d.ts +34 -0
  99. package/dist/tools/handlers/webhooks.d.ts.map +1 -0
  100. package/dist/tools/handlers/webhooks.js +122 -0
  101. package/dist/tools/handlers/webhooks.js.map +1 -0
  102. package/dist/tools/handlers.d.ts +27 -0
  103. package/dist/tools/handlers.d.ts.map +1 -1
  104. package/dist/tools/handlers.js +226 -5
  105. package/dist/tools/handlers.js.map +1 -1
  106. package/dist/tools/index.d.ts +1 -1
  107. package/dist/tools/index.d.ts.map +1 -1
  108. package/dist/tools/index.js +1 -1
  109. package/dist/tools/index.js.map +1 -1
  110. package/dist/utils/cleanup-manager.d.ts.map +1 -1
  111. package/dist/utils/cleanup-manager.js +8 -10
  112. package/dist/utils/cleanup-manager.js.map +1 -1
  113. package/dist/utils/file-permissions.d.ts.map +1 -1
  114. package/dist/utils/file-permissions.js +41 -6
  115. package/dist/utils/file-permissions.js.map +1 -1
  116. package/docs/improvement-sprint-2026.2.10.md +210 -0
  117. package/package.json +6 -3
@@ -1 +1 @@
1
- {"version":3,"file":"file-permissions.d.ts","sourceRoot":"","sources":["../../src/utils/file-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH;;GAEG;AACH,eAAO,MAAM,SAAS,SAA+B,CAAC;AACtD,eAAO,MAAM,OAAO,SAAgC,CAAC;AACrD,eAAO,MAAM,OAAO,SAA+B,CAAC;AACpD,eAAO,MAAM,MAAM,SAAa,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B,wDAAwD;;IAExD,+DAA+D;;IAE/D,iEAAiE;;IAEjE,yEAAyE;;CAEjE,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAA0C,GAC/C,OAAO,CAYT;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAoC,GACzC,OAAO,CAYT;AAuGD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoC,GAAG,IAAI,CAU7F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,IAAI,GAAE,MAA0C,GAC/C,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,IAAI,GAAE,MAA0C,GAC/C,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CASA"}
1
+ {"version":3,"file":"file-permissions.d.ts","sourceRoot":"","sources":["../../src/utils/file-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAgCH;;GAEG;AACH,eAAO,MAAM,SAAS,SAA+B,CAAC;AACtD,eAAO,MAAM,OAAO,SAAgC,CAAC;AACrD,eAAO,MAAM,OAAO,SAA+B,CAAC;AACpD,eAAO,MAAM,MAAM,SAAa,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B,wDAAwD;;IAExD,+DAA+D;;IAE/D,iEAAiE;;IAEjE,yEAAyE;;CAEjE,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAA0C,GAC/C,OAAO,CAiBT;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAoC,GACzC,OAAO,CAiBT;AAyGD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoC,GAAG,IAAI,CAU7F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,IAAI,GAAE,MAA0C,GAC/C,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,IAAI,GAAE,MAA0C,GAC/C,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CASA"}
@@ -15,6 +15,29 @@
15
15
  import fs from "fs";
16
16
  import path from "path";
17
17
  import { execFileSync } from "child_process";
18
+ // Lazy imports to avoid circular dependency (audit-logger → config → file-permissions)
19
+ let _log = null;
20
+ let _audit = null;
21
+ async function getLazyImports() {
22
+ if (!_log) {
23
+ const { log } = await import("./logger.js");
24
+ _log = log;
25
+ }
26
+ if (!_audit) {
27
+ const { audit } = await import("./audit-logger.js");
28
+ _audit = audit;
29
+ }
30
+ return { log: _log, audit: _audit };
31
+ }
32
+ function logPermissionWarning(message, details) {
33
+ // Fire-and-forget: log warning without blocking
34
+ getLazyImports().then(({ log, audit }) => {
35
+ log.warning(message);
36
+ audit.security("permission_failure", "warning", details);
37
+ }).catch(() => {
38
+ // Ignore import failures during early startup
39
+ });
40
+ }
18
41
  /**
19
42
  * Platform detection
20
43
  */
@@ -52,8 +75,13 @@ export function setSecureFilePermissions(filePath, mode = PERMISSION_MODES.OWNER
52
75
  return true;
53
76
  }
54
77
  }
55
- catch {
56
- // Silently fail - permissions are best-effort on some systems
78
+ catch (error) {
79
+ const msg = error instanceof Error ? error.message : String(error);
80
+ logPermissionWarning(`⚠️ Failed to set file permissions on ${filePath}: ${msg}`, {
81
+ file: filePath,
82
+ mode: mode.toString(8),
83
+ error: msg,
84
+ });
57
85
  return false;
58
86
  }
59
87
  }
@@ -74,8 +102,13 @@ export function setSecureDirectoryPermissions(dirPath, mode = PERMISSION_MODES.O
74
102
  return true;
75
103
  }
76
104
  }
77
- catch {
78
- // Silently fail - permissions are best-effort on some systems
105
+ catch (error) {
106
+ const msg = error instanceof Error ? error.message : String(error);
107
+ logPermissionWarning(`⚠️ Failed to set directory permissions on ${dirPath}: ${msg}`, {
108
+ directory: dirPath,
109
+ mode: mode.toString(8),
110
+ error: msg,
111
+ });
79
112
  return false;
80
113
  }
81
114
  }
@@ -136,8 +169,10 @@ function setWindowsFilePermissions(targetPath, ownerOnly) {
136
169
  try {
137
170
  // Defense-in-depth: Validate path before using in shell command
138
171
  if (!isPathSafeForShell(targetPath)) {
139
- // Log would be nice but we don't have logger imported here
140
- // Silently fail for invalid paths
172
+ logPermissionWarning(`⚠️ Rejected unsafe path for permissions: ${targetPath}`, {
173
+ path: targetPath,
174
+ error: "path_failed_safety_check",
175
+ });
141
176
  return false;
142
177
  }
143
178
  const username = process.env.USERNAME || process.env.USER;
@@ -1 +1 @@
1
- {"version":3,"file":"file-permissions.js","sourceRoot":"","sources":["../../src/utils/file-permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-permissions.js","sourceRoot":"","sources":["../../src/utils/file-permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ # NotebookLM MCP Server — Improvement Sprint v2026.2.10
2
+
3
+ ## Overview
4
+
5
+ A comprehensive 5-phase improvement project covering security hardening, code architecture, reliability, CI/CD, and testing. Informed by a full codebase audit (architecture, security sentinel, code quality review) and validated by a 4-agent review team (Skeptic, Sentinel, Architect, Librarian).
6
+
7
+ **Result:** 168 tests passing, clean TypeScript build, 2 critical security bugs caught and fixed during review.
8
+
9
+ ---
10
+
11
+ ## Phase 1: Quick Wins (CI, Docker, Cleanup)
12
+
13
+ ### 1A. Tests added to CI pipeline
14
+ - **File:** `.github/workflows/ci.yml`
15
+ - Added `npm test` step after the build step
16
+
17
+ ### 1B. `.dockerignore` created
18
+ - **New file:** `.dockerignore`
19
+ - Excludes: `node_modules/`, `dist/`, `.git/`, `*.tar.gz`, `tests/`, `docs/`, `medusa-env/`, `.mcpregistry_*`, `.env*`, IDE files, OS files, Python artifacts
20
+
21
+ ### 1C. Multi-stage Docker build
22
+ - **File:** `Dockerfile`
23
+ - **Stage 1 (builder):** install all deps, build TypeScript
24
+ - **Stage 2 (runtime):** copy only `dist/`, `package.json`, `package-lock.json`, `npm ci --omit=dev`, install patchright
25
+ - Keeps image ~40-60% smaller, dev dependencies never reach production
26
+
27
+ ---
28
+
29
+ ## Phase 2: Security Hardening
30
+
31
+ ### 2A. MCP auth secure-by-default
32
+ - **File:** `src/auth/mcp-auth.ts`
33
+ - Auth is now **enabled by default** — no configuration needed for secure operation
34
+ - Explicit opt-out via `NLMCP_AUTH_DISABLED=true` (case-insensitive via `parseBoolean`)
35
+ - Legacy `NLMCP_AUTH_ENABLED=true` still honored for backwards compatibility
36
+ - Clear warning logged when auth is disabled; conflict warning when both env vars set
37
+
38
+ ### 2B. Exponential backoff for auth lockout
39
+ - **File:** `src/auth/mcp-auth.ts`
40
+ - After lockout expires, `lockoutCount` persists to drive escalation
41
+ - Backoff: 5min -> 15min -> 45min -> 4hr (capped at `MAX_LOCKOUT_MS`)
42
+ - Formula: `baseDuration * 3^(lockoutCount - 1)`, capped at 4 hours
43
+
44
+ ### 2C. Credentials wrapped in SecureCredential
45
+ - **File:** `src/config.ts`
46
+ - `LOGIN_PASSWORD` and `GEMINI_API_KEY` wrapped in `SecureCredential` with 30-min TTL
47
+ - Original env vars deleted from `process.env` after reading
48
+ - **CONFIG.loginPassword blanked to `""`** — consumers must use `getSecureLoginPassword()`
49
+ - **CONFIG.geminiApiKey set to `null`** — consumers must use `getSecureGeminiApiKey()`
50
+ - `browser-session.ts` and `gemini-client.ts` updated to use secure accessors
51
+ - Graceful handling when credential expires (clear error message, not unhandled throw)
52
+
53
+ ### 2D. Filesystem tools gated behind auth
54
+ - **Files:** `src/index.ts`, `src/auth/mcp-auth.ts`
55
+ - `add_folder`, `cleanup_data`, `export_library` require auth even when globally disabled
56
+ - `authenticateMCPRequest()` passes `forceAuth` flag through to `validateToken()`
57
+ - **Critical fix:** `validateToken()` accepts `forceValidation` parameter to bypass the `!enabled` short-circuit — prevents any-token-passes bypass
58
+
59
+ ### 2E. Config value range validation
60
+ - **File:** `src/config.ts`
61
+ - Added `clampInteger(value, min, max)` helper
62
+ - Applied to: `maxSessions` (1-50), `sessionTimeout` (60-86400), `browserTimeout` (5000-300000)
63
+ - Exported `parseBoolean`, `parseInteger`, `parseArray` for testability and reuse
64
+
65
+ ---
66
+
67
+ ## Phase 3: Code Quality & Architecture
68
+
69
+ ### 3A. Handler split — 3,611 lines -> 9 domain modules
70
+ - **From:** `src/tools/handlers.ts` (deleted after split)
71
+ - **To:** `src/tools/handlers/` directory:
72
+
73
+ | Module | Handlers | Lines |
74
+ |--------|----------|-------|
75
+ | `types.ts` | `HandlerContext` interface | ~20 |
76
+ | `ask-question.ts` | `handleAskQuestion` | ~260 |
77
+ | `session-management.ts` | list/close/reset/health | ~300 |
78
+ | `auth.ts` | setup_auth, re_auth | ~230 |
79
+ | `notebook-management.ts` | list/get/add/update/remove/select/search/stats | ~220 |
80
+ | `notebook-creation.ts` | create/batch/sync/sources/folder | ~680 |
81
+ | `system.ts` | export/project_info/quota/cleanup | ~370 |
82
+ | `audio-video.ts` | audio/video/data-table tools | ~380 |
83
+ | `webhooks.ts` | configure/list/test/remove | ~160 |
84
+ | `gemini.ts` | deep_research/query/documents/history | ~780 |
85
+ | `index.ts` | `ToolHandlers` facade class | ~280 |
86
+
87
+ - Each domain function receives `ctx: HandlerContext` (sessionManager, authManager, library, rateLimiter, geminiClient)
88
+ - Facade class delegates all 48 methods to domain functions
89
+ - Type inference via `Parameters<typeof fn>[1]` prevents type drift
90
+
91
+ ### 3B. Tool registry pattern
92
+ - **File:** `src/index.ts`
93
+ - Replaced ~500-line switch/case with `Map<string, ToolHandler>` registry
94
+ - **Built once** as class-level field in `setupHandlers()` (not per-request)
95
+ - ~60 lines for all 48 tools
96
+
97
+ ### 3C. Locale-agnostic selectors
98
+ - **File:** `src/session/browser-session.ts`
99
+ - Replaced German-locale hardcoded `textarea[aria-label="Feld fur Anfragen"]`
100
+ - New fallback chain: `textarea[aria-label]`, `textarea[class*="query"]`, `.chat-input textarea`
101
+
102
+ ### 3D. Gemini SDK type annotations
103
+ - **File:** `src/gemini/gemini-client.ts`
104
+ - Added explicit comment explaining why `as any` is needed (SDK v1.41.0 lacks Interactions API types)
105
+
106
+ ### 3E. Configurable FOLLOW_UP_REMINDER
107
+ - **Files:** `src/config.ts`, `src/tools/handlers/ask-question.ts`
108
+ - `NLMCP_FOLLOW_UP_REMINDER` env var (default: current text)
109
+ - `NLMCP_FOLLOW_UP_ENABLED=true/false` to disable entirely
110
+ - Added `responseTimeout` and `followUpReminder`/`followUpEnabled` to Config interface
111
+
112
+ ---
113
+
114
+ ## Phase 4: Robustness & Reliability
115
+
116
+ ### 4A. Gemini API retry with exponential backoff
117
+ - **File:** `src/gemini/gemini-client.ts`
118
+ - Added `retryWithBackoff(fn, { maxRetries: 3, baseDelay: 1000 })` utility
119
+ - Retries on: HTTP 429, 500, 502, 503, network errors
120
+ - Does NOT retry on: 400, 401, 403, 404
121
+
122
+ ### 4B. Configurable NotebookLM response timeout
123
+ - **File:** `src/session/browser-session.ts`, `src/config.ts`
124
+ - Replaced hardcoded `120000` with `CONFIG.responseTimeout`
125
+ - Configurable via `NLMCP_RESPONSE_TIMEOUT_MS` (default: 120000)
126
+
127
+ ### 4C. Better error handling for file permissions
128
+ - **File:** `src/utils/file-permissions.ts`
129
+ - Permission failures now log via `log.warning()` and create audit events
130
+ - Lazy imports to break circular dependency (audit-logger -> config -> file-permissions)
131
+ - Stale "no logger available" comment replaced with actual logging call
132
+
133
+ ---
134
+
135
+ ## Phase 5: Testing
136
+
137
+ ### 5A. Security utility tests — `tests/security.test.ts`
138
+ - 25 tests covering:
139
+ - `validateNotebookUrl` — valid URLs, invalid domains, non-HTTPS, dangerous protocols, empty/null input
140
+ - `validateQuestion` — empty, max length, trimming, null/undefined
141
+ - `RateLimiter` — under limit, at limit, independent keys, window expiry, clear
142
+
143
+ ### 5B. Config parsing tests — `tests/config.test.ts`
144
+ - 32 tests covering:
145
+ - `parseBoolean` — true/false/1/0/undefined/unrecognized/case-insensitive
146
+ - `parseInteger` — valid/undefined/non-numeric/floats
147
+ - `parseArray` — comma-separated/trim/filter empty/undefined/single values
148
+ - Range clamping via CONFIG defaults
149
+ - `applyBrowserOptions` — show/headless/timeout/stealth/viewport/legacy/precedence
150
+ - New CONFIG defaults (responseTimeout, followUpEnabled, followUpReminder)
151
+
152
+ ---
153
+
154
+ ## Post-Review Fixes (4-Agent Validation)
155
+
156
+ Issues found and fixed by the Skeptic, Sentinel, Architect, and Librarian agents:
157
+
158
+ | Fix | Severity | Description |
159
+ |-----|----------|-------------|
160
+ | forceAuth bypass | **CRITICAL** | `validateToken()` returned true when auth disabled, making forceAuth useless. Added `forceValidation` parameter. |
161
+ | Plaintext creds in CONFIG | **CRITICAL** | `CONFIG.loginPassword` held plaintext despite SecureCredential wrapping. Blanked CONFIG fields, updated all consumers. |
162
+ | Dead handlers.ts | **CRITICAL** | 3,611-line file still compiled by tsconfig glob. Deleted. |
163
+ | toolRegistry per-request | **HIGH** | Map with 48 entries rebuilt on every tool call. Promoted to class field. |
164
+ | Misleading auth log | **HIGH** | "Auth disabled" logged even when auth was actually enabled (conflicting env vars). |
165
+ | parseInt inconsistency | **HIGH** | Bare `parseInt` in mcp-auth.ts bypassed NaN guard. Switched to `parseInteger`. |
166
+ | Auth disable case-sensitivity | **MEDIUM** | `=== "true"` strict check. Now uses `parseBoolean()` for consistency. |
167
+ | Stale no-logger comment | **HIGH** | Comment said "no logger" but lazy import mechanism was available. Fixed. |
168
+ | Backoff comment | **LOW** | Said "3rd: 1hr" but actual value is 45min. Corrected. |
169
+
170
+ ---
171
+
172
+ ## New Environment Variables
173
+
174
+ | Variable | Default | Description |
175
+ |----------|---------|-------------|
176
+ | `NLMCP_AUTH_DISABLED` | `false` | Explicitly disable MCP auth (not recommended) |
177
+ | `NLMCP_RESPONSE_TIMEOUT_MS` | `120000` | NotebookLM response timeout in ms |
178
+ | `NLMCP_FOLLOW_UP_REMINDER` | _(built-in text)_ | Custom follow-up reminder text |
179
+ | `NLMCP_FOLLOW_UP_ENABLED` | `true` | Enable/disable follow-up reminder |
180
+
181
+ ---
182
+
183
+ ## Files Modified
184
+
185
+ | File | Changes |
186
+ |------|---------|
187
+ | `.github/workflows/ci.yml` | Added test step |
188
+ | `.dockerignore` | **New** |
189
+ | `.gitignore` | Added `docs/` |
190
+ | `Dockerfile` | Multi-stage build |
191
+ | `src/auth/mcp-auth.ts` | Secure-by-default, exponential backoff, forceValidation, parseBoolean/parseInteger |
192
+ | `src/config.ts` | SecureCredential wrapping, range clamping, new config fields, exported parsers |
193
+ | `src/index.ts` | Tool registry, forceAuth for filesystem tools |
194
+ | `src/session/browser-session.ts` | Locale-agnostic selectors, configurable timeout, secure password accessor |
195
+ | `src/gemini/gemini-client.ts` | Retry with backoff, secure API key accessor |
196
+ | `src/utils/file-permissions.ts` | Lazy logging, audit events on failure |
197
+ | `src/tools/handlers.ts` | **Deleted** (split into handlers/) |
198
+ | `src/tools/handlers/` | **New** — 11 files (types, index, 9 domain modules) |
199
+ | `src/tools/index.ts` | Re-export from handlers/ |
200
+ | `tests/security.test.ts` | **New** — 25 tests |
201
+ | `tests/config.test.ts` | **New** — 32 tests |
202
+
203
+ ---
204
+
205
+ ## Verification
206
+
207
+ - `npm run build` — TypeScript compiles clean
208
+ - `npm test` — 168 tests pass (6 test files)
209
+ - `node dist/index.js config` — server starts without errors
210
+ - Tool count: 48 tools registered in registry
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@pan-sec/notebooklm-mcp",
3
- "version": "2026.2.1",
3
+ "version": "2026.2.11",
4
4
  "mcpName": "io.github.Pantheon-Security/notebooklm-mcp-secure",
5
- "description": "Security-hardened MCP server for NotebookLM API with enterprise compliance (GDPR, SOC2, CSSF)",
5
+ "description": "Security-hardened MCP server for NotebookLM API with compliance-ready architecture (GDPR, SOC2, CSSF controls implemented)",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "notebooklm-mcp": "dist/index.js"
@@ -87,7 +87,10 @@
87
87
  "secretsScanning": true,
88
88
  "certificatePinning": true,
89
89
  "memoryScubbing": true,
90
- "medusaIntegration": true
90
+ "medusaIntegration": true,
91
+ "secureByDefaultAuth": true,
92
+ "exponentialBackoffLockout": true,
93
+ "credentialIsolation": true
91
94
  },
92
95
  "enterpriseCompliance": {
93
96
  "gdpr": {