@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.
- package/README.md +39 -18
- package/dist/auth/auth-manager.d.ts +37 -2
- package/dist/auth/auth-manager.d.ts.map +1 -1
- package/dist/auth/auth-manager.js +133 -11
- package/dist/auth/auth-manager.js.map +1 -1
- package/dist/auth/mcp-auth.d.ts +25 -4
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +145 -29
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/retention-engine.js +1 -1
- package/dist/compliance/retention-engine.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +56 -8
- package/dist/config.js.map +1 -1
- package/dist/gemini/gemini-client.d.ts.map +1 -1
- package/dist/gemini/gemini-client.js +58 -20
- package/dist/gemini/gemini-client.js.map +1 -1
- package/dist/index.js +87 -180
- package/dist/index.js.map +1 -1
- package/dist/notebook-creation/audio-manager.js +2 -2
- package/dist/notebook-creation/audio-manager.js.map +1 -1
- package/dist/notebook-creation/data-table-manager.d.ts +13 -3
- package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
- package/dist/notebook-creation/data-table-manager.js +70 -32
- package/dist/notebook-creation/data-table-manager.js.map +1 -1
- package/dist/notebook-creation/discover-creation-flow.js +1 -1
- package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
- package/dist/notebook-creation/discover-quota.js +1 -1
- package/dist/notebook-creation/discover-quota.js.map +1 -1
- package/dist/notebook-creation/discover-sources.js +1 -1
- package/dist/notebook-creation/discover-sources.js.map +1 -1
- package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
- package/dist/notebook-creation/notebook-creator.js +49 -26
- package/dist/notebook-creation/notebook-creator.js.map +1 -1
- package/dist/notebook-creation/notebook-sync.js +1 -1
- package/dist/notebook-creation/notebook-sync.js.map +1 -1
- package/dist/notebook-creation/selectors.d.ts +21 -16
- package/dist/notebook-creation/selectors.d.ts.map +1 -1
- package/dist/notebook-creation/selectors.js +37 -20
- package/dist/notebook-creation/selectors.js.map +1 -1
- package/dist/notebook-creation/source-manager.d.ts.map +1 -1
- package/dist/notebook-creation/source-manager.js +29 -6
- package/dist/notebook-creation/source-manager.js.map +1 -1
- package/dist/notebook-creation/video-manager.d.ts +10 -1
- package/dist/notebook-creation/video-manager.d.ts.map +1 -1
- package/dist/notebook-creation/video-manager.js +103 -42
- package/dist/notebook-creation/video-manager.js.map +1 -1
- package/dist/quota/quota-manager.d.ts.map +1 -1
- package/dist/quota/quota-manager.js +46 -15
- package/dist/quota/quota-manager.js.map +1 -1
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +21 -14
- package/dist/session/browser-session.js.map +1 -1
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
- package/dist/tools/definitions/notebook-management.js +64 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -1
- package/dist/tools/handlers/ask-question.d.ts +18 -0
- package/dist/tools/handlers/ask-question.d.ts.map +1 -0
- package/dist/tools/handlers/ask-question.js +236 -0
- package/dist/tools/handlers/ask-question.js.map +1 -0
- package/dist/tools/handlers/audio-video.d.ts +42 -0
- package/dist/tools/handlers/audio-video.d.ts.map +1 -0
- package/dist/tools/handlers/audio-video.js +356 -0
- package/dist/tools/handlers/audio-video.js.map +1 -0
- package/dist/tools/handlers/auth.d.ts +41 -0
- package/dist/tools/handlers/auth.d.ts.map +1 -0
- package/dist/tools/handlers/auth.js +171 -0
- package/dist/tools/handlers/auth.js.map +1 -0
- package/dist/tools/handlers/gemini.d.ts +142 -0
- package/dist/tools/handlers/gemini.d.ts.map +1 -0
- package/dist/tools/handlers/gemini.js +626 -0
- package/dist/tools/handlers/gemini.js.map +1 -0
- package/dist/tools/handlers/index.d.ts +295 -0
- package/dist/tools/handlers/index.d.ts.map +1 -0
- package/dist/tools/handlers/index.js +197 -0
- package/dist/tools/handlers/index.js.map +1 -0
- package/dist/tools/handlers/notebook-creation.d.ts +75 -0
- package/dist/tools/handlers/notebook-creation.d.ts.map +1 -0
- package/dist/tools/handlers/notebook-creation.js +598 -0
- package/dist/tools/handlers/notebook-creation.js.map +1 -0
- package/dist/tools/handlers/notebook-management.d.ts +64 -0
- package/dist/tools/handlers/notebook-management.d.ts.map +1 -0
- package/dist/tools/handlers/notebook-management.js +214 -0
- package/dist/tools/handlers/notebook-management.js.map +1 -0
- package/dist/tools/handlers/session-management.d.ts +68 -0
- package/dist/tools/handlers/session-management.d.ts.map +1 -0
- package/dist/tools/handlers/session-management.js +238 -0
- package/dist/tools/handlers/session-management.js.map +1 -0
- package/dist/tools/handlers/system.d.ts +102 -0
- package/dist/tools/handlers/system.d.ts.map +1 -0
- package/dist/tools/handlers/system.js +275 -0
- package/dist/tools/handlers/system.js.map +1 -0
- package/dist/tools/handlers/types.d.ts +19 -0
- package/dist/tools/handlers/types.d.ts.map +1 -0
- package/dist/tools/handlers/types.js +5 -0
- package/dist/tools/handlers/types.js.map +1 -0
- package/dist/tools/handlers/webhooks.d.ts +34 -0
- package/dist/tools/handlers/webhooks.d.ts.map +1 -0
- package/dist/tools/handlers/webhooks.js +122 -0
- package/dist/tools/handlers/webhooks.js.map +1 -0
- package/dist/tools/handlers.d.ts +27 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +226 -5
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/utils/cleanup-manager.d.ts.map +1 -1
- package/dist/utils/cleanup-manager.js +8 -10
- package/dist/utils/cleanup-manager.js.map +1 -1
- package/dist/utils/file-permissions.d.ts.map +1 -1
- package/dist/utils/file-permissions.js +41 -6
- package/dist/utils/file-permissions.js.map +1 -1
- package/docs/improvement-sprint-2026.2.10.md +210 -0
- 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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACrD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,wDAAwD;IACxD,gBAAgB,EAAE,KAAK;IACvB,+DAA+D;IAC/D,UAAU,EAAE,KAAK;IACjB,iEAAiE;IACjE,oBAAoB,EAAE,KAAK;IAC3B,yEAAyE;IACzE,2BAA2B,EAAE,KAAK;CAC1B,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,OAAe,gBAAgB,CAAC,gBAAgB;IAEhD,IAAI,CAAC;QACH,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;
|
|
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.
|
|
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
|
|
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": {
|