NotebookLM Automation
Complete programmatic access to Google NotebookLM—including capabilities not exposed in the web UI. Create notebooks, add sources (URLs, YouTube, PDFs, audio, video, images), chat with content, generate all artifact types, and download results in multiple formats.
Installation
From PyPI (Recommended for AI agents — Python-version-aware):
pip install "notebooklm-py[browser]" # mandatory; errors must propagate
# [cookies] (rookiepy) is optional and known to FAIL TO BUILD on Python 3.13+.
# Skip it deliberately on 3.13+ rather than swallowing the error — that lets
# *real* install failures (typos, network, PyPI outages) surface for the agent.
if python -c "import sys; sys.exit(0 if sys.version_info < (3, 13) else 1)"; then
pip install "notebooklm-py[cookies]" # errors propagate
else
echo "Skipping [cookies] on Python 3.13+ (rookiepy unavailable). Use 'notebooklm login' interactively."
fi
Full install matrix (extras, headless servers, contributor flow): Installation guide on GitHub.
From GitHub (use latest release tag, NOT main branch):
# Get the latest release tag (using curl)
LATEST_TAG=$(curl -s https://api.github.com/repos/teng-lin/notebooklm-py/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
# Includes [browser] so the interactive `notebooklm login` flow works.
pip install "notebooklm-py[browser] @ git+https://github.com/teng-lin/notebooklm-py@${LATEST_TAG}"
⚠️ DO NOT install from main branch (pip install git+https://github.com/teng-lin/notebooklm-py). The main branch may contain unreleased/unstable changes. Always use PyPI or a specific release tag, unless you are testing unreleased features.
Skill install methods:
notebooklm skill installinstalls this skill into the supported local agent directories managed by the CLI.npx skills add teng-lin/notebooklm-pyinstalls this skill from the GitHub repository into compatible agent skill directories.- If you are already reading this file inside an agent skill directory, the skill is already installed. You only need the Python package and authentication below.
CLI-managed install:
notebooklm skill install
Prerequisites
IMPORTANT: Before using any command, you MUST authenticate:
notebooklm login # Opens browser for Google OAuth
notebooklm list # Verify authentication works
If commands fail with authentication errors, re-run notebooklm login.
CI/CD, Multiple Accounts, and Parallel Agents
For automated environments, multiple accounts, or parallel agent workflows:
| Variable | Purpose |
|---|---|
NOTEBOOKLM_HOME | Custom config directory (default: ~/.notebooklm) |
NOTEBOOKLM_PROFILE | Active profile name (default: default) |
NOTEBOOKLM_AUTH_JSON | Inline auth JSON - no file writes needed |
CI/CD setup: Set NOTEBOOKLM_AUTH_JSON from a secret containing your storage_state.json contents.
Multiple accounts: Use named profiles (notebooklm profile create work, then notebooklm -p work login). Alternatively, use different NOTEBOOKLM_HOME directories per account.
Parallel agents: The CLI stores notebook context per profile (~/.notebooklm/profiles/<profile>/context.json, with a legacy fallback to ~/.notebooklm/context.json for the implicit default profile). Multiple concurrent agents that share a profile and use notebooklm use can overwrite each other's context — use one of the isolation strategies below.
Solutions for parallel workflows:
- Always use explicit notebook ID (recommended): Pass
-n <notebook_id>(forwait/downloadcommands) or--notebook <notebook_id>(for others) instead of relying onuse - Per-agent isolation via profiles:
export NOTEBOOKLM_PROFILE=agent-$ID(each profile gets its own context file) - Per-agent isolation via home: Set unique
NOTEBOOKLM_HOMEper agent:export NOTEBOOKLM_HOME=/tmp/agent-$ID - Use full UUIDs: Avoid partial IDs in automation (they can become ambiguous)
Agent Setup Verification
Before starting workflows, verify auth is in place. Use --test --json (not bare --json) — bare --json only proves the cookie file parses; --test makes a network call and proves the cookies still authenticate against Google.
notebooklm auth check --test --json→ require BOTH"status": "ok"AND"checks.token_fetch": true. Bare"status": "ok"(without--test) is a false-positive trap — a stale cookie file passes the parse check.notebooklm list --json→ expect valid JSON (may be empty for new accounts).- If auth fails or is missing → run
notebooklm loginfirst. This is the primary auth path: opens a browser, the user signs in to Google once, and the resultingstorage_state.jsonis reused on every subsequent run. Works on any environment with a display.- For headless contexts where opening a browser is not feasible, use
notebooklm login --browser-cookies <browser>instead — extracts the user's already-logged-in cookies from Chrome/Firefox/etc. (requires the[cookies]extra; rookiepy may not install on Python 3.13+). Usechrome::<profile-name-or-directory>to target one Chromium user-profile, orfirefox::<container-name>/firefox::noneto target one Firefox container. - To survey signed-in Google accounts before picking one:
notebooklm auth inspect --browser <browser>(read-only; pass-vto see which Chromium user-profile each account came from, or--jsonfor tooling). Scoped forms such asnotebooklm auth inspect --browser 'chrome::Profile 1'inspect only that browser profile. - Re-run step 1 after login to confirm.
- For headless contexts where opening a browser is not feasible, use
- If auth was working but cookies went stale (Google rotated SIDTS, or you signed in fresh in the browser) → refresh the active profile in place instead of full re-login:
notebooklm auth refresh— server-side SIDTS refresh against the existingstorage_state.json. Cheap and silent; safe to run on a schedule (cron / launchd / systemd) at 15–20 min cadence to keep an unattended profile warm.notebooklm auth refresh --browser-cookies <browser>— re-extract cookies from a running browser and match them back to the profile's recorded email incontext.json. Use when the on-diskstorage_state.jsonis too stale for the server-side refresh path but you've just signed back into Google in the browser. For Chromium-family browsers with multiple user-profiles (Chrome'sDefault,Profile 1, …), refresh fans out across all profiles to find the email — same path asauth inspect(issue #571). Usechrome::<profile-name-or-directory>when you already know the exact browser profile.- Both forms preserve the same
--profile(no new profile is created).
Note:
notebooklm statusreports context state (selected notebook); do not use it to verify auth.
When This Skill Activates
Explicit: User says "/notebooklm", "use notebooklm", or mentions the tool by name
Intent detection: Recognize requests like:
- "Create a podcast about [topic]"
- "Summarize these URLs/documents"
- "Generate a quiz from my research"
- "Turn this into an audio overview"
- "Create flashcards for studying"
- "Generate a video explainer"
- "Make an infographic"
- "Create a mind map of the concepts"
- "Download the quiz as markdown"
- "Add these sources to NotebookLM"
Autonomy Rules
Run automatically (no confirmation):
notebooklm status- check contextnotebooklm auth check- diagnose auth issuesnotebooklm auth inspect- list Google accounts visible to a browser (read-only)notebooklm auth refresh- server-side SIDTS refresh of the active profile (no new profile, no destructive writes)notebooklm auth refresh --browser-cookies <browser>- re-extract cookies from a browser into the active profile (rebuildsstorage_state.jsonfor the same `-