Skip to content

Releases: jacob-bd/gemini-notebook-mcp-cli

v0.9.4

Choose a tag to compare

@jacob-bd jacob-bd released this 25 Jul 15:54

Fixed

  • Misleading "Cannot connect to browser on port" error when Chrome is already running (#272) — the error now detects the Chrome hand-off case and tells you to fully quit Chrome and retry. Thanks to @argonaut-cm for the detailed repro with live CDP target output.

Added

  • notebook.cloud.google.com recognized as a NotebookLM host — the Workspace/enterprise variant of the "Gemini Notebook" rebrand host added in 0.9.3. Thanks to @conexaoarteiro for reporting the rebrand on a Workspace account.

See CHANGELOG.md for full details.

v0.9.3

Choose a tag to compare

@jacob-bd jacob-bd released this 25 Jul 06:27

Fixed

  • Support Google's "Gemini Notebook" rebrand at notebook.google.com (#269) — Google is rolling out a rebrand of NotebookLM that redirects some signed-in accounts from notebooklm.google.com to notebook.google.com. Previously this broke every auth path for migrated accounts: nlm login timed out because sign-in detection only recognized the old host; API calls failed because the httpx client always targeted notebooklm.google.com regardless of where the account actually landed; and the NOTEBOOKLM_BASE_URL escape hatch rejected the new host outright.
    • notebook.google.com is now a recognized NotebookLM host for login detection (is_logged_in) and for NOTEBOOKLM_BASE_URL.
    • The CLI now records which host a signed-in session actually landed on (base_host, persisted per-profile in metadata.json) and every client construction path — CLI, MCP, chat sessions, and the nlm doctor auth-replay diagnostic — routes requests to that host automatically. No configuration is needed for migrated accounts; non-migrated accounts see no change, since the default host is still notebooklm.google.com.
    • Precedence: NOTEBOOKLM_BASE_URL env var (if set) > the account's persisted base_host > the default host.
    • Thanks to @grergea for the detailed report and reproduction steps!

v0.9.2

Choose a tag to compare

@jacob-bd jacob-bd released this 23 Jul 18:39

Fixed

  • Desktop extension finds uvx installed via pip install --user on Windows (#267) — the .mcpb launcher could fail to start with Error: Could not find 'uvx' even when uv was installed, because pip install --user uv places uvx.exe in %APPDATA%\Python\Python3XX\Scripts, which Windows does not add to PATH and which was missing from the launcher's search list. The launcher now checks the per-user Scripts directory of every installed CPython version. No behavior change on macOS/Linux. Thanks to @onexoluxion for the fix!

Security

  • Bumped locked dependencies with published CVEs (#268)uv.lock now pins mcp 1.28.1, starlette 1.3.1, python-multipart 0.0.32, cryptography 49.0.0, and pyjwt 2.13.0. Lockfile-only change: no source or constraint changes, and end users installing via uv tool install were already resolving patched versions from PyPI — this brings the committed lockfile (used by CI and contributors) up to date. Thanks to @onexoluxion for the precise report and verified fix command!

v0.9.1

Choose a tag to compare

@jacob-bd jacob-bd released this 22 Jul 18:27

Added

  • Chat session management (#256) — list, view, export, and save past notebook chats.
    • CLI: nlm chats list <notebook>, nlm chats get <notebook> [conversation_id], nlm chats export <notebook> [conversation_id] --format md|json --output file, and nlm chats to-note <notebook> <conversation_id> [--turn N] [--title ...].
    • MCP tools: chat_list, chat_get, chat_export.
    • Transcripts are fetched from NotebookLM's server (a newly-documented khqZz RPC, see docs/API_REFERENCE.md), so past chats are visible even from a fresh CLI invocation or MCP session — not just chats made earlier in the same process.
    • Documented in SKILL.md, AGENTS_SECTION.md's command_reference.md, docs/CLI_GUIDE.md, docs/MCP_GUIDE.md, README.md, and AGENTS.md.

Fixed

  • Preserve profile email across token updates (#266)AuthManager.save_profile() now preserves the existing stored profile email from metadata.json when email=None is passed during background CSRF updates, token refreshes, and save_tokens_to_cache() calls.
  • Chat session tools now respect the configured default profileservices/chats.py no longer hardcodes profile "default"; it now falls back to get_config().auth.default_profile like the rest of the CLI/MCP client resolution, so chat_list/chat_get/chat_export and nlm chats ... work correctly for accounts using nlm login switch.
  • nlm chats to-note / save_chat_to_note now creates the note correctly — it was calling notes_service.create_note() with the wrong signature (notebook=/profile= keyword args instead of the required (client, notebook_id, content, title)), which raised a TypeError at runtime. Never shipped, caught before release via live testing.
  • chat_list/chat_get/chat_export are now hideable via NOTEBOOKLM_DISABLED_GROUPS — added to the chat tool group in tool_groups.py, which previously covered only notebook_query/chat_configure/notebook_query_start/notebook_query_status.
  • Tool count corrected to 43 across all docslabel, notebook_query_start, and notebook_query_status were registered MCP tools missing from mcp/tools/__init__.py's __all__ and from docs/MCP_GUIDE.md (which also separately lacked source_rename and notebook_share_batch). Fixed the export list and documented every tool; updated the stale "40 tools" (and one "39 tools") count in README.md, the desktop extension manifest, SKILL.md, and docs/MCP_CLI_TEST_PLAN.md. Added a regression test (test_groups_cover_every_registered_tool) so a new tool shipping without a tool_groups.py entry fails CI instead of silently drifting.

v0.9.0

Choose a tag to compare

@jacob-bd jacob-bd released this 21 Jul 01:54

Added

  • Bulk artifact download: new MCP tool download_all_artifacts and CLI command nlm download all download every completed Studio artifact of a notebook — or every notebook in the account with --all-notebooks/all_notebooks=True — into per-notebook directories named after each notebook's title.
  • --types/artifact_types filter to restrict which artifact types are downloaded.
  • --skip-existing/skip_existing for incremental re-runs — previously downloaded files are never re-fetched.
  • Safe cross-platform filenames: invalid characters replaced, Windows reserved names escaped, and collisions deduped case-insensitively for both notebook directories and artifact filenames.
  • A failure on one artifact or notebook is recorded and does not stop the rest; the CLI exits non-zero only when nothing was downloaded and failures occurred.

Thanks

Thanks to @hansschenker for the original contribution (#258), and to @runthangs for following up with fixes for directory collisions, case-insensitive overwrites, and the --all-notebooks exit code (#264)!

Documentation

  • Reconciled the MCP tool count (39 → 40) and documented download_all_artifacts/nlm download all across the README, MCP Guide, CLI Guide, packaged skill, and command reference.

Validation

  • 1,203 automated tests passed, 39 skipped.
  • Ruff lint and formatting checks passed.
  • Live smoke test against a real notebook: full download of 18 artifacts, then a --skip-existing re-run correctly skipped all 18.

Full Changelog: v0.8.9...v0.9.0

v0.8.9

Choose a tag to compare

@jacob-bd jacob-bd released this 17 Jul 17:06

Added

  • MCP studio_status now returns a lean page of 20 artifacts by default. Agents can poll one artifact by ID, request later pages, or opt into detailed prompts and content.
  • CLI Studio JSON now includes both id and artifact_id while keeping the existing plain-list format. --mcp-compatible returns the MCP response shape.
  • nlm video list now gives people and agents a direct way to list generated videos.

Fixed

  • Non-English Short video requests now add a clear language requirement for narration, subtitles, and on-screen text.
  • MCP Studio creation errors now preserve the retry guidance for NotebookLM rate limits.
  • CLI, MCP, API, troubleshooting, test-plan, and bundled agent documentation now describe the current status, language, and retry behavior.

Thanks

Thanks to @smlfg for running a real 20-video batch, documenting each failure clearly, and offering concrete fixes. That report gave us the detail we needed to address the agent workflow from creation through polling.

Validation

  • 1,162 automated tests passed, with 38 skipped and 1 deselected.
  • Ruff lint and formatting checks passed.
  • We built and verified the Python wheel, source distribution, and MCPB desktop extension.

Full Changelog: v0.8.8...v0.8.9

v0.8.8

Choose a tag to compare

@jacob-bd jacob-bd released this 16 Jul 15:09

Added

  • Opt-in file upload directory allowlist (#260) — Set NOTEBOOKLM_ALLOWED_FILE_DIRS to restrict local file uploads to approved directories. The setting accepts multiple directories separated by the operating system's path separator and is disabled by default, so existing installations keep their current behavior. Thanks to @failsafesecurity for the contribution!
  • Opt-in download output directory (#261) — Set NOTEBOOKLM_DOWNLOAD_DIR to keep downloaded artifacts inside one approved directory. The setting is disabled by default, while the existing protections against sensitive system directories remain active. Thanks again to @failsafesecurity for the contribution!

Fixed

  • Rejected document uploads now fail fast (#257) — When NotebookLM immediately rejects a non-media file, nlm now reports the failure on the first terminal status instead of waiting for the full processing timeout. The error includes the source ID and deletion guidance, and source listings expose the numeric processing status for diagnosis. Audio and video uploads retain their transient-processing tolerance. Thanks to @ericvael for the detailed reproduction data!
  • Refreshed authentication cookies are persisted — Rotated cookies are now saved together with refreshed CSRF and session tokens, preventing a successful refresh from leaving stale credentials on disk.
  • Regular notes no longer appear as mind maps (#258) — Mind-map discovery now excludes ordinary saved notes. Thanks to @hansschenker for the contribution!
  • Newer Studio mind maps download correctly (#258) — Mind maps returned through NotebookLM's shared type-4 Studio format are now classified by subtype and downloaded as their embedded JSON instead of being treated as quizzes or flashcards. Thanks again to @hansschenker for the contribution!

Documentation

  • Documented the opt-in upload and download directory controls and the observed type-4 mind-map format.

Validation

  • Passed 1,150 automated tests (38 skipped, 1 deselected).
  • Passed Ruff lint and formatting checks.
  • Built and verified the Python wheel, source distribution, and MCPB desktop extension.

Full Changelog: v0.8.7...v0.8.8

v0.8.7

Choose a tag to compare

@jacob-bd jacob-bd released this 15 Jul 01:30

This maintenance release improves JSON output for scripting and fixes two live-observed metadata issues.

Added

  • Added --json support to source add/delete, notebook delete, and every Studio creation command, including noun-first and verb-first command styles. (#256)
  • Added notebook emoji to nlm notebook get --json.
  • Added the original question to nlm notebook query --json.

Fixed

  • Correctly identify saved mind maps in Studio status instead of labeling them as flashcards.
  • Prevent duplicate mind-map entries when NotebookLM returns the same artifact through both status paths.
  • Report Drive-picker PDFs as pdf when NotebookLM provides an explicit application/pdf MIME type with its ambiguous source code.

Validation

  • Tested all new JSON creation and deletion outputs against a live NotebookLM account.
  • Verified all nine Studio creation commands returned real artifact IDs.
  • Passed 1,120 automated tests plus Ruff lint and formatting checks.

Full Changelog: v0.8.6...v0.8.7

v0.8.6 - Fix false browser_bound_replay verdict

Choose a tag to compare

@jacob-bd jacob-bd released this 11 Jul 18:11

Fixed

  • nlm doctor auth-replay false browser_bound_replay verdict on merely expired cookies (#248) — The diagnostic previously compared stale on-disk cookies (httpx_saved, httpx_after_rotate) against an always-fresh live browser session (cdp_in_page). Since a live session's cookies are fresh by construction, that comparison could not distinguish ordinary cookie expiry from genuine device-bound replay — both produce the exact same pass/fail pattern. The diagnostic now re-extracts cookies from the same live browser session used for the CDP probe and replays them through plain httpx (new httpx_fresh lane) before drawing a conclusion. If fresh cookies succeed over httpx, the verdict is now the new stale_cookies (run nlm login, no transport needed); browser_bound_replay is only reported when even freshly re-extracted cookies fail outside the browser. Thanks to @leomesheti-crypto for the detailed controlled-comparison report that caught this.

Changed

  • nlm doctor auth-replay now reports four lanes instead of three: saved-cookie httpx replay, httpx after forced cookie rotation, fresh-cookie httpx replay, and the in-page CDP fetch. --no-cdp skips the two browser-backed lanes together.
  • Updated docs/AUTHENTICATION.md to describe the corrected four-lane diagnostic and clarify when the experimental NOTEBOOKLM_RPC_TRANSPORT=cdp transport is actually justified.

Other

  • README: moved the "Buy Me a Coffee" call-out from a low-visibility badge in the top badge row to a prominent, centered block near the top of the page.

v0.8.5

Choose a tag to compare

@jacob-bd jacob-bd released this 10 Jul 21:11

What's Changed

New Contributors

Full Changelog: v0.8.4...v0.8.5