Releases: Pantheon-Security/notebooklm-mcp-secure
v2026.2.9 — Fix: performSetup No Longer Destroys Auth Before Chrome Opens
Critical Bug Fix
Root Cause
performSetup called clearAllAuthData() unconditionally at startup — before Chrome even opened. If Chrome failed to launch or the user didn't complete login within the timeout, all auth credentials were already destroyed with no recovery path.
This was the final source of recurring auth loss.
Changes
- Removed
clearAllAuthData()fromperformSetup— Chrome re-login overwrites cookies without needing to delete first. For account switching, callclearAllAuthData()explicitly before invokingsetup_auth - Added stack trace logging to
clearAllAuthData()so every call is traceable in server logs with the exact caller location
Upgrade Notes
Auth is now stable across session restarts. Use auth-now.mjs in the project root for initial authentication or re-authentication.
v2026.2.8 — Fix: cleanup_data No Longer Destroys Auth Credentials
Critical Bug Fix
Root Cause
Sessions were following get_health's troubleshooting tip which said to run cleanup_data(confirm:true). This deleted browser_state/ and chrome_profile/ — the Google auth credentials — then setup_auth ran headlessly and failed to restore them.
Changes
cleanup_datano longer includesbrowser_stateorchrome_profilein any cleanup path — these contain Google auth cookies that require interactive login to recreateget_healthtroubleshooting tip updated to saysetup_auth(show_browser:true)and explicitly warns not to callcleanup_datafor auth issues
v2026.2.7 — Fix: Block Headless setup_auth & Robust auth-now.mjs
Bug Fixes
Block Headless setup_auth
setup_authwithoutshow_browser:truenow returns a clear error- Prevents sessions calling
setup_authheadlessly from wiping credentials without being able to restore them
Robust auth-now.mjs Script
- Added explicit error logging at every save step
- Fixed URL detection (now matches with or without trailing slash)
- Kills any existing Chrome processes holding the profile before launching
- Verifies state file exists on disk after save
- Keeps browser open 60s after success so you can confirm before opening sessions
v2026.2.6 — New: add_folder Tool & Improved Tier Detection
New Features
add_folder Tool
Add all files from a local folder as sources to a NotebookLM notebook.
- Scans for supported file types (default:
.pdf,.txt,.md,.docx) - Adds each file with per-file progress reporting
dry_run: truepreviews files without adding- Auto-splits into multiple numbered notebooks if file count exceeds your tier's source limit
- Collects per-file errors without stopping the whole batch
- Optional
recursivescanning of subdirectories
Improved Tier Detection
- Detects NotebookLM Plus / One AI Premium branding (Pro was rebranded in 2024)
- Infers tier from source count pattern (e.g.
0/300→ Pro,0/600→ Ultra,0/50→ Free) shown on notebook page - Also infers tier from source limit extracted during
get_quota(sync:true) - Fixes tier stuck on
unknown→ free limits for Pro/Ultra accounts
v2026.2.5 — Fix: show_browser Passed to performSetup in setup_auth
Bug Fix
show_browser:true was accepted by setup_auth but silently ignored — performSetup always ran headlessly regardless.
Changes
show_browserargument is now correctly forwarded toperformSetupsosetup_authcan open a visible browser even whenHEADLESS=trueis set in the environment
v2026.2.4 — Auth Stability: 7-Day State Expiry & Race Condition Fixes
Auth Stability Improvements
Changes
- Extended state file expiry from 24h to 7 days — Google cookies last 2-4 weeks so daily expiry was causing unnecessary auth prompts
- Touch state file on every successful
validateWithRetryso the 7-day clock resets on each use rather than from lastsetup_auth - Block headless
re_authwithoutshow_browser:true— calling it headlessly wiped credentials then failed to restore them, destroying auth for all concurrent sessions - Extended
retention-enginepolicy_sessionfrom 1 day to 14 days to match
Bug Fix
re_auth called without show_browser:true now returns a clear error instead of destroying credentials.
v2026.2.3 — Studio Panel Tools Restored
What's fixed
generate_data_table and generate_video_overview are fully working again, confirmed on macOS M4 with French locale.
Root causes
1. Dead tile selector
clickDataTableTile used .mat-icon, [class*='icon'] which matched SPAN.icon-container before <mat-icon>, so the === "table_view" equality check always failed silently. Fixed to target the mat-icon element tag directly.
2. False failure on slow shimmer
After clicking the tile, if shimmer-blue didn't appear within 15s the tools returned success: false. The click was triggering generation server-side but the headless browser DOM update lagged. Now returns { success: true, status: "generating" } so callers can poll with get_data_table / get_video_status.
3. data-create-button-type removed by Google
Google removed this attribute from all Studio panel tiles (Feb 2026). Replaced with mat-icon text (table_view) and jslog ID (282298) as locale-independent selectors.
Also in this release
- Studio panel
waitForSelectortimeout increased from 10s → 30s - Full i18n pass: locale-independent selectors throughout (CSS classes, Material icon names,
jslogIDs) — English text as last-resort fallback only - GitHub Actions CI on all PRs +
mainbranch protection (force push / deletion blocked, build check required)
Upgrading
git pull && npm run buildv2026.2.0 — Gemini 3, Video Overviews, Data Tables
v2026.2.0 — Gemini 3, Video Overviews & Data Tables
Gemini 3 Model Support
- Default model now
gemini-3-flash-preview(wasgemini-2.5-flash) gemini-3-pro-previewalso available for higher-quality output- Deprecation warnings when using Gemini 2.5 models — retiring March 31, 2026
- Incomplete status handling for Deep Research partial results
- @google/genai SDK upgraded to 1.41.0
Thinking Level Control
- New
thinking_levelparameter forgemini_queryanddeep_research - Options:
minimal,low,medium,high - Control response thoroughness vs speed
Structured JSON Output
- New
response_schemaparameter forgemini_query - Pass a JSON schema, get validated structured JSON back from Gemini 3
- Automatically sets
responseMimeType: "application/json"
Video Overview Generation (4 new tools)
generate_video_overview— Generate AI-powered Video Overviews via NotebookLM's Studio panelget_video_status— Check generation progress (3-10 min typical)- 10 visual styles: auto-select, custom, classic, whiteboard, kawaii, anime, watercolour, retro-print, heritage, paper-craft
- 2 formats: explainer (full, 5-15 min) and brief (summary, 1-3 min)
Data Table Extraction
generate_data_table— Generate structured Data Tables from notebook sourcesget_data_table— Extract table as JSON with headers and rows- Returns machine-readable structured data for analysis and processing
Technical Details
- 21 files changed, +1,526 lines
- All browser automation selectors verified against live NotebookLM DOM (Feb 2026)
- 111/111 tests passing
- Tool count: 47
Install / Upgrade
claude mcp add notebooklm -- npx @pan-sec/notebooklm-mcp@latestFull changelog: https://github.com/Pantheon-Security/notebooklm-mcp-secure/blob/main/CHANGELOG.md
v2026.1.12
Security Hardening Release
Comprehensive remediation from 4 independent code reviews (Code Quality, Performance, Sustainability, Medusa Security Scan). 23 fixes across 18 files.
Security
- Constant-time auth — token comparison now uses
secureCompare(prevents timing attacks) - Command injection fix —
execSync()replaced withexecFileSync()in file-permissions - MCP SDK 1.26.0 — patches HIGH severity cross-client data leak (GHSA-345p-7cg4-v4c7)
- Audit hash chain — increased to 128-bit truncation for collision resistance
- Settings validation — parsed JSON validated before merge (prevents property injection)
- Error sanitization — internal identifiers removed from error messages
- Dockerfile hardened with
--no-install-recommends - Config validation —
NOTEBOOK_PROFILE_STRATEGYvalidated against allowed values
Fixed — Memory & Concurrency
- CONFIG mutation race condition — removed all 6
Object.assign(CONFIG, ...)sites - RateLimiter memory leak — empty keys now evicted
- FinalizationRegistry — fixed self-reference preventing GC of secure buffers
- Event listener leak —
framenavigatedlistener cleaned up after 30s timeout - Timer leak — SecureCredential auto-wipe timer now
.unref()'d
Performance
- Regex precompilation in
sanitizeForLogging(~30-40% faster) - IPC reduction —
detectRateLimitErrorconsolidated from 8+ calls to 1 - O(n) dedup in notebook extraction (was O(n^2))
- ESM import fix — removed inline
require('path')
Code Quality
- Version strings unified to use
package.jsonversion - Debounced library save — no longer writes to disk on every query
- ToolResult type safety — default changed from
anytounknown
Medusa Scan Analysis
- 107 findings analyzed: 100 false positives, 7 true positives (all fixed)
- Detailed FP analysis documented in
medusa-fp-analysis.md
Full Changelog
v2026.1.11
What's New
Fixed — Notebook Sync for New Angular UI
sync_librarynow correctly extracts notebook UUIDs from NotebookLM's updated Angular Material interface- Automatically switches to grid view where UUIDs are available in DOM element IDs
- 3-tier extraction strategy: grid view cards → click-navigation → basic table fallback
- Resolves broken UUID extraction reported in PR #3 — thanks @robert-merrill
- Quota manager updated to detect notebooks via
project-button(grid) andproject-action-button(table)
Added — Disable Gemini Tools
NOTEBOOKLM_NO_GEMINI=trueenvironment variable hides all 8 Gemini API tools from the tool list- Useful for clients with context window limitations (e.g., OpenCode)
- Affected tools:
deep_research,gemini_query,get_research_status,upload_document,query_document,list_documents,delete_document,query_chunked_document