Repository Analysis

jacob-bd/gemini-notebook-mcp-cli

Programmatic access to Gemini Notebook - via command-line interface (CLI), Model Context Protocol (MCP) server, and AI agent skills.

50.2 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of jacob-bd/gemini-notebook-mcp-cli, a Python project with 5,787 GitHub stars. SynthScan v2.0 examined 70,001 lines of code across 233 source files, recording 2045 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 50.2 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

50.2
Adjusted Score
50.2
Raw Score
100%
Time Factor
2026-08-09
Last Push
5.8K
Stars
Python
Language
70.0K
Lines of Code
233
Files
2.0K
Pattern Hits
2026-08-09
Scan Date
0.72
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 38HIGH 130MEDIUM 227LOW 1650

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 2045 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers1070 hits · 1102 pts
SeverityFileLineSnippetContext
LOWtests/test_api_client.py114 def test_refresh_auth_tokens_success(self, mock_client):CODE
LOWtests/test_api_client.py137 def test_refresh_auth_tokens_redirect_login(self, mock_client):CODE
LOWtests/test_api_client.py154 def test_get_notebook_sources_extracts_url(self, mock_client):CODE
LOWtests/test_api_client.py198 def test_add_drive_source_uses_extended_timeout(self, mock_client):CODE
LOWtests/test_api_client.py223 def test_add_drive_source_timeout_returns_status(self, mock_client):CODE
LOWtests/test_wsl.py13def test_get_windows_host_ip_uses_loopback_in_mirrored_mode(monkeypatch):CODE
LOWtests/test_wsl.py28def test_get_windows_host_ip_uses_gateway_in_nat_mode(monkeypatch):CODE
LOWtests/test_wsl.py51def test_get_windows_host_ip_uses_gateway_when_wslinfo_is_unavailable(monkeypatch):CODE
LOWtests/test_coerce_list.py12 def test_empty_string_returns_none(self):CODE
LOWtests/test_coerce_list.py16 def test_actual_list_passthrough(self):CODE
LOWtests/test_coerce_list.py22 def test_comma_separated_string(self):CODE
LOWtests/test_coerce_list.py25 def test_comma_separated_with_spaces(self):CODE
LOWtests/test_coerce_list.py35 def test_int_list_passthrough(self):CODE
LOWtests/test_coerce_list.py41 def test_list_of_strings_cast_to_int(self):CODE
LOWtests/test_coerce_list.py44 def test_empty_list_returns_empty(self):CODE
LOWtests/test_coerce_list.py47 def test_malformed_json_falls_back_to_comma(self):CODE
LOWtests/test_research_polling.py17 def test_poll_research_filtering(self, mock_client):CODE
LOWtests/test_mcp_studio.py22def test_studio_status_is_lean_and_bounded_by_default():CODE
LOWtests/test_mcp_studio.py54def test_studio_status_can_request_one_detailed_artifact():CODE
LOWtests/test_mcp_studio.py85def test_studio_create_preserves_rate_limit_hint():CODE
LOWtests/test_mcp_studio.py114def test_studio_revise_preserves_hint_on_service_error():CODE
LOWtests/test_mcp_e2e.py76 def test_notebook_create_rename_delete(self, mcp_tools):CODE
LOWtests/test_mcp_e2e.py132 def test_source_add_invalid_type(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py172 def test_studio_create_without_confirm(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py183 def test_studio_create_invalid_type(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py195 def test_studio_create_flashcards(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py224 def test_notebook_share_status(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py231 def test_notebook_share_public_toggle(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py249 def test_download_artifact_invalid_type(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py257 def test_download_artifact_no_artifact(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py269 def test_all_tools_registered(self):CODE
LOWtests/test_mcp_file_upload.py11 def test_source_add_file_exists(self):CODE
LOWtests/test_mcp_file_upload.py18 def test_source_add_file_calls_client(self):CODE
LOWtests/test_mcp_file_upload.py51 def test_source_add_file_requires_path(self):CODE
LOWtests/test_mcp_file_upload.py65 def test_source_add_file_returns_server_path_and_reason(self, tmp_path):CODE
LOWtests/test_io_encoding_windows.py7def test_configure_stdio_noop_on_non_windows(monkeypatch):CODE
LOWtests/test_io_encoding_windows.py17def test_configure_stdio_calls_reconfigure_on_windows(monkeypatch):CODE
LOWtests/test_mcp_server_capabilities.py8def test_runtime_capabilities_report_complete_and_partial_groups():CODE
LOWtests/test_mcp_server_capabilities.py40def test_empty_group_is_not_reported_as_available():CODE
LOWtests/test_mcp_server_capabilities.py53def test_group_with_only_one_registered_tool_is_partial_not_available():CODE
LOWtests/test_mcp_server_capabilities.py63def test_server_info_marks_provider_capabilities_unprobed():CODE
LOWtests/test_profile_cache_isolation.py18def test_named_profile_refresh_updates_only_that_profile():CODE
LOWtests/test_profile_cache_isolation.py51def test_named_profile_recovery_reloads_same_profile():CODE
LOWtests/test_profile_cache_isolation.py68def test_named_profile_load_never_falls_back_to_legacy_default():CODE
LOWtests/test_auth_browser.py7def test_select_auth_backend_ignores_firefox_preference_and_uses_chromium():CODE
LOWtests/test_auth_browser.py19def test_select_auth_backend_auto_prefers_chromium_when_available():CODE
LOWtests/test_auth_browser.py31def test_select_auth_backend_returns_none_when_no_chromium_browser_available():CODE
LOWtests/test_auth_browser.py40def test_supported_auth_browsers_excludes_firefox():CODE
LOWtests/test_auth_browser.py52def test_get_chromium_path_ignores_explicit_firefox_preference():CODE
LOWtests/test_auth_browser.py58def test_saved_legacy_browser_backend_is_read_from_metadata(tmp_path, monkeypatch):CODE
LOWtests/test_auth_browser.py74def test_flatten_cookies_prefers_google_com_over_other_domains():CODE
LOWtests/test_auth_browser.py93def test_flatten_cookies_passthrough_dict_and_skips_malformed():CODE
LOWtests/test_auth_browser.py100def test_flatten_cookies_empty_list_and_empty_value():CODE
LOWtests/test_auth_browser.py107def test_validate_cookies_accepts_chrome_list():CODE
LOWtests/test_auth_browser.py119def test_validate_notebooklm_cookies_accepts_chrome_list():CODE
LOWtests/test_auth_browser.py131def test_auth_tokens_cookie_header_flattens_list():CODE
LOWtests/test_auth_browser.py144def test_get_headers_flattens_list_cookies(tmp_path, monkeypatch):CODE
LOWtests/test_profile_aware_headless_auth.py6def test_mcp_refresh_auth_uses_configured_default_profile(monkeypatch):CODE
LOWtests/test_profile_aware_headless_auth.py43def test_core_recovery_uses_configured_default_profile(monkeypatch):CODE
LOWtests/test_snap.py10def test_is_snap_browser_direct_path():CODE
1010 more matches not shown…
Decorative Section Separators205 hits · 656 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_auth_migration.py145 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py147 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py161 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py163 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py289 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py291 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py339 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py341 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py397 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py399 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py429 # ------------------------------------------------------------------COMMENT
MEDIUMtests/test_auth_migration.py431 # ------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py16# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py18# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py51# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py53# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py180# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py182# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py243# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py245# ===========================================================================COMMENT
MEDIUMtests/core/test_source_reconciliation.py16# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py18# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py48# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py50# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py117# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py119# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py173# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py175# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py207# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py209# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py34# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py36# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py96# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py98# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py456# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py458# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py544# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py546# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py559# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py561# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py141# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py143# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py314# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py316# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/test_label_rpcs.py17# ─── Helpers ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/test_label_rpcs.py39# ─── Test client ─────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/test_label_rpcs.py108# ─── Main ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py265# ============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py267# ============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py313# =============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py315# =============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py625# =============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/auth.py627# =============================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/studio.py31 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/studio.py33 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/studio.py204 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/studio.py206 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/research.py24 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/research.py26 # =========================================================================COMMENT
MEDIUMsrc/notebooklm_tools/core/conversation.py64 # =========================================================================COMMENT
145 more matches not shown…
Hallucination Indicators38 hits · 395 pts
SeverityFileLineSnippetContext
CRITICALtests/test_file_upload.py13from notebooklm_tools.core.exceptions import FileUploadError, FileValidationErrorCODE
CRITICALtests/test_cdp_url_check.py125 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cookie_parsing.py9from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py487 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py509 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py532 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py555 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py573 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py592 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py613 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/core/test_auth_check.py88 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/core/test_auth_guard.py3from notebooklm_tools.core.exceptions import AccountMismatchError, NLMErrorCODE
CRITICALtests/core/test_alias.py7from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALtests/core/test_sources.py171 from notebooklm_tools.core.exceptions import SourceProcessingErrorCODE
CRITICALtests/services/test_sources.py316 from notebooklm_tools.core.exceptions import SourceProcessingErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py468 from notebooklm_tools.core.exceptions import AccountMismatchErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py598 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py812 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/core/alias.py117 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/utils/cdp.py77from notebooklm_tools.core.exceptions import AuthenticationError # noqa: E402CODE
CRITICALsrc/notebooklm_tools/utils/browser.py8from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/utils/auth_browser.py6from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/cli/utils.py83 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py691 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py101 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py258 from notebooklm_tools.core.exceptions import AccountMismatchError, NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/studio.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/research.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/repl.py11from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/export.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/chat.py7from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/share.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/label.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/chats.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/notebook.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/source.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/note.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/services/chats.py14from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
Docstring Block Structure71 hits · 355 pts
SeverityFileLineSnippetContext
HIGHsrc/notebooklm_tools/core/exports.py32Export an artifact to Google Docs or Sheets. Args: notebook_id: The notebook UUID artifSTRING
HIGHsrc/notebooklm_tools/core/sharing.py164Add multiple collaborators to a notebook in a single API call. Args: notebook_id: The notebook UUIDSTRING
HIGHsrc/notebooklm_tools/core/studio.py1200Generate a Mind Map JSON from sources. This is step 1 of 2 for creating a mind map. After generation, uSTRING
HIGHsrc/notebooklm_tools/core/download.py112Download content from a URL to a local file with streaming support. Features: - Streams file in chunks STRING
HIGHsrc/notebooklm_tools/core/download.py815Parse rich-text data table into headers and rows. Features: - Validates structure at each navigation stSTRING
HIGHsrc/notebooklm_tools/core/download.py1039Fetch artifact HTML content for quiz/flashcard types. Args: notebook_id: The notebook ID. STRING
HIGHsrc/notebooklm_tools/core/download.py1096Extract JSON app data from interactive HTML. Quiz and flashcard HTML contains embedded JSON in a data-app-data STRING
HIGHsrc/notebooklm_tools/core/download.py1277Shared implementation for downloading quiz/flashcard artifacts. Args: notebook_id: The notebook ID.STRING
HIGHsrc/notebooklm_tools/core/download.py1377Download quiz artifact. Args: notebook_id: The notebook ID. output_path: Path to save tSTRING
HIGHsrc/notebooklm_tools/core/download.py1409Download flashcard deck artifact. Args: notebook_id: The notebook ID. output_path: PathSTRING
HIGHsrc/notebooklm_tools/core/constants.py32 Get integer code for a string name. Args: name: The string name (case-insensitive). STRING
HIGHsrc/notebooklm_tools/core/retry.py98Execute a callable with retry logic for transient server errors. Use this for one-off retry wrapping where a decoraSTRING
HIGHsrc/notebooklm_tools/core/sources.py132Wait for a source to finish processing. Polls the source status until it becomes READY or times out. NSTRING
HIGHsrc/notebooklm_tools/core/sources.py790Register a file source intent and get SOURCE_ID. Step 1 of the resumable upload protocol. Args: STRING
HIGHsrc/notebooklm_tools/core/sources.py837Start a resumable upload session and get the upload URL. Step 2 of the resumable upload protocol. ArgsSTRING
HIGHsrc/notebooklm_tools/core/sources.py940Add a local file as a source using resumable upload. Uses Google's resumable upload protocol: 1. RegistSTRING
HIGHsrc/notebooklm_tools/utils/wsl.py169Launch Chrome on Windows side from WSL. Args: port: Remote debugging port to use. debug: If True, cSTRING
HIGHsrc/notebooklm_tools/utils/cdp.py275Find an available port for Chrome debugging. Args: starting_from: Port to start scanning from max_aSTRING
HIGHsrc/notebooklm_tools/utils/cdp.py1344Extract cookies and tokens from Chrome via CDP. This is the main entry point for CDP-based authentication. ArgSTRING
HIGHsrc/notebooklm_tools/utils/browser.py17 Parse cookies from a file. The file can contain: - Raw cookie header string (Cookie: name=value; name2=valSTRING
HIGHsrc/notebooklm_tools/cli/main.py155Validate saved credentials using the lightweight authoritative check. Validity is decided by ``check_validity`` (a STRING
HIGHsrc/notebooklm_tools/services/exports.py30Export a NotebookLM artifact to Google Docs or Sheets. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/sharing.py74Get sharing status and collaborators for a notebook. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/sharing.py106Enable or disable public link access. Args: client: Authenticated NotebookLM client notebook_id: NoSTRING
HIGHsrc/notebooklm_tools/services/sharing.py145Invite a collaborator by email. Args: client: Authenticated NotebookLM client notebook_id: NotebookSTRING
HIGHsrc/notebooklm_tools/services/sharing.py191Invite multiple collaborators in a single API call. Args: client: Authenticated NotebookLM client nSTRING
HIGHsrc/notebooklm_tools/services/labels.py56Auto-label all sources using AI-generated thematic categories. Requires 5+ sources. If labels already exist, returnSTRING
HIGHsrc/notebooklm_tools/services/labels.py89Force AI re-categorization of sources into new labels. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/labels.py118Create a new empty label manually. Args: client: Authenticated NotebookLM client notebook_id: NotebSTRING
HIGHsrc/notebooklm_tools/services/labels.py157Rename an existing label. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID STRING
HIGHsrc/notebooklm_tools/services/labels.py196Set or clear the emoji marker on a label. Args: client: Authenticated NotebookLM client notebook_idSTRING
HIGHsrc/notebooklm_tools/services/labels.py234Assign a source to a label. Sources support multi-label assignment — this adds the source to the target label wSTRING
HIGHsrc/notebooklm_tools/services/labels.py275Delete one or more labels. Sources are NOT deleted. Args: client: Authenticated NotebookLM client nSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py65Add tags to a notebook. Args: notebook_id: Notebook UUID tags: List of tags to add notebookSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py118Remove tags from a notebook. Args: notebook_id: Notebook UUID tags: List of tags to remove RetSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py171Select notebooks relevant to a query based on tags. Uses simple keyword matching: splits query into words and matchSTRING
HIGHsrc/notebooklm_tools/services/studio.py153Resolve a human-readable name to an integer code via constants.CodeMapper. Args: mapper: The CodeMapper insSTRING
HIGHsrc/notebooklm_tools/services/studio.py861Revise a slide deck with per-slide instructions. Creates a NEW artifact — the original is not modified. Args: STRING
HIGHsrc/notebooklm_tools/services/research.py204Start a research task to find new sources. Args: client: Authenticated NotebookLM client notebook_iSTRING
HIGHsrc/notebooklm_tools/services/research.py291Poll research progress, optionally blocking until complete or timeout. Args: client: Authenticated NotebookSTRING
HIGHsrc/notebooklm_tools/services/research.py395Import discovered sources from a completed research task. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/notes.py49List all notes in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook USTRING
HIGHsrc/notebooklm_tools/services/notes.py78Create a new note in a notebook. Args: client: Authenticated NotebookLM client notebook_id: NotebooSTRING
HIGHsrc/notebooklm_tools/services/notes.py128Update a note's content and/or title. Args: client: Authenticated NotebookLM client notebook_id: NoSTRING
HIGHsrc/notebooklm_tools/services/notes.py179Delete a note permanently. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUIDSTRING
HIGHsrc/notebooklm_tools/services/downloads.py237Download a non-streaming artifact synchronously. For: report, mind_map, data_table, quiz, flashcards. Args: STRING
HIGHsrc/notebooklm_tools/services/downloads.py361Download a streaming artifact asynchronously. For: audio, video, slide_deck, infographic, quiz, flashcards. ArSTRING
HIGHsrc/notebooklm_tools/services/downloads.py470Download every completed studio artifact of a notebook. Creates a subdirectory of ``output_dir`` named after the noSTRING
HIGHsrc/notebooklm_tools/services/downloads.py653Run download_all() over every notebook in the account. Each notebook gets its own subdirectory of ``output_dir``. ASTRING
HIGHsrc/notebooklm_tools/services/sources.py148Add a source to a notebook. Centralizes validation and routing for all source types. Args: client: AutSTRING
HIGHsrc/notebooklm_tools/services/sources.py306Add multiple sources to a notebook. URL sources are batched into a single API call for efficiency. Non-URL sourSTRING
HIGHsrc/notebooklm_tools/services/sources.py412List sources with Drive freshness status. Args: client: Authenticated NotebookLM client notebook_idSTRING
HIGHsrc/notebooklm_tools/services/sources.py497Sync Drive sources with latest content. Args: client: Authenticated NotebookLM client source_ids: SSTRING
HIGHsrc/notebooklm_tools/services/sources.py529Rename a source in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook STRING
HIGHsrc/notebooklm_tools/services/sources.py633Get AI-generated source summary with keywords. Args: client: Authenticated NotebookLM client sourceSTRING
HIGHsrc/notebooklm_tools/services/sources.py673Get raw text content of a source (no AI processing). Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/chat.py136Query a notebook's sources with AI. Args: client: Authenticated NotebookLM client notebook_id: NoteSTRING
HIGHsrc/notebooklm_tools/services/chat.py210Configure notebook chat settings. Args: client: Authenticated NotebookLM client notebook_id: NoteboSTRING
HIGHsrc/notebooklm_tools/services/chat.py283Delete the chat history for a notebook. Fetches the notebook's persistent conversation ID, then deletes the assSTRING
HIGHsrc/notebooklm_tools/services/chat.py392Start a notebook query in a background thread for async polling. Returns immediately with a query_id. Use query_staSTRING
11 more matches not shown…
Cross-Language Confusion47 hits · 286 pts
SeverityFileLineSnippetContext
HIGHtests/test_api_client.py24 # Signature: ["wrb.fr", "RPC_ID", null, null, null, [16], "generic"]COMMENT
HIGHtests/test_api_client.py33 # [[["wrb.fr", "rLM1Ne", null, null, null, [16], "generic"]]]COMMENT
HIGHtests/test_api_client.py158 # Source structure: [[id], title, metadata, [null, 2]]COMMENT
HIGHtests/test_file_upload.py105 mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","[[[[\\"source-id-123\\"]]]]",null,null,null,"generic"]]'CODE
HIGHtests/test_file_upload.py130 mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","null",null,null,null,"generic"]]'CODE
HIGHtests/core/test_conversation.py950 # Table segment: [start, end, null, null, [dim1, dim2, rows_array]]COMMENT
HIGHtests/core/test_conversation.py670 # first_elem: [text, null, conv_data, null, type_info]COMMENT
HIGHtests/core/test_conversation.py949 """Table segments (nested=null, data at segment[4]) insert <cited_table>."""STRING
HIGHtests/core/test_sources.py51 mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[[]]",null,null,null,"generic"]]]'CODE
HIGHtests/core/test_sources.py74 mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[]",null,null,null,"generic"]]]'CODE
HIGHscripts/inspect_upload_dom.py109 matches.push({CODE
HIGHsrc/notebooklm_tools/core/sharing.py105 # Payload: [[[notebook_id, null, [access_level], [notify, ""]]], 1, null, [2]]COMMENT
HIGHsrc/notebooklm_tools/core/sharing.py142 # Payload: [[[notebook_id, [[email, null, role_code]], null, [notify_flag, message]]], 1, null, [2]]COMMENT
HIGHsrc/notebooklm_tools/core/labels.py16 Raw format: [null, [[name, [[src_id], ...], label_id, emoji], ...]]STRING
HIGHsrc/notebooklm_tools/core/studio.py728 # Options at position 14: [[focus_prompt, language, null, orientation, detail_level, visual_style]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py729 # Captured RPC structure: [[null, "en", null, 1, 2, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py922 # Options at position 7: [null, [title, desc, null, sources, lang, prompt, null, True]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py994 # Options at position 9: [null, [1, null, focus_prompt, null*3, [difficulty, card_count]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1071 # Quiz options at position 9: [null, [2, null, focus_prompt, null*4, [question_count, difficulty]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1148 # Data Table options at position 18: [null, [description, language]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1250 # Response is nested: [[json_string, null, [gen_ids]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1251 # So result[0] is [json_string, null, [gen_ids]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1309 # Response is nested: [[mind_map_id, json, metadata, null, title]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1337 # Tombstone format: [uuid, null, 2]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1349 # Details: [id, json, metadata, null, title]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py999 None, # Reserved (must be null)CODE
HIGHsrc/notebooklm_tools/core/studio.py1076 None, # Reserved (must be null)CODE
HIGHsrc/notebooklm_tools/core/research.py106 # Poll params: [null, null, "notebook_id"]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py97 # Each turn adds: [answer, null, 2] then [query, null, 1]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py419 # For follow-ups: params[2] = [[answer, null, 2], [query, null, 1], ...]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py523 # Each source: [[source_id], title, metadata, [null, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py767 # Wrapper containing segments (and possibly metadata like [null, 1])COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py878 # Table segments have segment[2] as null, data in segment[4]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py73 Chrome expects history in format: [[answer, null, 2], [query, null, 1], ...]STRING
HIGHsrc/notebooklm_tools/core/conversation.py617 [["wrb.fr", null, null, null, null, [3]]]STRING
HIGHsrc/notebooklm_tools/core/conversation.py618 [["wrb.fr", null, null, null, null, [8, null, [["type.googleapis.com/...Error", [...]]]]]]STRING
HIGHsrc/notebooklm_tools/core/conversation.py668 [["wrb.fr", null, "<nested_json>", ...]]STRING
HIGHsrc/notebooklm_tools/core/conversation.py671 [["answer_text", null, [conv_id, hash, timestamp], null, [fmt_segments, null, null, source_passages, type_code]]STRING
HIGHsrc/notebooklm_tools/core/conversation.py901 Each passage entry: [["passage_id"], [null, null, confidence, ..., text_passages, [[["SOURCE_ID"], ...]], ...]]STRING
HIGHsrc/notebooklm_tools/core/sources.py204 # Sync params: [null, ["source_id"], [2]]COMMENT
HIGHsrc/notebooklm_tools/core/sources.py312 # Source structure: [[id], title, [metadata...], [null, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/sources.py481 [[[null, "<url>", 627], [null*9, [null, null, 1]], 1]]STRING
HIGHsrc/notebooklm_tools/core/errors.py114 [error_code, null, [[detail_type_url, [sub_codes...]]]]STRING
HIGHsrc/notebooklm_tools/core/notebooks.py39 # [null, 1, null, [2]] - params for list notebooksCOMMENT
HIGHsrc/notebooklm_tools/core/notebooks.py227 # Response format: [title, null, id, emoji, null, metadata, null, [[goal_code, prompt?], [length_code]]]COMMENT
HIGHsrc/notebooklm_tools/core/base.py669 where error_list = [error_code, null, [[detail_type_url, [sub_codes...]]]]STRING
HIGHsrc/notebooklm_tools/services/studio.py604 returned every field null, leaving agents to poll forever).STRING
Excessive Try-Catch Wrapping224 hits · 209 pts
SeverityFileLineSnippetContext
LOWtests/test_file_upload.py406 except Exception:CODE
LOWtests/core/test_thread_safety.py106 except Exception as e:CODE
LOWtests/core/test_thread_safety.py113 except Exception as e:CODE
MEDIUMtests/core/test_thread_safety.py102def writer():CODE
MEDIUMtests/core/test_thread_safety.py109def clearer():CODE
LOWdocs/MULTI_USER_ANALYSIS.md368 except Exception as e:CODE
LOWscripts/test_label_rpcs.py140 except Exception as e:CODE
LOWscripts/test_label_rpcs.py163 except Exception as e:CODE
LOWscripts/test_label_rpcs.py174 except Exception as e:CODE
LOWscripts/test_label_rpcs.py188 except Exception as e:CODE
LOWscripts/test_label_rpcs.py200 except Exception as e:CODE
LOWscripts/test_label_rpcs.py210 except Exception as e:CODE
LOWscripts/inject_cookies_and_inspect.py82 except Exception as e:CODE
LOWscripts/inspect_upload_dom.py53 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py108 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py192 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py444 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py506 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth.py730 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py797 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth.py837 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/alias.py50 except Exception:CODE
LOWsrc/notebooklm_tools/core/studio.py50 except Exception:CODE
LOWsrc/notebooklm_tools/core/studio.py594 except Exception:CODE
LOWsrc/notebooklm_tools/core/studio.py658 except Exception:CODE
LOWsrc/notebooklm_tools/core/research.py376 except Exception:CODE
LOWsrc/notebooklm_tools/core/research.py400 except Exception:CODE
LOWsrc/notebooklm_tools/core/conversation.py219 except Exception:CODE
LOWsrc/notebooklm_tools/core/conversation.py279 except Exception:CODE
LOWsrc/notebooklm_tools/core/download.py243 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/sources.py118 except Exception:CODE
LOWsrc/notebooklm_tools/core/utils.py90 except Exception:CODE
LOWsrc/notebooklm_tools/core/utils.py101 except Exception:CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py61 except Exception:CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py151 except Exception:CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py179 except Exception:CODE
MEDIUMsrc/notebooklm_tools/core/cdp_transport.py58def _default_profile_name() -> str:CODE
LOWsrc/notebooklm_tools/core/base.py1194 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/base.py1231 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/config.py448 except Exception:CODE
LOWsrc/notebooklm_tools/utils/wsl.py160 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py216 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py222 except Exception:CODE
LOWsrc/notebooklm_tools/utils/wsl.py259 except Exception:CODE
LOWsrc/notebooklm_tools/utils/wsl.py311 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py345 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py378 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py386 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py456 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py520 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py552 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py582 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py594 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py611 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/wsl.py630 except Exception as e:CODE
LOWsrc/notebooklm_tools/utils/cdp.py951 except Exception:CODE
LOWsrc/notebooklm_tools/utils/cdp.py960 except Exception:CODE
LOWsrc/notebooklm_tools/utils/cdp.py965 except Exception:CODE
LOWsrc/notebooklm_tools/utils/cdp.py1513 except Exception:CODE
LOWsrc/notebooklm_tools/utils/cdp.py1519 except Exception:CODE
164 more matches not shown…
Structural Annotation Overuse80 hits · 122 pts
SeverityFileLineSnippetContext
LOWREADME.md186### Step 1: Check What You Have InstalledCOMMENT
LOWREADME.md198### Step 2: Uninstall Legacy PackagesCOMMENT
LOWREADME.md208### Step 3: Reinstall the Unified PackageCOMMENT
LOWREADME.md218### Step 4: Verify InstallationCOMMENT
LOWREADME.md231### Step 5: Re-authenticateCOMMENT
LOWdocs/API_REFERENCE.md1768# Step 1: reassign orphaned sources to a different labelCOMMENT
LOWdocs/API_REFERENCE.md1771# Step 2: delete the labelCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md569### Step 1: Authenticate Gemini Notebook AccountCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md576### Step 2: Start MCP ServerCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md588### Step 3: Add Open WebUI FunctionCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md595### Step 4: Test User IsolationCOMMENT
LOWsrc/notebooklm_tools/core/sources.py989 # Step 1: Register source intent → get SOURCE_IDCOMMENT
LOWsrc/notebooklm_tools/core/sources.py992 # Step 2: Start resumable upload → get upload URLCOMMENT
LOWsrc/notebooklm_tools/core/sources.py995 # Step 3: Stream upload file contentCOMMENT
LOWsrc/notebooklm_tools/cli/main.py488 # IMPORTANT: Don't use get_chrome_profile_dir() here as it creates the directory,COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md45# Step 1: Authenticate (opens Chrome)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md48# Step 2: Verify authenticationCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md52# Step 3: Create a notebookCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md56# Step 4: Set alias for convenienceCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md59# Step 5: VerifyCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md102# Step 1: Create dedicated notebookCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md106# Step 2: Set aliasCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md109# Step 3: Start deep research (takes ~5 minutes)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md113# Step 4: Monitor progress (polls until complete or timeout)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md116# Step 5: View discovered sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md119# Step 6: Import all discovered sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md124# Step 7: Generate podcastCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md127# Step 8: Check generation status (podcast takes 2-5 minutes)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md131# Step 9: Get podcast URL from studio status outputCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md146# Step 1: Verify sources existCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md149# Step 2: Generate study guide reportCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md153# Step 3: Generate quiz (10 questions, medium difficulty)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md157# Step 4: Generate flashcardsCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md161# Step 5: Generate mind map for visual overviewCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md164# Step 6: Check all generated artifactsCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md198# Step 1: Check current freshness statusCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md202# Step 2: Quick check (skip freshness API calls)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md205# Step 3: Find stale sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md209# Step 4: Sync all stale sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md212# Step 5: Sync specific sources onlyCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md215# Step 6: Verify all freshCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md227# Step 1: Login to work accountCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md230# Step 2: Login to personal accountCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md233# Step 3: List all profilesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md236# Step 4: Switch default profileCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md239# Step 5: Use specific profile for commandsCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md243# Step 6: Create notebook in specific accountCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md254# Step 1: List sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md257# Step 2: Get AI summary of a sourceCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md260# Step 3: Get raw text contentCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md263# Step 4: Export to fileCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md266# Step 5: Export multiple sources (script pattern)COMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md280# Step 1: Create focused notebookCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md284# Step 2: Add relevant sourcesCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md289# Step 3: Generate slide deckCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md293# Step 4: Generate briefing docCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md297# Step 5: Generate infographic for visual summaryCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md300# Step 6: Check outputsCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md311# Step 1: Check current sharing statusCOMMENT
LOWsrc/notebooklm_tools/data/references/workflows.md314# Step 2: Enable public link sharingCOMMENT
20 more matches not shown…
Deep Nesting98 hits · 78 pts
SeverityFileLineSnippetContext
LOWtests/core/test_notebooks.py39CODE
LOWtests/core/test_notebooks.py94CODE
LOWtests/core/test_sources.py44CODE
LOWtests/core/test_sources.py67CODE
LOWsrc/notebooklm_tools/core/exports.py111CODE
LOWsrc/notebooklm_tools/core/sharing.py23CODE
LOWsrc/notebooklm_tools/core/alias.py110CODE
LOWsrc/notebooklm_tools/core/studio.py356CODE
LOWsrc/notebooklm_tools/core/studio.py605CODE
LOWsrc/notebooklm_tools/core/studio.py1325CODE
LOWsrc/notebooklm_tools/core/research.py89CODE
LOWsrc/notebooklm_tools/core/research.py275CODE
LOWsrc/notebooklm_tools/core/conversation.py200CODE
LOWsrc/notebooklm_tools/core/conversation.py240CODE
LOWsrc/notebooklm_tools/core/conversation.py508CODE
LOWsrc/notebooklm_tools/core/conversation.py613CODE
LOWsrc/notebooklm_tools/core/conversation.py662CODE
LOWsrc/notebooklm_tools/core/conversation.py740CODE
LOWsrc/notebooklm_tools/core/conversation.py803CODE
LOWsrc/notebooklm_tools/core/conversation.py897CODE
LOWsrc/notebooklm_tools/core/download.py105CODE
LOWsrc/notebooklm_tools/core/download.py267CODE
LOWsrc/notebooklm_tools/core/download.py371CODE
LOWsrc/notebooklm_tools/core/download.py812CODE
LOWsrc/notebooklm_tools/core/notes.py18CODE
LOWsrc/notebooklm_tools/core/notes.py73CODE
LOWsrc/notebooklm_tools/core/sources.py82CODE
LOWsrc/notebooklm_tools/core/sources.py123CODE
LOWsrc/notebooklm_tools/core/sources.py202CODE
LOWsrc/notebooklm_tools/core/sources.py297CODE
LOWsrc/notebooklm_tools/core/sources.py367CODE
LOWsrc/notebooklm_tools/core/sources.py509CODE
LOWsrc/notebooklm_tools/core/sources.py616CODE
LOWsrc/notebooklm_tools/core/sources.py629CODE
LOWsrc/notebooklm_tools/core/sources.py1010CODE
LOWsrc/notebooklm_tools/core/sources.py1032CODE
LOWsrc/notebooklm_tools/core/utils.py64CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py92CODE
LOWsrc/notebooklm_tools/core/notebooks.py37CODE
LOWsrc/notebooklm_tools/core/notebooks.py138CODE
LOWsrc/notebooklm_tools/core/base.py488CODE
LOWsrc/notebooklm_tools/core/base.py617CODE
LOWsrc/notebooklm_tools/core/base.py664CODE
LOWsrc/notebooklm_tools/core/base.py745CODE
LOWsrc/notebooklm_tools/utils/wsl.py166CODE
LOWsrc/notebooklm_tools/utils/cdp.py401CODE
LOWsrc/notebooklm_tools/utils/cdp.py511CODE
LOWsrc/notebooklm_tools/utils/cdp.py1097CODE
LOWsrc/notebooklm_tools/utils/cdp.py1289CODE
LOWsrc/notebooklm_tools/utils/cdp.py1523CODE
LOWsrc/notebooklm_tools/utils/cdp.py1700CODE
LOWsrc/notebooklm_tools/utils/browser.py16CODE
LOWsrc/notebooklm_tools/mcp/server.py115CODE
LOWsrc/notebooklm_tools/mcp/tools/auth.py94CODE
LOWsrc/notebooklm_tools/mcp/tools/labels.py9CODE
LOWsrc/notebooklm_tools/mcp/tools/smart_select.py9CODE
LOWsrc/notebooklm_tools/mcp/tools/server.py12CODE
LOWsrc/notebooklm_tools/mcp/tools/studio.py65CODE
LOWsrc/notebooklm_tools/mcp/tools/batch.py9CODE
LOWsrc/notebooklm_tools/mcp/tools/notes.py9CODE
38 more matches not shown…
Unused Imports89 hits · 74 pts
SeverityFileLineSnippetContext
LOWtests/test_tool_groups.py95CODE
LOWtests/test_cdp_port_map.py3CODE
LOWtests/core/test_auth_check.py15CODE
LOWtests/core/test_cookie_rotation.py1CODE
LOWtests/services/test_auth_replay_diagnostic.py1CODE
LOWtests/services/test_auth_health.py20CODE
LOWsrc/notebooklm_tools/__init__.py3CODE
LOWsrc/notebooklm_tools/__init__.py7CODE
LOWsrc/notebooklm_tools/core/cookie_rotation.py8CODE
LOWsrc/notebooklm_tools/core/__init__.py3CODE
LOWsrc/notebooklm_tools/core/__init__.py4CODE
LOWsrc/notebooklm_tools/core/__init__.py4CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py9CODE
LOWsrc/notebooklm_tools/utils/io_encoding.py10CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/server.py81CODE
LOWsrc/notebooklm_tools/mcp/tool_groups.py23CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py4CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py4CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py5CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py6CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py6CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py6CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py6CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py12CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py12CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py12CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py13CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py14CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py14CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py15CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py18CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py19CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py27CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py28CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py29CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py29CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py29CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py34CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py35CODE
29 more matches not shown…
Self-Referential Comments16 hits · 61 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_mcp_file_upload.py22 # Create a test fileCOMMENT
MEDIUMtests/test_file_upload.py25 # Create a mock client with minimal setupCOMMENT
MEDIUMtests/test_file_upload.py78 # Create a JSON file (unsupported type)COMMENT
MEDIUMtests/test_file_upload.py212 # Create a temporary test fileCOMMENT
MEDIUMtests/test_file_upload.py252 # Create a test fileCOMMENT
MEDIUMtests/test_e2e.py128 # Create a dummy fileCOMMENT
MEDIUMtests/services/test_pipeline.py141 # Create a simple user pipelineCOMMENT
MEDIUMsrc/notebooklm_tools/core/client.py74 # The following methods are provided by ConversationMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py87 # The following methods are provided by NotebookMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py99 # The following methods are provided by SharingMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py107 # The following methods are provided by SourceMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py122 # The following methods are provided by ResearchMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py131 # The following methods are provided by StudioMixin:COMMENT
MEDIUMsrc/notebooklm_tools/core/client.py142 # The following methods are provided by NotesMixin:COMMENT
MEDIUMsrc/notebooklm_tools/utils/wsl.py236 # Create a temp profile directory on the WINDOWS filesystem.COMMENT
MEDIUMsrc/notebooklm_tools/utils/wsl.py248 # Create a unique subdir nameCOMMENT
Synthetic Comment Markers9 hits · 52 pts
SeverityFileLineSnippetContext
HIGHdocs/API_REFERENCE.md63# Get AI-generated summary of what a notebook is aboutCOMMENT
HIGHdocs/API_REFERENCE.md68# Get AI-generated summary of a specific sourceCOMMENT
HIGHdocs/API_REFERENCE.md589 "description", # AI-generated descriptionCODE
HIGHdocs/API_REFERENCE.md594 "summary" # AI-generated summary of sourcesCODE
HIGHdocs/API_REFERENCE.md1015 "The provided documents explore...", # AI-generated summary (markdown formatted)CODE
HIGHdocs/API_REFERENCE.md1051 # AI-generated summary with **bold** markdown for keywordsCOMMENT
HIGHdocs/API_REFERENCE.md1101| **Card Count** | Default count generated by AI |CODE
HIGHdocs/API_REFERENCE.md1226 "Generated Title" # AI-generated titleCODE
HIGHsrc/notebooklm_tools/data/SKILL.md186nlm notebook describe <id> # AI-generated summary + suggested topicsCODE
Redundant / Tautological Comments25 hits · 38 pts
SeverityFileLineSnippetContext
LOWtests/test_mcp_file_upload.py15 # Check if source_add exists and supports file typeCOMMENT
LOWsrc/notebooklm_tools/core/studio.py478 # Check if it looks like a timestamp [seconds, nanos]COMMENT
LOWsrc/notebooklm_tools/core/research.py239 # Check if this is deep research format (src[0] is None, src[1] is title)COMMENT
LOWsrc/notebooklm_tools/core/conversation.py405 # Check if we have cached history for this conversationCOMMENT
LOWsrc/notebooklm_tools/core/sources.py414 # Check if v1 actually accepted it (accepted-pending)COMMENT
LOWsrc/notebooklm_tools/core/notebooks.py80 # Check if shared (for owned notebooks)COMMENT
LOWsrc/notebooklm_tools/core/base.py1111 # Check if redirected to login (cookies expired)COMMENT
LOWsrc/notebooklm_tools/core/base.py193 RPC_CHECK_FRESHNESS = "yR9Yof" # Check if Drive source is staleCODE
LOWsrc/notebooklm_tools/utils/config.py394 # Check if new location already has dataCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py184 # Check if Chrome is already running - this is a HARD REQUIREMENTCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py439 # Check if rule existsCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py506 # Check if it's a permission issueCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py499 # Check if it's a symlink pointing to a snap path. Normalize the resolvedCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py1327 # Check if process is alive but CDP is unresponsiveCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py1375 # Check if Chrome is running with debuggingCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py1723 # Check if profile exists with saved loginCOMMENT
LOWsrc/notebooklm_tools/cli/utils.py151 # Check if cache is still valid (24 hours = 86400 seconds)COMMENT
LOWsrc/notebooklm_tools/cli/main.py694 # Check if old profile existsCOMMENT
LOWsrc/notebooklm_tools/cli/main.py700 # Check if new profile name already existsCOMMENT
LOWsrc/notebooklm_tools/cli/main.py487 # Check if we need to migrate from legacy packagesCOMMENT
LOWsrc/notebooklm_tools/cli/main.py739 # Check if profile existsCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py193 # Check if export directory existsCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py347 # Check if already installedCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py542 # Check if already installedSTRING
LOWsrc/notebooklm_tools/cli/commands/setup.py1067 # Display results tableCOMMENT
AI Structural Patterns27 hits · 21 pts
SeverityFileLineSnippetContext
LOWsrc/notebooklm_tools/mcp/tools/studio.py65CODE
LOWsrc/notebooklm_tools/mcp/tools/batch.py9CODE
LOWsrc/notebooklm_tools/mcp/tools/sources.py16CODE
LOWsrc/notebooklm_tools/cli/main.py194CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py144CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py250CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py306CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py352CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py498CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py607CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py654CODE
LOWsrc/notebooklm_tools/cli/commands/research.py21CODE
LOWsrc/notebooklm_tools/cli/commands/download.py234CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py113CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py147CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py186CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py219CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py257CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py287CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py406CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py628CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py861CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py964CODE
LOWsrc/notebooklm_tools/cli/commands/source.py21CODE
LOWsrc/notebooklm_tools/cli/commands/source.py60CODE
LOWsrc/notebooklm_tools/services/studio.py262CODE
LOWsrc/notebooklm_tools/services/sources.py134CODE
Modern Structural Boilerplate20 hits · 18 pts
SeverityFileLineSnippetContext
LOWsrc/notebooklm_tools/__init__.py11__all__ = ["NotebookLMClient", "__version__"]CODE
LOWsrc/notebooklm_tools/core/auth.py21logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/alias.py62 def set_alias(self, name: str, value: str, alias_type: str = "unknown") -> None:CODE
LOWsrc/notebooklm_tools/core/cookie_rotation.py20logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/__init__.py6__all__ = ["load_cached_tokens", "save_tokens_to_cache", "constants"]CODE
LOWsrc/notebooklm_tools/core/notebooks.py21logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/base.py1163 def _update_cached_tokens(self) -> None:CODE
LOWsrc/notebooklm_tools/utils/wsl.py32logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/utils/cdp.py80__all__ = [CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py58__all__ = [CODE
LOWsrc/notebooklm_tools/mcp/tools/_utils.py72def set_query_timeout(timeout: float) -> None:CODE
LOWsrc/notebooklm_tools/cli/commands/setup.py1050def _setup_all() -> None:CODE
LOWsrc/notebooklm_tools/cli/commands/setup.py1186def _setup_json() -> None:CODE
LOWsrc/notebooklm_tools/services/auth.py37logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/auth.py39__all__ = [CODE
LOWsrc/notebooklm_tools/services/studio.py27logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/__init__.py15__all__ = [CODE
LOWsrc/notebooklm_tools/services/chat.py15logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/chats.py22logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/_compat.py10__all__ = ["TypedDict"]CODE
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHsrc/notebooklm_tools/core/sharing.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
HIGHsrc/notebooklm_tools/core/sources.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
HIGHsrc/notebooklm_tools/core/notebooks.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
Fake / Example Data8 hits · 10 pts
SeverityFileLineSnippetContext
LOWtests/test_auth_browser.py65 auth.save_profile(cookies={"SID": "sid", "HSID": "hsid"}, email="user@example.com")CODE
LOWtests/test_cdp_port_map.py160 profile_dir = tmp_path / "John Doe" / "nlm-profile"CODE
LOWtests/cli/test_login.py15 return SimpleNamespace(name=self.profile_name, email="user@example.com")CODE
LOWtests/cli/test_login.py26 return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3CODE
LOWtests/cli/test_login.py53 return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3CODE
LOWtests/cli/test_login.py66 "email": "user@example.com",CODE
LOWtests/cli/test_login.py85 "email": "user@example.com",CODE
LOWtests/cli/test_login.py102 email="user@example.com",CODE
Modern AI Meta-Vocabulary2 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMsrc/notebooklm_tools/core/auth.py865# orchestration, caching, verdict aggregation) and belong in the servicesCOMMENT
MEDIUMsrc/notebooklm_tools/services/auth.py281 # Probe orchestrationCOMMENT
Verbosity Indicators3 hits · 7 pts
SeverityFileLineSnippetContext
LOWsrc/notebooklm_tools/core/sources.py989 # Step 1: Register source intent → get SOURCE_IDCOMMENT
LOWsrc/notebooklm_tools/core/sources.py992 # Step 2: Start resumable upload → get upload URLCOMMENT
LOWsrc/notebooklm_tools/core/sources.py995 # Step 3: Stream upload file contentCOMMENT
Over-Commented Block8 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/test_api_client.py21 def test_rpc_error_16_detection(self, mock_client):COMMENT
LOWsrc/notebooklm_tools/core/auth.py261COMMENT
LOWsrc/notebooklm_tools/core/auth.py861COMMENT
LOWsrc/notebooklm_tools/core/client.py61 - Studio content (audio, video, reports, flashcards, etc.)COMMENT
LOWsrc/notebooklm_tools/core/client.py81 # - _extract_answer_from_chunkCOMMENT
LOWsrc/notebooklm_tools/core/client.py101 # - set_public_accessCOMMENT
LOWsrc/notebooklm_tools/core/client.py121 # =========================================================================COMMENT
LOWsrc/notebooklm_tools/core/base.py421 self._cdp_launched_port: int | None = NoneCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/notebooklm_tools/cli/ai_docs.py290# their chat history natively into the NotebookLM web UI, enabling seamless cross-device sessions.COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/notebooklm_tools/core/auth.py272# Usage:COMMENT