A Comprehensive Google Gemini Notebook Skill & Unofficial Python API. Full programmatic access to NotebookLM's features—including capabilities the web UI doesn't expose—via Python, CLI, and AI agents like Claude Code, Codex, and OpenClaw.
FAQ
notebooklm-py is a Claude Code plugin with 1 hand-picked skill for development work, indexed on Flowy. Install it with the command on its page. It includes notebooklm-py. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
$ npx -y skills add teng-lin/notebooklm-py --agent claude-code
Repo: teng-lin/notebooklm-py

A Comprehensive Google Gemini Notebook Skill & Unofficial Python API. Full programmatic access to NotebookLM's features—including capabilities the web UI doesn't expose—via Python, CLI, and AI agents like Claude Code, Codex, and OpenClaw.
Note (July 2026): Google rebranded NotebookLM to Gemini Notebook. It remains the same standalone product (now also reachable inside the Gemini app), existing links redirect automatically, and this library drives the same underlying service and works unchanged. The package keeps the
notebooklm-pyname.
Source & Development: https://github.com/teng-lin/notebooklm-py
⚠️ Unofficial Library - Use at Your Own Risk
This library uses undocumented Google APIs that can change without notice.
- Not affiliated with Google - This is a community project
- APIs may break - Google can change internal endpoints anytime
- Rate limits apply - Heavy usage may be throttled
Best for prototypes, research, and personal projects. See Troubleshooting for debugging tips.
🤖 AI Agent Tools - Integrate NotebookLM into Claude Code, Codex, and other LLM agents. Ships with a root NotebookLM skill for GitHub and npx skills add discovery, local notebooklm skill install support for Claude Code and .agents skill directories, and repo-level Codex guidance in AGENTS.md.
📚 Research Automation - Bulk-import sources (URLs, PDFs, YouTube, Google Drive), run web/Drive research queries with auto-import, and extract insights programmatically. Build repeatable research pipelines.
🎙️ Content Generation - Generate Audio Overviews (podcasts), videos, slide decks, quizzes, flashcards, infographics, data tables, mind maps, and study guides. Full control over formats, styles, and output.
📥 Downloads & Export - Download all generated artifacts locally (MP3, MP4, PDF, PNG, CSV, JSON, Markdown). Export to Google Docs/Sheets. Features the web UI doesn't offer: batch downloads, quiz/flashcard export in multiple formats, mind map JSON extraction.
NotebookLM is a grounded engine: Gemini does the heavy reading and answers from your sources with citations. The winning pattern is to let it do the expensive analysis while your agent (Claude Code, Codex, …) orchestrates and handles the final mile — using NotebookLM as a zero-token synthesis + memory layer an agent drives in a loop, and pulling structured artifacts out in bulk and in richer, scriptable formats. Recipes people build on top of this library, grouped by what they use NotebookLM as:
Spend fewer tokens — let NotebookLM do the expensive thinking:
create → source add → ask); the reasoning happens server-side. In the wild: a four-workflow guide to stop Claude Code burning tokens on NotebookLM.source add-research "your topic" --mode deep) or load a doc corpus, let NotebookLM's Gemini condense it, and bake the result into a SKILL.md your agent loads at startup — build once, reuse with zero runtime tokens or network calls, git-versioned and immune to UI drift. A packaged domain expert without hand-curating sources. (Dumping raw docs into a skill flattens the hierarchy; NotebookLM condensing first is what makes it work.)Give your agent memory — persistent, grounded recall:
note create / ask --save-as-note), and a line in your CLAUDE.md queries it (ask) at the start of the next session. Storage and recall live on Google's infrastructure.ask) so an agent answers from your code with citations rather than plausible-sounding guesses — a zero-infra alternative to standing up your own vector DB and embedding pipeline. In the wild: turning a notebook into the source-grounded "project brain" a coding agent consults before it writes code.ask for cited answers across your own history — surfacing long-term patterns a keyword search can't (e.g. a weekly summary synthesized from 282 daily notes, every claim linked back to the entry it came from). In the wild: chatting with a year of daily notes as a cited knowledge base.Turn your sources into answers & artifacts — cited responses, generated media, and exports:
ask --json for source-grounded, cited answers for support, on-call, or internal Q&A. Or have an agent point it at an entire fast-moving tool's docs — more than the agent can hold in context — as a troubleshooting oracle it queries the moment it hits an error. In the wild: OpenClaw drove the library to scrape all 524 pages of docs.openclaw.ai, dedupe the duplicate translations, and audit it down to 269 clean sources (missing/extra/duplicate = 0).generate audio (podcast), generate video, generate slide-deck, plus a generate report blog draft, generate quiz, and generate flashcards — fan a single notebook out across channels.download <type> / download <type> --all). The programmatic "get data out" half of the library, not just "put sources in."[[wikilinks]]. Pair with a podcast overview for an audio digest of your notes. In the wild: "Claude Code + NotebookLM + Obsidian = GOD MODE".Run it unattended, at scale, or on the go — scheduled, headless, and remote:
generate report --format briefing-doc --wait, then download report) as an automated runbook.auth refresh --quiet (cron/launchd/systemd) with generate audio to publish a fresh personalized briefing to a podcast feed on a schedule.These combine ordinary library primitives — see the CLI Reference and Python API. The agent-side glue (skills, scheduling, vault layout) lives in your own setup, not this package. Per-notebook source counts depend on your Google account tier — split across notebooks if you hit a cap.
New here? Start with a walkthrough: Claude Code + NotebookLM = CHEAT CODE (video) · 5 demos + 50 use cases, with prompts.
| Method | Best For |
|---|---|
| Python API | Application integration, async workflows, custom pipelines |
| CLI | Shell scripts, quick tasks, CI/CD automation |
| MCP Server | Claude Desktop/Code, Codex, etc. — locally via stdio, or as a self-hosted remote connector (behind a Cloudflare/Tailscale tunnel) reachable from claude.ai and ChatGPT, mobile included. |
| REST Server | Local automation over guarded HTTP routes without spawning a CLI process per call |
| Agent Integration | Claude Code, Codex, LLM agents, natural language automation |
| Category | Capabilities |
|---|---|
| Notebooks | Create, list, rename, delete |
| Sources | URLs, YouTube, files (PDF, text, Markdown, Word, EPUB, audio, video, images), Google Drive, pasted text; refresh, get guide/fulltext |
| Chat | Questions, conversation history, custom personas, suggested starter prompts |
| Notes | Create, list, rename, delete, save chat answers, save conversation history |
| Source Labels | AI-generated or manual topic labels; add/remove source membership; filter sources by label |
| Research | Web and Drive research agents (fast/deep modes) with auto-import |
| Sharing | Public/private links, user permissions (viewer/editor), view level control |
| Type | Options | Download Format |
|---|---|---|
| Audio Overview | 4 formats (deep-dive, brief, critique, debate), 3 lengths, 50+ languages | MP3 |
| Video Overview | 4 formats (explainer, brief, cinematic, short), 8 visual styles (+ auto/custom), plus a dedicated cinematic-video CLI alias | MP4 |
| Slide Deck | Detailed or presenter format, adjustable length; individual slide revision | PDF, PPTX |
| Infographic | 3 orientations, 3 detail levels | PNG |
| Quiz | Configurable quantity and difficulty | JSON, Markdown, HTML |
| Flashcards | Configurable quantity and difficulty | JSON, Markdown, HTML |
| Report | Briefing doc, study guide, blog post, or custom prompt | Markdown |
| Data Table | Custom structure via natural language | CSV |
| Mind Map | Hierarchical node tree — two kinds: note-backed JSON or the newer interactive studio map (--kind / MindMapKind) | JSON |
Programmatic, batch, and local-file capabilities the API/CLI make easy — several in richer formats, or at a scale, than clicking through the web app:
The full install guide — six personas (agent, end-user, library, headless, contributor, power-user), optional extras matrix, platform notes — lives in docs/installation.md.
Quickest start (CLI users and AI agents) — install the CLI with uv tool (recommended) or pipx:
uv tool install "notebooklm-py[browser]" # or: pipx install "notebooklm-py[browser]"
notebooklm login # first run auto-downloads Chromium (~170 MB), then Google sign-in
notebooklm auth check --test --json # verify: expect "status": "ok"
Why uv tool / pipx? They install the CLI into its own isolated environment and put notebooklm on your PATH — no dependency clashes with other tools, a one-line upgrade (uv tool upgrade notebooklm-py) or uninstall, and, crucially, they work on modern macOS (Homebrew Python) and Debian/Ubuntu where a system-wide pip install is blocked with error: externally-managed-environment (PEP 668). No uv yet? curl -LsSf https://astral.sh/uv/install.sh | sh (or brew install uv / winget install astral-sh.uv).
Prefer plain pip? It works the same inside a virtualenv (and directly on Windows, where Python isn't externally-managed):
python3 -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install "notebooklm-py[browser]"
As a library (embedded in your app — no Playwright, no Chromium):
uv add notebooklm-py # or, inside a virtualenv: pip install notebooklm-py
If playwright install chromium fails on Linux with TypeError: onExit is not a function, see the Linux workaround. Contributors: see CONTRIBUTING.md.
Flexible auth for local dev, headless servers, and multi-tenant setups:
login --browser-cookies chrome, no Playwright), or a durable master token.login --master-token --account you@example.com), so it self-heals expired sessions unattended — the auth model for servers, CI, and the remote MCP connector (claude.ai / ChatGPT).Option 1 — CLI install:
notebooklm skill install
Installs the skill into ~/.claude/skills/notebooklm and ~/.agents/skills/notebooklm.
Option 2 — npx install (via the open skills ecosystem):
npx skills add teng-lin/notebooklm-py
Fetches the canonical SKILL.md directly from GitHub.
# 1. Authenticate (opens browser)
notebooklm login
# Or use Microsoft Edge (for orgs that require Edge for SSO)
# notebooklm login --browser msedge
# Or reuse cookies from an already-logged-in browser session
# notebooklm login --browser-cookies chrome
# notebooklm login --browser-cookies 'chrome::Profile 1' # one Chromium profile
# (combine with --profile to populate a specific profile;
# use --account / --all-accounts after auth inspect when several
# Google accounts are signed in)
# 2. Create a notebook and add sources
notebooklm create "My Research"
notebooklm use <notebook_id>
notebooklm source add "https://en.wikipedia.org/wiki/Artificial_intelligence"
notebooklm source add "./paper.pdf"
# 3. Chat with your sources
notebooklm ask "What are the key themes?"
notebooklm ask --prompt-file ./long_question.txt # Read question from file
# 4. Generate content (use --prompt-file for long prompts)
notebooklm generate audio "make it engaging" --wait
notebooklm generate video --style whiteboard --wait
notebooklm generate cinematic-video "documentary-style summary" --wait
notebooklm generate quiz --difficulty hard
notebooklm generate flashcards --quantity more
notebooklm generate slide-deck
notebooklm generate infographic --orientation portrait
notebooklm generate mind-map # interactive studio map (default); --kind note-backed for the JSON tree
notebooklm generate data-table "compare key concepts"
# 5. Download artifacts
notebooklm download audio ./podcast.m4a
notebooklm download video ./overview.mp4
notebooklm download cinematic-video ./documentary.mp4
notebooklm download quiz --format markdown ./quiz.md
notebooklm download flashcards --format json ./cards.json
notebooklm download slide-deck ./slides.pdf
notebooklm download infographic ./infographic.png
notebooklm download mind-map ./mindmap.json
notebooklm download data-table ./data.csv
Other useful CLI commands:
notebooklm auth check --test # Diagnose auth/cookie issues
notebooklm auth refresh --quiet # One-shot cookie keepalive (for cron / launchd / systemd)
notebooklm auth refresh --browser-cookies chrome # Re-extract and repair account routing
notebooklm auth inspect --browser 'chrome::Profile 1' # Preview one Chromium profile
notebooklm agent show codex # Print bundled Codex instructions
notebooklm agent show claude # Print bundled Claude Code skill template
notebooklm language list # List supported output languages
notebooklm metadata --json # Export notebook metadata and sources
notebooklm share status # Inspect sharing state
notebooklm source add-research "AI" --import-all # web research + import found sources
notebooklm skill status # Check local agent skill installation
notebooklm profile list # List all Google account profiles
notebooklm profile switch work # Switch active account profile
Use --prompt-file PATH with ask, prompt-based generate commands, and source add-research when the text is too long for the shell command line. This reads prompt/query text from a file and is separate from source add ./file.pdf, which still uploads that file as a NotebookLM source.
import asyncio
from notebooklm import NotebookLMClient, MindMapKind
async def main():
async with NotebookLMClient.from_storage() as client:
# Create notebook and add sources
nb = await client.notebooks.create("Research")
await client.sources.add_url(nb.id, "https://example.com", wait=True)
# Chat with your sources
result = await client.chat.ask(nb.id, "Summarize this")
print(result.answer)
# Generate content (podcast, video, quiz, etc.)
status = await client.artifacts.generate_audio(nb.id, instructions="make it fun")
await client.artifacts.wait_for_completion(nb.id, status.task_id)
await client.artifacts.download_audio(nb.id, "podcast.m4a")
# Generate quiz and download as JSON
status = await client.artifacts.generate_quiz(nb.id)
await client.artifacts.wait_for_completion(nb.id, status.task_id)
await client.artifacts.download_quiz(nb.id, "quiz.json", output_format="json")
# Generate a mind map via the unified client.mind_maps API (issue #1256) —
# two kinds: the newer MindMapKind.INTERACTIVE studio map (shown; polled to
# completion by default) or MindMapKind.NOTE_BACKED JSON. Both export via:
mm = await client.mind_maps.generate(nb.id, kind=MindMapKind.INTERACTIVE)
await client.artifacts.download_mind_map(nb.id, "mindmap.json", mm.id)
asyncio.run(main())
AccountLimits.tierMIT License. See LICENSE for details.
.dockerignore
.env.example
.github/
codeql-config.yml
dependabot.yml
ISSUE_TEMPLATE/
bug_report.md
config.yml
feature_request.md
PULL_REQUEST_TEMPLATE.md
workflows/
claude.yml
codeql.yml
dependency-audit.yml
nightly.yml
publish-docker.yml
publish-mcpb.yml
publish.yml
rpc-health.yml
test.yml
testpypi-publish.yml
verify-artifacts.yml
verify-package.yml
.gitignore
.pre-commit-config.yaml
AGENTS.md
CHANGELOG.md
CLAUDE.md
CONTRIBUTING.md
deploy/
.env.example
.gitignore
docker-compose.build.yml
docker-compose.yml
Dockerfile
Makefile
README.md
setup.sh
tailscale/
funnel.json
desktop-extension/
.mcpbignore
manifest.json
README.md
run_server.py
docs/
adr/
0000-template.md
0001-layered-core-seams-and-property-bridge-policy.md
0002-capability-protocol-pattern.md
0003-auth-facade-write-through.md
0004-loop-affinity-contract.md
0005-idempotency-taxonomy.md
0006-vcr-scrubber-strategy.md
0007-test-monkeypatch-policy.md
0008-cli-services-extraction-pattern.md
0009-middleware-chain.md
0010-session-kernel-split.md
0011-schema-validation-policy.md
0012-implementation-surface-convention.md
0013-composable-session-capabilities.md
0014-feature-local-runtime-adapters.md
0015-json-envelope-contract-for-post-parse-click-exceptions.md
0016-auth-identity-and-core-logger-compatibility.md
0017-public-facade-private-implementation.md
0018-deprecation-strategy.md
0019-error-and-return-contract.md
0020-sealed-async-result-types.md
0021-transport-neutral-app-layer.md
0022-regenerable-baselines.md
0023-master-token-headless-auth.md
0024-mcp-remote-file-transfer.md
0025-mcp-tool-granularity.md
0026-mcp-studio-surface.md
0027-mcp-app-upload-widget.md
0028-gemini-notebook-rename.md
README.md
architecture.md
auth-cookie-lifecycle.md
cli-exit-codes.md
cli-reference.md
configuration.md
conventions.md
deprecations.md
development.md
experiments/
2026-07-webview-upload.md
installation.md
mcp-guide.md
notes/
otmp3b-suggest-modes.md
rest-vs-mcp-gap-review-2026-07-02.md
python-api.md
quota-limits.md
refactor-history.md
releasing.md
rpc-development.md
rpc-reference.md
stability.md
troubleshooting.md
upgrading-to-0.8.0.md
examples/
bulk-import.py
chat.py
notes.py
quickstart.py
refresh_browser_cookies.py
research-to-podcast.py
video.py
hatch_build.py
LICENSE
notebooklm-py.png
pyproject.toml
README.md
scripts/
_onetime_rescrub_cookies.py
_strip_audit_refs.py
api-compat-allowlist.json
audit_public_api_compat.py
audit_test_suite.py
capture_rpc_registry.py
check_action_pinning.py
check_ci_install_parity.py
check_claude_md_freshness.py
check_coverage_thresholds.py
check_deprecation_targets.py
check_docs_module_refs.py
check_rpc_health.py
check_workflow_permissions.py
check_workflow_secret_gates.py
diagnose_get_notebook.py
mcp_live_smoke.py
regen_baselines.py
rescrub-cassettes.py
scrub_rpc_har.py
test_taxonomy_inventory.py
SECURITY.md
SKILL.md
src/
notebooklm/
__init__.py
__main__.py
_app/
__init__.py
artifacts.py
auth_check.py
chat.py
collections.py
doctor.py
download.py
errors.py
events.py
generate_plans.py
generate_retry.py
generate.py
labels.py
language.py
mcp_install.py
notebooks.py
notes.py
pagination.py
profile.py
research.py
resolve.py
serialize.py
session.py
sharing.py
skill.py
source_add.py
source_batch.py
source_clean.py
source_content.py
source_listing.py
source_mutations.py
source_research.py
source_wait.py
views.py
_artifact/
__init__.py
_download_client.py
_redirect_guard.py
downloads.py
formatters.py
generation.py
listing.py
payloads.py
polling.py
validation.py
_artifacts.py
_atomic_io.py
_auth/
_auth_refresh_retry.py
__init__.py
_browser_cookie_filter.py
account.py
browser_capture.py
browser_launch_errors.py
cookie_policy.py
cookies.py
extraction.py
headers.py
headless_reauth.py
keepalive.py
login_wait_trace.py
master_token.py
paths.py
psidts_recovery.py
refresh.py
session.py
storage.py
tokens.py
_backoff.py
_callbacks.py
_chat/
__init__.py
api.py
deleted_tracker.py
notes.py
transport.py
wire.py
_client_assembly.py
_client_composed.py
_client_metrics.py
_client_seams.py
_collection/
__init__.py
params.py
_collections.py
_conversation_cache.py
_cookie_persistence.py
_curl_cffi_transport.py
_deadline.py
_deprecation.py
_env.py
_error_injection.py
_idempotency_policy.py
_idempotency.py
_kernel.py
_label/
__init__.py
params.py
_labels.py
_logging.py
_lookup.py
_loop_affinity.py
_loop_bound.py
_middleware/
__init__.py
auth_refresh.py
chain_host.py
chain.py
context.py
core.py
drain.py
error_injection.py
metrics.py
retry.py
semaphore.py
tracing.py
_mind_map.py
_mind_maps_api.py
_note_service.py
_notebook_metadata.py
_notebook_payloads.py
_notebooks.py
_notes.py
_polling_registry.py
_redact.py
_reqid_counter.py
_request_types.py
_research_import.py
_research_task_parser.py
_research.py
_row_adapters/
__init__.py
artifacts.py
chat.py
labels.py
notebooks.py
notes.py
research.py
sources.py
_rpc_executor.py
_runtime/
__init__.py
auth.py
config.py
contracts.py
helpers.py
init.py
lifecycle.py
transport.py
_secrets.py
_serving.py
_settings.py
_sharing_manager.py
_sharing.py
_source/
__init__.py
_upload_decode.py
add.py
content.py
drive_import.py
listing.py
polling.py
upload_payloads.py
upload.py
_sources.py
_streaming_post.py
_transport_drain.py
_transport_errors.py
_types/
__init__.py
artifacts.py
chat.py
collections.py
common.py
labels.py
mind_maps.py
notebooks.py
notes.py
research.py
sharing.py
sources.py
_url_utils.py
_version_check.py
_version_info.py
artifacts.py
auth.py
cli/
__init__.py
_chromium_profiles.py
_cookie_import.py
_download_specs.py
_encoding.py
_firefox_containers.py
_session_render.py
_source_render.py
agent_cmd.py
agent_templates.py
artifact_cmd.py
auth_runtime.py
chat_cmd.py
collection_cmd.py
completion.py
context.py
doctor_cmd.py
download_cmd.py
download_helpers.py
error_handler.py
generate_cmd.py
grouped.py
helpers.py
input.py
label_cmd.py
language_cmd.py
master_token_login.py
mcp_cmd.py
note_cmd.py
notebook_cmd.py
options.py
playwright_login_io.py
polling_ui.py
profile_cmd.py
rendering.py
research_cmd.py
research_import.py
resolve.py
runtime.py
services/
__init__.py
auth_diagnostics.py
auth_source.py
confirming_mutation.py
download.py
generate.py
label_listing.py
listing.py
login/
__init__.py
browser_accounts.py
chromium_accounts.py
cookie_domains.py
cookie_jar.py
cookie_writes.py
exceptions.py
firefox_accounts.py
io_seam.py
master_token.py
outcomes.py
profile_targets.py
refresh.py
rookiepy_errors.py
playwright_login.py
playwright_redaction.py
polling.py
research.py
session_context.py
source_listing.py
source_mutations.py
... 944 more© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic