Programmatic access to Gemini Notebook - via command-line interface (CLI), Model Context Protocol (MCP) server, and AI agent skills.
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).
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.
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.
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.
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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_api_client.py | 114 | def test_refresh_auth_tokens_success(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 137 | def test_refresh_auth_tokens_redirect_login(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 154 | def test_get_notebook_sources_extracts_url(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 198 | def test_add_drive_source_uses_extended_timeout(self, mock_client): | CODE |
| LOW | tests/test_api_client.py | 223 | def test_add_drive_source_timeout_returns_status(self, mock_client): | CODE |
| LOW | tests/test_wsl.py | 13 | def test_get_windows_host_ip_uses_loopback_in_mirrored_mode(monkeypatch): | CODE |
| LOW | tests/test_wsl.py | 28 | def test_get_windows_host_ip_uses_gateway_in_nat_mode(monkeypatch): | CODE |
| LOW | tests/test_wsl.py | 51 | def test_get_windows_host_ip_uses_gateway_when_wslinfo_is_unavailable(monkeypatch): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 12 | def test_empty_string_returns_none(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 16 | def test_actual_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 22 | def test_comma_separated_string(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 25 | def test_comma_separated_with_spaces(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 35 | def test_int_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 41 | def test_list_of_strings_cast_to_int(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 44 | def test_empty_list_returns_empty(self): | CODE |
| LOW⚡ | tests/test_coerce_list.py | 47 | def test_malformed_json_falls_back_to_comma(self): | CODE |
| LOW | tests/test_research_polling.py | 17 | def test_poll_research_filtering(self, mock_client): | CODE |
| LOW | tests/test_mcp_studio.py | 22 | def test_studio_status_is_lean_and_bounded_by_default(): | CODE |
| LOW | tests/test_mcp_studio.py | 54 | def test_studio_status_can_request_one_detailed_artifact(): | CODE |
| LOW | tests/test_mcp_studio.py | 85 | def test_studio_create_preserves_rate_limit_hint(): | CODE |
| LOW | tests/test_mcp_studio.py | 114 | def test_studio_revise_preserves_hint_on_service_error(): | CODE |
| LOW | tests/test_mcp_e2e.py | 76 | def test_notebook_create_rename_delete(self, mcp_tools): | CODE |
| LOW | tests/test_mcp_e2e.py | 132 | def test_source_add_invalid_type(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 172 | def test_studio_create_without_confirm(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 183 | def test_studio_create_invalid_type(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 195 | def test_studio_create_flashcards(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 224 | def test_notebook_share_status(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 231 | def test_notebook_share_public_toggle(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 249 | def test_download_artifact_invalid_type(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 257 | def test_download_artifact_no_artifact(self, mcp_tools, test_notebook): | CODE |
| LOW | tests/test_mcp_e2e.py | 269 | def test_all_tools_registered(self): | CODE |
| LOW⚡ | tests/test_mcp_file_upload.py | 11 | def test_source_add_file_exists(self): | CODE |
| LOW⚡ | tests/test_mcp_file_upload.py | 18 | def test_source_add_file_calls_client(self): | CODE |
| LOW | tests/test_mcp_file_upload.py | 51 | def test_source_add_file_requires_path(self): | CODE |
| LOW | tests/test_mcp_file_upload.py | 65 | def test_source_add_file_returns_server_path_and_reason(self, tmp_path): | CODE |
| LOW | tests/test_io_encoding_windows.py | 7 | def test_configure_stdio_noop_on_non_windows(monkeypatch): | CODE |
| LOW | tests/test_io_encoding_windows.py | 17 | def test_configure_stdio_calls_reconfigure_on_windows(monkeypatch): | CODE |
| LOW | tests/test_mcp_server_capabilities.py | 8 | def test_runtime_capabilities_report_complete_and_partial_groups(): | CODE |
| LOW | tests/test_mcp_server_capabilities.py | 40 | def test_empty_group_is_not_reported_as_available(): | CODE |
| LOW | tests/test_mcp_server_capabilities.py | 53 | def test_group_with_only_one_registered_tool_is_partial_not_available(): | CODE |
| LOW | tests/test_mcp_server_capabilities.py | 63 | def test_server_info_marks_provider_capabilities_unprobed(): | CODE |
| LOW | tests/test_profile_cache_isolation.py | 18 | def test_named_profile_refresh_updates_only_that_profile(): | CODE |
| LOW | tests/test_profile_cache_isolation.py | 51 | def test_named_profile_recovery_reloads_same_profile(): | CODE |
| LOW | tests/test_profile_cache_isolation.py | 68 | def test_named_profile_load_never_falls_back_to_legacy_default(): | CODE |
| LOW | tests/test_auth_browser.py | 7 | def test_select_auth_backend_ignores_firefox_preference_and_uses_chromium(): | CODE |
| LOW | tests/test_auth_browser.py | 19 | def test_select_auth_backend_auto_prefers_chromium_when_available(): | CODE |
| LOW | tests/test_auth_browser.py | 31 | def test_select_auth_backend_returns_none_when_no_chromium_browser_available(): | CODE |
| LOW | tests/test_auth_browser.py | 40 | def test_supported_auth_browsers_excludes_firefox(): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 52 | def test_get_chromium_path_ignores_explicit_firefox_preference(): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 58 | def test_saved_legacy_browser_backend_is_read_from_metadata(tmp_path, monkeypatch): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 74 | def test_flatten_cookies_prefers_google_com_over_other_domains(): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 93 | def test_flatten_cookies_passthrough_dict_and_skips_malformed(): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 100 | def test_flatten_cookies_empty_list_and_empty_value(): | CODE |
| LOW⚡ | tests/test_auth_browser.py | 107 | def test_validate_cookies_accepts_chrome_list(): | CODE |
| LOW | tests/test_auth_browser.py | 119 | def test_validate_notebooklm_cookies_accepts_chrome_list(): | CODE |
| LOW | tests/test_auth_browser.py | 131 | def test_auth_tokens_cookie_header_flattens_list(): | CODE |
| LOW | tests/test_auth_browser.py | 144 | def test_get_headers_flattens_list_cookies(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_profile_aware_headless_auth.py | 6 | def test_mcp_refresh_auth_uses_configured_default_profile(monkeypatch): | CODE |
| LOW | tests/test_profile_aware_headless_auth.py | 43 | def test_core_recovery_uses_configured_default_profile(monkeypatch): | CODE |
| LOW | tests/test_snap.py | 10 | def test_is_snap_browser_direct_path(): | CODE |
| 1010 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_auth_migration.py | 145 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 147 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 161 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 163 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 289 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 291 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 339 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 341 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 397 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 399 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 429 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | tests/test_auth_migration.py | 431 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 51 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 53 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 180 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 182 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 243 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_url_source_fallback.py | 245 | # =========================================================================== | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_source_reconciliation.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_source_reconciliation.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 117 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 173 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 175 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 207 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/core/test_source_reconciliation.py | 209 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 98 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 456 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 458 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 544 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 546 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 559 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/services/test_auth_health.py | 561 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/services/test_auth_health.py | 316 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 17 | # ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 39 | # ─── Test client ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/test_label_rpcs.py | 108 | # ─── Main ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/auth.py | 265 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/auth.py | 267 | # ============================================================================ | COMMENT |
| MEDIUM | src/notebooklm_tools/core/auth.py | 313 | # ============================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/auth.py | 315 | # ============================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/auth.py | 625 | # ============================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/auth.py | 627 | # ============================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/studio.py | 31 | # ========================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/studio.py | 33 | # ========================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/studio.py | 204 | # ========================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/studio.py | 206 | # ========================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/research.py | 24 | # ========================================================================= | COMMENT |
| MEDIUM | src/notebooklm_tools/core/research.py | 26 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/conversation.py | 64 | # ========================================================================= | COMMENT |
| 145 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/test_file_upload.py | 13 | from notebooklm_tools.core.exceptions import FileUploadError, FileValidationError | CODE |
| CRITICAL | tests/test_cdp_url_check.py | 125 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_cookie_parsing.py | 9 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 487 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 509 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 532 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 555 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 573 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 592 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_auth_migration.py | 613 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/core/test_auth_check.py | 88 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL⚡ | tests/core/test_auth_guard.py | 3 | from notebooklm_tools.core.exceptions import AccountMismatchError, NLMError | CODE |
| CRITICAL | tests/core/test_alias.py | 7 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | tests/core/test_sources.py | 171 | from notebooklm_tools.core.exceptions import SourceProcessingError | CODE |
| CRITICAL | tests/services/test_sources.py | 316 | from notebooklm_tools.core.exceptions import SourceProcessingError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 468 | from notebooklm_tools.core.exceptions import AccountMismatchError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 598 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/core/auth.py | 812 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/core/alias.py | 117 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/utils/cdp.py | 77 | from notebooklm_tools.core.exceptions import AuthenticationError # noqa: E402 | CODE |
| CRITICAL | src/notebooklm_tools/utils/browser.py | 8 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/utils/auth_browser.py | 6 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/cli/utils.py | 83 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL⚡ | src/notebooklm_tools/cli/main.py | 691 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 101 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| CRITICAL | src/notebooklm_tools/cli/main.py | 258 | from notebooklm_tools.core.exceptions import AccountMismatchError, NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/studio.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/research.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/repl.py | 11 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/export.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/chat.py | 7 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/share.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/label.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/chats.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/notebook.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/source.py | 8 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/cli/commands/note.py | 9 | from notebooklm_tools.core.exceptions import NLMError | CODE |
| CRITICAL | src/notebooklm_tools/services/chats.py | 14 | from notebooklm_tools.core.exceptions import AuthenticationError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/notebooklm_tools/core/exports.py | 32 | Export an artifact to Google Docs or Sheets. Args: notebook_id: The notebook UUID artif | STRING |
| HIGH | src/notebooklm_tools/core/sharing.py | 164 | Add multiple collaborators to a notebook in a single API call. Args: notebook_id: The notebook UUID | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 1200 | Generate a Mind Map JSON from sources. This is step 1 of 2 for creating a mind map. After generation, u | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 112 | Download content from a URL to a local file with streaming support. Features: - Streams file in chunks | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 815 | Parse rich-text data table into headers and rows. Features: - Validates structure at each navigation st | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1039 | Fetch artifact HTML content for quiz/flashcard types. Args: notebook_id: The notebook ID. | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1096 | Extract JSON app data from interactive HTML. Quiz and flashcard HTML contains embedded JSON in a data-app-data | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1277 | Shared implementation for downloading quiz/flashcard artifacts. Args: notebook_id: The notebook ID. | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1377 | Download quiz artifact. Args: notebook_id: The notebook ID. output_path: Path to save t | STRING |
| HIGH | src/notebooklm_tools/core/download.py | 1409 | Download flashcard deck artifact. Args: notebook_id: The notebook ID. output_path: Path | STRING |
| HIGH | src/notebooklm_tools/core/constants.py | 32 | Get integer code for a string name. Args: name: The string name (case-insensitive). | STRING |
| HIGH | src/notebooklm_tools/core/retry.py | 98 | Execute a callable with retry logic for transient server errors. Use this for one-off retry wrapping where a decora | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 132 | Wait for a source to finish processing. Polls the source status until it becomes READY or times out. N | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 790 | Register a file source intent and get SOURCE_ID. Step 1 of the resumable upload protocol. Args: | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 837 | Start a resumable upload session and get the upload URL. Step 2 of the resumable upload protocol. Args | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 940 | Add a local file as a source using resumable upload. Uses Google's resumable upload protocol: 1. Regist | STRING |
| HIGH | src/notebooklm_tools/utils/wsl.py | 169 | Launch Chrome on Windows side from WSL. Args: port: Remote debugging port to use. debug: If True, c | STRING |
| HIGH | src/notebooklm_tools/utils/cdp.py | 275 | Find an available port for Chrome debugging. Args: starting_from: Port to start scanning from max_a | STRING |
| HIGH | src/notebooklm_tools/utils/cdp.py | 1344 | Extract cookies and tokens from Chrome via CDP. This is the main entry point for CDP-based authentication. Arg | STRING |
| HIGH | src/notebooklm_tools/utils/browser.py | 17 | Parse cookies from a file. The file can contain: - Raw cookie header string (Cookie: name=value; name2=val | STRING |
| HIGH | src/notebooklm_tools/cli/main.py | 155 | Validate saved credentials using the lightweight authoritative check. Validity is decided by ``check_validity`` (a | STRING |
| HIGH | src/notebooklm_tools/services/exports.py | 30 | Export a NotebookLM artifact to Google Docs or Sheets. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 74 | Get sharing status and collaborators for a notebook. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 106 | Enable or disable public link access. Args: client: Authenticated NotebookLM client notebook_id: No | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 145 | Invite a collaborator by email. Args: client: Authenticated NotebookLM client notebook_id: Notebook | STRING |
| HIGH | src/notebooklm_tools/services/sharing.py | 191 | Invite multiple collaborators in a single API call. Args: client: Authenticated NotebookLM client n | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 56 | Auto-label all sources using AI-generated thematic categories. Requires 5+ sources. If labels already exist, return | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 89 | Force AI re-categorization of sources into new labels. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 118 | Create a new empty label manually. Args: client: Authenticated NotebookLM client notebook_id: Noteb | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 157 | Rename an existing label. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 196 | Set or clear the emoji marker on a label. Args: client: Authenticated NotebookLM client notebook_id | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 234 | Assign a source to a label. Sources support multi-label assignment — this adds the source to the target label w | STRING |
| HIGH | src/notebooklm_tools/services/labels.py | 275 | Delete one or more labels. Sources are NOT deleted. Args: client: Authenticated NotebookLM client n | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 65 | Add tags to a notebook. Args: notebook_id: Notebook UUID tags: List of tags to add notebook | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 118 | Remove tags from a notebook. Args: notebook_id: Notebook UUID tags: List of tags to remove Ret | STRING |
| HIGH | src/notebooklm_tools/services/smart_select.py | 171 | Select notebooks relevant to a query based on tags. Uses simple keyword matching: splits query into words and match | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 153 | Resolve a human-readable name to an integer code via constants.CodeMapper. Args: mapper: The CodeMapper ins | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 861 | Revise a slide deck with per-slide instructions. Creates a NEW artifact — the original is not modified. Args: | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 204 | Start a research task to find new sources. Args: client: Authenticated NotebookLM client notebook_i | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 291 | Poll research progress, optionally blocking until complete or timeout. Args: client: Authenticated Notebook | STRING |
| HIGH | src/notebooklm_tools/services/research.py | 395 | Import discovered sources from a completed research task. Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 49 | List all notes in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook U | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 78 | Create a new note in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Noteboo | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 128 | Update a note's content and/or title. Args: client: Authenticated NotebookLM client notebook_id: No | STRING |
| HIGH | src/notebooklm_tools/services/notes.py | 179 | Delete a note permanently. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 237 | Download a non-streaming artifact synchronously. For: report, mind_map, data_table, quiz, flashcards. Args: | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 361 | Download a streaming artifact asynchronously. For: audio, video, slide_deck, infographic, quiz, flashcards. Ar | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 470 | Download every completed studio artifact of a notebook. Creates a subdirectory of ``output_dir`` named after the no | STRING |
| HIGH | src/notebooklm_tools/services/downloads.py | 653 | Run download_all() over every notebook in the account. Each notebook gets its own subdirectory of ``output_dir``. A | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 148 | Add a source to a notebook. Centralizes validation and routing for all source types. Args: client: Aut | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 306 | Add multiple sources to a notebook. URL sources are batched into a single API call for efficiency. Non-URL sour | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 412 | List sources with Drive freshness status. Args: client: Authenticated NotebookLM client notebook_id | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 497 | Sync Drive sources with latest content. Args: client: Authenticated NotebookLM client source_ids: S | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 529 | Rename a source in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 633 | Get AI-generated source summary with keywords. Args: client: Authenticated NotebookLM client source | STRING |
| HIGH | src/notebooklm_tools/services/sources.py | 673 | Get raw text content of a source (no AI processing). Args: client: Authenticated NotebookLM client | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 136 | Query a notebook's sources with AI. Args: client: Authenticated NotebookLM client notebook_id: Note | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 210 | Configure notebook chat settings. Args: client: Authenticated NotebookLM client notebook_id: Notebo | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 283 | Delete the chat history for a notebook. Fetches the notebook's persistent conversation ID, then deletes the ass | STRING |
| HIGH | src/notebooklm_tools/services/chat.py | 392 | Start a notebook query in a background thread for async polling. Returns immediately with a query_id. Use query_sta | STRING |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_api_client.py | 24 | # Signature: ["wrb.fr", "RPC_ID", null, null, null, [16], "generic"] | COMMENT |
| HIGH | tests/test_api_client.py | 33 | # [[["wrb.fr", "rLM1Ne", null, null, null, [16], "generic"]]] | COMMENT |
| HIGH | tests/test_api_client.py | 158 | # Source structure: [[id], title, metadata, [null, 2]] | COMMENT |
| HIGH | tests/test_file_upload.py | 105 | mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","[[[[\\"source-id-123\\"]]]]",null,null,null,"generic"]]' | CODE |
| HIGH | tests/test_file_upload.py | 130 | mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","null",null,null,null,"generic"]]' | CODE |
| HIGH⚡ | tests/core/test_conversation.py | 950 | # Table segment: [start, end, null, null, [dim1, dim2, rows_array]] | COMMENT |
| HIGH | tests/core/test_conversation.py | 670 | # first_elem: [text, null, conv_data, null, type_info] | COMMENT |
| HIGH⚡ | tests/core/test_conversation.py | 949 | """Table segments (nested=null, data at segment[4]) insert <cited_table>.""" | STRING |
| HIGH | tests/core/test_sources.py | 51 | mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[[]]",null,null,null,"generic"]]]' | CODE |
| HIGH | tests/core/test_sources.py | 74 | mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[]",null,null,null,"generic"]]]' | CODE |
| HIGH | scripts/inspect_upload_dom.py | 109 | matches.push({ | CODE |
| HIGH | src/notebooklm_tools/core/sharing.py | 105 | # Payload: [[[notebook_id, null, [access_level], [notify, ""]]], 1, null, [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sharing.py | 142 | # Payload: [[[notebook_id, [[email, null, role_code]], null, [notify_flag, message]]], 1, null, [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/labels.py | 16 | Raw format: [null, [[name, [[src_id], ...], label_id, emoji], ...]] | STRING |
| HIGH | src/notebooklm_tools/core/studio.py | 728 | # Options at position 14: [[focus_prompt, language, null, orientation, detail_level, visual_style]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 729 | # Captured RPC structure: [[null, "en", null, 1, 2, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 922 | # Options at position 7: [null, [title, desc, null, sources, lang, prompt, null, True]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 994 | # Options at position 9: [null, [1, null, focus_prompt, null*3, [difficulty, card_count]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1071 | # Quiz options at position 9: [null, [2, null, focus_prompt, null*4, [question_count, difficulty]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1148 | # Data Table options at position 18: [null, [description, language]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1250 | # Response is nested: [[json_string, null, [gen_ids]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1251 | # So result[0] is [json_string, null, [gen_ids]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1309 | # Response is nested: [[mind_map_id, json, metadata, null, title]] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1337 | # Tombstone format: [uuid, null, 2] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 1349 | # Details: [id, json, metadata, null, title] | COMMENT |
| HIGH | src/notebooklm_tools/core/studio.py | 999 | None, # Reserved (must be null) | CODE |
| HIGH | src/notebooklm_tools/core/studio.py | 1076 | None, # Reserved (must be null) | CODE |
| HIGH | src/notebooklm_tools/core/research.py | 106 | # Poll params: [null, null, "notebook_id"] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 97 | # Each turn adds: [answer, null, 2] then [query, null, 1] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 419 | # For follow-ups: params[2] = [[answer, null, 2], [query, null, 1], ...] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 523 | # Each source: [[source_id], title, metadata, [null, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 767 | # Wrapper containing segments (and possibly metadata like [null, 1]) | COMMENT |
| HIGH | src/notebooklm_tools/core/conversation.py | 878 | # Table segments have segment[2] as null, data in segment[4] | COMMENT |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 73 | Chrome expects history in format: [[answer, null, 2], [query, null, 1], ...] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 617 | [["wrb.fr", null, null, null, null, [3]]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 618 | [["wrb.fr", null, null, null, null, [8, null, [["type.googleapis.com/...Error", [...]]]]]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 668 | [["wrb.fr", null, "<nested_json>", ...]] | STRING |
| HIGH⚡ | src/notebooklm_tools/core/conversation.py | 671 | [["answer_text", null, [conv_id, hash, timestamp], null, [fmt_segments, null, null, source_passages, type_code]] | STRING |
| HIGH | src/notebooklm_tools/core/conversation.py | 901 | Each passage entry: [["passage_id"], [null, null, confidence, ..., text_passages, [[["SOURCE_ID"], ...]], ...]] | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 204 | # Sync params: [null, ["source_id"], [2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sources.py | 312 | # Source structure: [[id], title, [metadata...], [null, 2]] | COMMENT |
| HIGH | src/notebooklm_tools/core/sources.py | 481 | [[[null, "<url>", 627], [null*9, [null, null, 1]], 1]] | STRING |
| HIGH | src/notebooklm_tools/core/errors.py | 114 | [error_code, null, [[detail_type_url, [sub_codes...]]]] | STRING |
| HIGH | src/notebooklm_tools/core/notebooks.py | 39 | # [null, 1, null, [2]] - params for list notebooks | COMMENT |
| HIGH | src/notebooklm_tools/core/notebooks.py | 227 | # Response format: [title, null, id, emoji, null, metadata, null, [[goal_code, prompt?], [length_code]]] | COMMENT |
| HIGH | src/notebooklm_tools/core/base.py | 669 | where error_list = [error_code, null, [[detail_type_url, [sub_codes...]]]] | STRING |
| HIGH | src/notebooklm_tools/services/studio.py | 604 | returned every field null, leaving agents to poll forever). | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_file_upload.py | 406 | except Exception: | CODE |
| LOW | tests/core/test_thread_safety.py | 106 | except Exception as e: | CODE |
| LOW | tests/core/test_thread_safety.py | 113 | except Exception as e: | CODE |
| MEDIUM | tests/core/test_thread_safety.py | 102 | def writer(): | CODE |
| MEDIUM | tests/core/test_thread_safety.py | 109 | def clearer(): | CODE |
| LOW | docs/MULTI_USER_ANALYSIS.md | 368 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 140 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 163 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 174 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 188 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 200 | except Exception as e: | CODE |
| LOW | scripts/test_label_rpcs.py | 210 | except Exception as e: | CODE |
| LOW | scripts/inject_cookies_and_inspect.py | 82 | except Exception as e: | CODE |
| LOW | scripts/inspect_upload_dom.py | 53 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 108 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 192 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 444 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 506 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 730 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 797 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 837 | except Exception as exc: | CODE |
| LOW | src/notebooklm_tools/core/alias.py | 50 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 50 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 594 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/studio.py | 658 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/research.py | 376 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/research.py | 400 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/conversation.py | 219 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/conversation.py | 279 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/download.py | 243 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/sources.py | 118 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/utils.py | 90 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/utils.py | 101 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 61 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 151 | except Exception: | CODE |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 179 | except Exception: | CODE |
| MEDIUM | src/notebooklm_tools/core/cdp_transport.py | 58 | def _default_profile_name() -> str: | CODE |
| LOW | src/notebooklm_tools/core/base.py | 1194 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/core/base.py | 1231 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/config.py | 448 | except Exception: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 160 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 216 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 222 | except Exception: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 259 | except Exception: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 311 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 345 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 378 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 386 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 456 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 520 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 552 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 582 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 594 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 611 | except Exception as e: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 630 | except Exception as e: | CODE |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 951 | except Exception: | CODE |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 960 | except Exception: | CODE |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 965 | except Exception: | CODE |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 1513 | except Exception: | CODE |
| LOW⚡ | src/notebooklm_tools/utils/cdp.py | 1519 | except Exception: | CODE |
| 164 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 186 | ### Step 1: Check What You Have Installed | COMMENT |
| LOW⚡ | README.md | 198 | ### Step 2: Uninstall Legacy Packages | COMMENT |
| LOW⚡ | README.md | 208 | ### Step 3: Reinstall the Unified Package | COMMENT |
| LOW⚡ | README.md | 218 | ### Step 4: Verify Installation | COMMENT |
| LOW | README.md | 231 | ### Step 5: Re-authenticate | COMMENT |
| LOW | docs/API_REFERENCE.md | 1768 | # Step 1: reassign orphaned sources to a different label | COMMENT |
| LOW | docs/API_REFERENCE.md | 1771 | # Step 2: delete the label | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 569 | ### Step 1: Authenticate Gemini Notebook Account | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 576 | ### Step 2: Start MCP Server | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 588 | ### Step 3: Add Open WebUI Function | COMMENT |
| LOW | docs/MULTI_USER_ANALYSIS.md | 595 | ### Step 4: Test User Isolation | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 989 | # Step 1: Register source intent → get SOURCE_ID | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 992 | # Step 2: Start resumable upload → get upload URL | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 995 | # Step 3: Stream upload file content | COMMENT |
| LOW | src/notebooklm_tools/cli/main.py | 488 | # IMPORTANT: Don't use get_chrome_profile_dir() here as it creates the directory, | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 45 | # Step 1: Authenticate (opens Chrome) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 48 | # Step 2: Verify authentication | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 52 | # Step 3: Create a notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 56 | # Step 4: Set alias for convenience | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 59 | # Step 5: Verify | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 102 | # Step 1: Create dedicated notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 106 | # Step 2: Set alias | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 109 | # Step 3: Start deep research (takes ~5 minutes) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 113 | # Step 4: Monitor progress (polls until complete or timeout) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 116 | # Step 5: View discovered sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 119 | # Step 6: Import all discovered sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 124 | # Step 7: Generate podcast | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 127 | # Step 8: Check generation status (podcast takes 2-5 minutes) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 131 | # Step 9: Get podcast URL from studio status output | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 146 | # Step 1: Verify sources exist | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 149 | # Step 2: Generate study guide report | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 153 | # Step 3: Generate quiz (10 questions, medium difficulty) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 157 | # Step 4: Generate flashcards | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 161 | # Step 5: Generate mind map for visual overview | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 164 | # Step 6: Check all generated artifacts | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 198 | # Step 1: Check current freshness status | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 202 | # Step 2: Quick check (skip freshness API calls) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 205 | # Step 3: Find stale sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 209 | # Step 4: Sync all stale sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 212 | # Step 5: Sync specific sources only | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 215 | # Step 6: Verify all fresh | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 227 | # Step 1: Login to work account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 230 | # Step 2: Login to personal account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 233 | # Step 3: List all profiles | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 236 | # Step 4: Switch default profile | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 239 | # Step 5: Use specific profile for commands | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 243 | # Step 6: Create notebook in specific account | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 254 | # Step 1: List sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 257 | # Step 2: Get AI summary of a source | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 260 | # Step 3: Get raw text content | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 263 | # Step 4: Export to file | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 266 | # Step 5: Export multiple sources (script pattern) | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 280 | # Step 1: Create focused notebook | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 284 | # Step 2: Add relevant sources | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 289 | # Step 3: Generate slide deck | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 293 | # Step 4: Generate briefing doc | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 297 | # Step 5: Generate infographic for visual summary | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 300 | # Step 6: Check outputs | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 311 | # Step 1: Check current sharing status | COMMENT |
| LOW⚡ | src/notebooklm_tools/data/references/workflows.md | 314 | # Step 2: Enable public link sharing | COMMENT |
| 20 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_notebooks.py | 39 | CODE | |
| LOW | tests/core/test_notebooks.py | 94 | CODE | |
| LOW | tests/core/test_sources.py | 44 | CODE | |
| LOW | tests/core/test_sources.py | 67 | CODE | |
| LOW | src/notebooklm_tools/core/exports.py | 111 | CODE | |
| LOW | src/notebooklm_tools/core/sharing.py | 23 | CODE | |
| LOW | src/notebooklm_tools/core/alias.py | 110 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 356 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 605 | CODE | |
| LOW | src/notebooklm_tools/core/studio.py | 1325 | CODE | |
| LOW | src/notebooklm_tools/core/research.py | 89 | CODE | |
| LOW | src/notebooklm_tools/core/research.py | 275 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 200 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 240 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 508 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 613 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 662 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 740 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 803 | CODE | |
| LOW | src/notebooklm_tools/core/conversation.py | 897 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 105 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 267 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 371 | CODE | |
| LOW | src/notebooklm_tools/core/download.py | 812 | CODE | |
| LOW | src/notebooklm_tools/core/notes.py | 18 | CODE | |
| LOW | src/notebooklm_tools/core/notes.py | 73 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 82 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 123 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 202 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 297 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 367 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 509 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 616 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 629 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 1010 | CODE | |
| LOW | src/notebooklm_tools/core/sources.py | 1032 | CODE | |
| LOW | src/notebooklm_tools/core/utils.py | 64 | CODE | |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 92 | CODE | |
| LOW | src/notebooklm_tools/core/notebooks.py | 37 | CODE | |
| LOW | src/notebooklm_tools/core/notebooks.py | 138 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 488 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 617 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 664 | CODE | |
| LOW | src/notebooklm_tools/core/base.py | 745 | CODE | |
| LOW | src/notebooklm_tools/utils/wsl.py | 166 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 401 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 511 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 1097 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 1289 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 1523 | CODE | |
| LOW | src/notebooklm_tools/utils/cdp.py | 1700 | CODE | |
| LOW | src/notebooklm_tools/utils/browser.py | 16 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 115 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/auth.py | 94 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/labels.py | 9 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/smart_select.py | 9 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/server.py | 12 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/studio.py | 65 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/batch.py | 9 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/notes.py | 9 | CODE | |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_tool_groups.py | 95 | CODE | |
| LOW | tests/test_cdp_port_map.py | 3 | CODE | |
| LOW | tests/core/test_auth_check.py | 15 | CODE | |
| LOW | tests/core/test_cookie_rotation.py | 1 | CODE | |
| LOW | tests/services/test_auth_replay_diagnostic.py | 1 | CODE | |
| LOW | tests/services/test_auth_health.py | 20 | CODE | |
| LOW | src/notebooklm_tools/__init__.py | 3 | CODE | |
| LOW | src/notebooklm_tools/__init__.py | 7 | CODE | |
| LOW | src/notebooklm_tools/core/cookie_rotation.py | 8 | CODE | |
| LOW | src/notebooklm_tools/core/__init__.py | 3 | CODE | |
| LOW | src/notebooklm_tools/core/__init__.py | 4 | CODE | |
| LOW | src/notebooklm_tools/core/__init__.py | 4 | CODE | |
| LOW | src/notebooklm_tools/core/cdp_transport.py | 9 | CODE | |
| LOW | src/notebooklm_tools/utils/io_encoding.py | 10 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/server.py | 81 | CODE | |
| LOW | src/notebooklm_tools/mcp/tool_groups.py | 23 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 4 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 4 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 5 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 6 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 6 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 6 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 6 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 12 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 12 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 12 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 13 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 14 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 14 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 15 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 18 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 19 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 27 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 28 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 29 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 29 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 29 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 34 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 35 | CODE | |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_mcp_file_upload.py | 22 | # Create a test file | COMMENT |
| MEDIUM⚡ | tests/test_file_upload.py | 25 | # Create a mock client with minimal setup | COMMENT |
| MEDIUM | tests/test_file_upload.py | 78 | # Create a JSON file (unsupported type) | COMMENT |
| MEDIUM | tests/test_file_upload.py | 212 | # Create a temporary test file | COMMENT |
| MEDIUM | tests/test_file_upload.py | 252 | # Create a test file | COMMENT |
| MEDIUM | tests/test_e2e.py | 128 | # Create a dummy file | COMMENT |
| MEDIUM⚡ | tests/services/test_pipeline.py | 141 | # Create a simple user pipeline | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 74 | # The following methods are provided by ConversationMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 87 | # The following methods are provided by NotebookMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 99 | # The following methods are provided by SharingMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 107 | # The following methods are provided by SourceMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 122 | # The following methods are provided by ResearchMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 131 | # The following methods are provided by StudioMixin: | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/core/client.py | 142 | # The following methods are provided by NotesMixin: | COMMENT |
| MEDIUM | src/notebooklm_tools/utils/wsl.py | 236 | # Create a temp profile directory on the WINDOWS filesystem. | COMMENT |
| MEDIUM | src/notebooklm_tools/utils/wsl.py | 248 | # Create a unique subdir name | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/API_REFERENCE.md | 63 | # Get AI-generated summary of what a notebook is about | COMMENT |
| HIGH | docs/API_REFERENCE.md | 68 | # Get AI-generated summary of a specific source | COMMENT |
| HIGH | docs/API_REFERENCE.md | 589 | "description", # AI-generated description | CODE |
| HIGH | docs/API_REFERENCE.md | 594 | "summary" # AI-generated summary of sources | CODE |
| HIGH | docs/API_REFERENCE.md | 1015 | "The provided documents explore...", # AI-generated summary (markdown formatted) | CODE |
| HIGH | docs/API_REFERENCE.md | 1051 | # AI-generated summary with **bold** markdown for keywords | COMMENT |
| HIGH | docs/API_REFERENCE.md | 1101 | | **Card Count** | Default count generated by AI | | CODE |
| HIGH | docs/API_REFERENCE.md | 1226 | "Generated Title" # AI-generated title | CODE |
| HIGH | src/notebooklm_tools/data/SKILL.md | 186 | nlm notebook describe <id> # AI-generated summary + suggested topics | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_mcp_file_upload.py | 15 | # Check if source_add exists and supports file type | COMMENT |
| LOW | src/notebooklm_tools/core/studio.py | 478 | # Check if it looks like a timestamp [seconds, nanos] | COMMENT |
| LOW | src/notebooklm_tools/core/research.py | 239 | # Check if this is deep research format (src[0] is None, src[1] is title) | COMMENT |
| LOW | src/notebooklm_tools/core/conversation.py | 405 | # Check if we have cached history for this conversation | COMMENT |
| LOW | src/notebooklm_tools/core/sources.py | 414 | # Check if v1 actually accepted it (accepted-pending) | COMMENT |
| LOW | src/notebooklm_tools/core/notebooks.py | 80 | # Check if shared (for owned notebooks) | COMMENT |
| LOW | src/notebooklm_tools/core/base.py | 1111 | # Check if redirected to login (cookies expired) | COMMENT |
| LOW | src/notebooklm_tools/core/base.py | 193 | RPC_CHECK_FRESHNESS = "yR9Yof" # Check if Drive source is stale | CODE |
| LOW | src/notebooklm_tools/utils/config.py | 394 | # Check if new location already has data | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 184 | # Check if Chrome is already running - this is a HARD REQUIREMENT | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 439 | # Check if rule exists | COMMENT |
| LOW | src/notebooklm_tools/utils/wsl.py | 506 | # Check if it's a permission issue | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 499 | # Check if it's a symlink pointing to a snap path. Normalize the resolved | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 1327 | # Check if process is alive but CDP is unresponsive | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 1375 | # Check if Chrome is running with debugging | COMMENT |
| LOW | src/notebooklm_tools/utils/cdp.py | 1723 | # Check if profile exists with saved login | COMMENT |
| LOW | src/notebooklm_tools/cli/utils.py | 151 | # Check if cache is still valid (24 hours = 86400 seconds) | COMMENT |
| LOW⚡ | src/notebooklm_tools/cli/main.py | 694 | # Check if old profile exists | COMMENT |
| LOW⚡ | src/notebooklm_tools/cli/main.py | 700 | # Check if new profile name already exists | COMMENT |
| LOW | src/notebooklm_tools/cli/main.py | 487 | # Check if we need to migrate from legacy packages | COMMENT |
| LOW | src/notebooklm_tools/cli/main.py | 739 | # Check if profile exists | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 193 | # Check if export directory exists | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 347 | # Check if already installed | COMMENT |
| LOW | src/notebooklm_tools/cli/commands/skill.py | 542 | # Check if already installed | STRING |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1067 | # Display results table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/notebooklm_tools/mcp/tools/studio.py | 65 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/batch.py | 9 | CODE | |
| LOW | src/notebooklm_tools/mcp/tools/sources.py | 16 | CODE | |
| LOW | src/notebooklm_tools/cli/main.py | 194 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 144 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 250 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 306 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 352 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 498 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 607 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/studio.py | 654 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/research.py | 21 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/download.py | 234 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 113 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 147 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 186 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 219 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 257 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 287 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 406 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 628 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 861 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/verbs.py | 964 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/source.py | 21 | CODE | |
| LOW | src/notebooklm_tools/cli/commands/source.py | 60 | CODE | |
| LOW | src/notebooklm_tools/services/studio.py | 262 | CODE | |
| LOW | src/notebooklm_tools/services/sources.py | 134 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/notebooklm_tools/__init__.py | 11 | __all__ = ["NotebookLMClient", "__version__"] | CODE |
| LOW | src/notebooklm_tools/core/auth.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/alias.py | 62 | def set_alias(self, name: str, value: str, alias_type: str = "unknown") -> None: | CODE |
| LOW | src/notebooklm_tools/core/cookie_rotation.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/__init__.py | 6 | __all__ = ["load_cached_tokens", "save_tokens_to_cache", "constants"] | CODE |
| LOW | src/notebooklm_tools/core/notebooks.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/core/base.py | 1163 | def _update_cached_tokens(self) -> None: | CODE |
| LOW | src/notebooklm_tools/utils/wsl.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/utils/cdp.py | 80 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/mcp/tools/__init__.py | 58 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/mcp/tools/_utils.py | 72 | def set_query_timeout(timeout: float) -> None: | CODE |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1050 | def _setup_all() -> None: | CODE |
| LOW | src/notebooklm_tools/cli/commands/setup.py | 1186 | def _setup_json() -> None: | CODE |
| LOW | src/notebooklm_tools/services/auth.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/auth.py | 39 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/services/studio.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/__init__.py | 15 | __all__ = [ | CODE |
| LOW | src/notebooklm_tools/services/chat.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/chats.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/notebooklm_tools/services/_compat.py | 10 | __all__ = ["TypedDict"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/notebooklm_tools/core/sharing.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| HIGH | src/notebooklm_tools/core/sources.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| HIGH | src/notebooklm_tools/core/notebooks.py | 0 | mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatio | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_auth_browser.py | 65 | auth.save_profile(cookies={"SID": "sid", "HSID": "hsid"}, email="user@example.com") | CODE |
| LOW | tests/test_cdp_port_map.py | 160 | profile_dir = tmp_path / "John Doe" / "nlm-profile" | CODE |
| LOW⚡ | tests/cli/test_login.py | 15 | return SimpleNamespace(name=self.profile_name, email="user@example.com") | CODE |
| LOW⚡ | tests/cli/test_login.py | 26 | return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3 | CODE |
| LOW | tests/cli/test_login.py | 53 | return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3 | CODE |
| LOW | tests/cli/test_login.py | 66 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_login.py | 85 | "email": "user@example.com", | CODE |
| LOW | tests/cli/test_login.py | 102 | email="user@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/notebooklm_tools/core/auth.py | 865 | # orchestration, caching, verdict aggregation) and belong in the services | COMMENT |
| MEDIUM⚡ | src/notebooklm_tools/services/auth.py | 281 | # Probe orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/notebooklm_tools/core/sources.py | 989 | # Step 1: Register source intent → get SOURCE_ID | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 992 | # Step 2: Start resumable upload → get upload URL | COMMENT |
| LOW⚡ | src/notebooklm_tools/core/sources.py | 995 | # Step 3: Stream upload file content | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_api_client.py | 21 | def test_rpc_error_16_detection(self, mock_client): | COMMENT |
| LOW | src/notebooklm_tools/core/auth.py | 261 | COMMENT | |
| LOW | src/notebooklm_tools/core/auth.py | 861 | COMMENT | |
| LOW | src/notebooklm_tools/core/client.py | 61 | - Studio content (audio, video, reports, flashcards, etc.) | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 81 | # - _extract_answer_from_chunk | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 101 | # - set_public_access | COMMENT |
| LOW | src/notebooklm_tools/core/client.py | 121 | # ========================================================================= | COMMENT |
| LOW | src/notebooklm_tools/core/base.py | 421 | self._cdp_launched_port: int | None = None | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/notebooklm_tools/cli/ai_docs.py | 290 | # their chat history natively into the NotebookLM web UI, enabling seamless cross-device sessions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/notebooklm_tools/core/auth.py | 272 | # Usage: | COMMENT |