NotebookLM Research Assistant
PleasePrompto/notebooklm-skill
Lets Claude Code ask questions of your Google NotebookLM notebooks through browser automation and return answers grounded in your uploaded sources.
Installs, authenticates and operates Gemini Notebook (NotebookLM) through the notebooklm-py CLI or its typed async Python API, for notebooks, sources, grounded chat and generated artifacts.
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install teng-lin/notebooklm-py notebooklm --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
Claude Code skills documentation · loads skills from .claude/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .claude/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install teng-lin/notebooklm-py notebooklm --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .agents/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install teng-lin/notebooklm-py notebooklm --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .cursor/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install teng-lin/notebooklm-py notebooklm --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .gemini/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install teng-lin/notebooklm-py notebooklmInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .github/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/notebooklm-py --skill notebooklm -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install teng-lin/notebooklm-py notebooklm --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "notebooklm" agent skill from https://github.com/teng-lin/notebooklm-py/tree/main into .opencode/skills/notebooklm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notebooklm", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
notebooklmInstalls, authenticates and operates Gemini Notebook (NotebookLM) through the notebooklm-py CLI or its typed async Python API, for notebooks, sources, grounded chat and generated artifacts.
The skill prefers the notebooklm CLI for agent workflows, with --json output and explicit IDs so every operation can be inspected and run safely under concurrency. The typed async Python API is used only when you ask for application code or the CLI cannot express the workflow. It covers notebook and source management, grounded chat and research, and artifact generation and download. It is not for the generic Gemini API or unrelated content creation.
Setup needs Python 3.10 or newer and installs notebooklm-py into your existing environment, with optional extras for browser login, cookie extraction and headless use. For unattended work it prefers profile-backed master-token auth over copied cookie snapshots, and NOTEBOOKLM_HOME and NOTEBOOKLM_PROFILE choose the private directory and profile. Before a workflow it verifies real authentication with notebooklm auth check, and if that fails it points to a browser login or, on a headless machine, to cookie-based auth.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1d8920f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
pipuvFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip and uv, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
NotebookLM Automation loads about 4.1k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 1,811 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from teng-lin/notebooklm-py at commit 1d8920f, republished under its MIT licence (© teng-lin). 1,811 words, ~4,094 tokens.
.claude/skills/notebooklm/SKILL.md (or your agent's skills folder). This skill also uses 2331 other files; get the full folder from GitHub.Use the notebooklm CLI for agent workflows. Prefer --json and explicit IDs so every
operation is inspectable and safe under concurrency. Use the typed async Python API only when the
user requests application code or the CLI cannot express the workflow. The readiness, identity,
authorization, and credential-handling rules below apply to both interfaces.
Requires Python 3.10+. Install the package in the user's existing environment; do not create a separate environment unless requested:
pip install "notebooklm-py[browser]"
pip install "notebooklm-py[cookies]" # optional browser-cookie extractionIf system pip reports externally-managed-environment, do not use --break-system-packages.
For CLI-only use, offer uv tool install "notebooklm-py[browser]" or the equivalent pipx
command; for application code, use the user's active project environment.
For unattended or headless work, prefer durable profile-backed master-token auth over a copied
cookie snapshot. Install pip install "notebooklm-py[headless]"; the one-time automatic OAuth
capture also needs [browser]. On a trusted workstation run
notebooklm login --master-token --account <email>, then deploy master_token.json, not
storage_state.json, to the selected profile. NOTEBOOKLM_HOME selects the private base directory
and NOTEBOOKLM_PROFILE selects its profile; defaults resolve to
~/.notebooklm/profiles/default/master_token.json.
In CI, NOTEBOOKLM_MASTER_TOKEN_JSON is a secret-transport convention, not an environment variable
the package reads directly. Write its exact value to the selected profile's master_token.json
with mode 0600, unset it, then run notebooklm auth refresh to mint storage_state.json. A
sibling master token can automatically re-mint expired file-backed cookies. Inline
NOTEBOOKLM_AUTH_JSON is only a short-lived fallback; it bypasses this recovery path.
Use PyPI or a release tag, not an unreleased main checkout. When available, consult the
installation guide.
Before a workflow, verify real authentication rather than merely parsing the cookie file:
notebooklm auth check --test --jsonRequire .status == "ok" and .checks.token_fetch == true. If validation fails:
notebooklm login and validate again.[cookies] and use
notebooklm login --browser-cookies <browser>. Use
notebooklm auth inspect --browser <browser> first when account selection is unclear.notebooklm auth refresh; use
notebooklm auth refresh --browser-cookies <browser> after signing back into the browser.The normal --test preflight may heal and persist refreshed cookies. Add --passive when the
check must be strictly read-only, including the failure-diagnosis workflow below.
notebooklm status reports selected-notebook context, not authentication.
Treat both auth files as bearer credentials: never print, log, or commit them. A master token is a
durable full-account credential that survives password changes; use a dedicated account, protect
it in a secret store and as 0600 on disk, and explicitly revoke it if exposed.
--json for discovery and mutations, then retain the returned full UUIDs. Important
envelopes are .notebook.id from create, .source.id from source add, and .task_id from
asynchronous generators. generate mind-map instead returns mind_map, note_id, and kind;
both kinds return a finished result with no task ID or separate artifact wait step.-n/--notebook <id> on every notebook-scoped command in automation or concurrent work.
Do not rely on notebooklm use. For every concurrent run, also set a unique
NOTEBOOKLM_PROFILE=agent-<id> so context and profile writes are isolated. A new profile has no
credentials: put a master_token.json copy in that profile and mint its storage before use.
Never share one writable storage_state.json across agents..source.id, then run source wait for each before chat or
generation. The add envelope has no status. Require wait exit 0 and status == "ready"; let the
waiter handle media-specific transient error rows.artifact wait with -n <notebook_id>. Download that exact artifact with
-a <artifact_id> -n <notebook_id>; never select the latest visible artifact. Mind-map generation
returns its completed result directly and does not need artifact wait.--run-id <research_run_id>.Safe inspection and explicitly requested creation, source addition, chat, and prompt suggestion can run directly. Diagnose failures with read-only commands before attempting recovery.
Obtain confirmation immediately before an action when it was not already clearly authorized:
ask --new;language set, because the default mode changes the account-global output language (prefer a
generation command's --language override);research wait --import-all, which imports sources;ask --save-as-note and history --save, which create notes.User intent, not the presence of a CLI prompt, is the authorization boundary. After authorization,
pass --yes/-y where supported. Most destructive JSON commands refuse to prompt without it, but
some, including ask --new --json and share remove --json, execute without prompting. Never
treat prompt absence as consent.
research cancel is fire-and-forget. After an authorized cancellation, verify the exact run with
notebooklm research status -n <notebook_id> --run-id <research_run_id> --json.
Use the installed CLI's help as the version-matched source of truth instead of guessing flags:
notebooklm --help
notebooklm source --help
notebooklm research --help
notebooklm generate --help
notebooklm artifact --help
notebooklm download --helpAlso inspect notebooklm --version and drill down to the exact command, such as
notebooklm generate audio --help, whenever its help differs from this skill.
Common operations:
| Goal | Command |
|---|---|
| Check compute usage | notebooklm usage --json; notebooklm usage --categories for category availability and estimated costs |
| List or create notebooks | notebooklm list --json; notebooklm create "Title" --json |
| Add and wait for a source | notebooklm source add <input> -n <nb> --json; notebooklm source wait <src> -n <nb> |
| URL recovery | notebooklm source add <url> --fallback-fetch |
| Chat | notebooklm ask "question" -n <nb> --json |
| Research | notebooklm source add-research "query" -n <nb> --mode fast --json (deep is also supported) |
| List or wait for artifacts | notebooklm artifact list -n <nb> --json; notebooklm artifact wait <id> -n <nb> |
| Generate | notebooklm generate <type> ... -n <nb> --json |
| Download | notebooklm download <type> <path> -n <nb> -a <artifact> |
For the full surface, consult the installed command help or, when available, the CLI reference. For application code, use the baseline below and, when available, the Python API guide.
Keep {notebook_id}, every {source_id}, and {artifact_id} from JSON output:
An explicit request for this completed workflow authorizes its normal prerequisite waits, requested generation, and requested output file. Confirm only work not already authorized by that request.
notebooklm create "Research: topic" --jsonnotebooklm source add <input> -n {notebook_id} --json for each input.notebooklm source wait {source_id} -n {notebook_id} --timeout 600 for every captured source.notebooklm generate audio "instructions" -n {notebook_id} -s {source_id} --json.
Repeat -s for each selected source and capture .task_id as {artifact_id}.notebooklm artifact wait {artifact_id} -n {notebook_id} --timeout 1200.notebooklm download audio ./podcast.m4a -a {artifact_id} -n {notebook_id}.For analysis without generation, replace steps 4-6 with an ID-pinned chat command only after every source is ready:
notebooklm ask "Summarize the key arguments" -n {notebook_id} --jsonDeep research can take 15-30+ minutes. Start it non-blocking and retain
.poll_task_id // .task_id as {research_run_id}:
notebooklm source add-research "query" -n {notebook_id} --mode deep --no-wait --jsonImport only after explicit authorization, pinning both IDs:
notebooklm research wait -n {notebook_id} --run-id {research_run_id} \
--import-all --timeout 1800 --jsonWith --import-all, --timeout is a per-phase budget for polling and import retry, so this example
can consume roughly 3600 seconds of host wall time.
Retain newly created source IDs from .imported_sources[].id and wait for readiness before later
chat or generation.
When the full API guide is unavailable, use the installed typed API and its docstrings; do not guess method names. Keep the same IDs and readiness gates as the CLI workflow:
import asyncio
from notebooklm import NotebookLMClient
async def main(url: str) -> None:
async with NotebookLMClient.from_storage() as client:
notebook = await client.notebooks.create("Research: topic")
source = await client.sources.add_url(notebook.id, url)
await client.sources.wait_until_ready(notebook.id, source.id, timeout=600)
answer = await client.chat.ask(
notebook.id, "Summarize the key arguments", source_ids=[source.id]
)
print(answer.answer)
task = await client.artifacts.generate_audio(
notebook.id,
source_ids=[source.id],
instructions="Focus on the key arguments",
)
final = await client.artifacts.wait_for_completion(notebook.id, task.task_id, timeout=1200)
if not final.is_complete:
raise RuntimeError(f"Generation ended with {final.status}: {final.error}")
await client.artifacts.download_audio(
notebook.id, "./podcast.m4a", artifact_id=task.task_id
)
asyncio.run(main("https://example.com"))NotebookLMClient.from_storage() is an async context manager and is not awaited. A client is
re-entrant on one event loop but is not thread-safe; create one client per loop. Public namespaces
include notebooks, sources, chat, research, artifacts, mind_maps, notes, settings,
sharing, labels, and collections. Apply the authorization boundaries above before running
state-changing, long-running, or file-writing calls.
Available generators include audio, video, slide-deck, infographic, report, mind-map,
data-table, quiz, and flashcards. Inspect notebooklm generate <type> --help because formats,
styles, source selection, language, and retry support vary by type.
Keep these non-obvious distinctions:
--kind interactive, default) is an asynchronous studio artifact internally, but the
CLI polls it to completion and returns {mind_map, note_id, kind}; do not run artifact wait.--kind note-backed) is server-synchronous. Both kinds accept --instructions;
interactive applies it reliably, while the server may ignore it for note-backed maps.generate video --format cinematic ignores --style, requires Google AI Ultra, and can take
roughly 30-40 minutes.9:16 portrait); slide revision cannot change the deck's orientation.--format custom;
--append applies only to built-in report formats.For prompts too long or awkward for shell quoting, use --prompt-file PATH on ask,
source add-research, and supported generators. It contains prompt text; upload source documents
with source add instead.
Use JSON structurally rather than parsing human output. Common lifecycle values are:
unknown/preparing/processing -> ready or error; proceed only on ready;pending/in_progress -> completed, failed, or removed; not_found may be a
brief listing lag. Proceed or download only on completed.Chat JSON includes answer, conversation_id, and references[].source_id. A reference's
start_char/end_char are UTF-16 offsets into the structured source document, not flat
SourceFulltext.content. In Python, use
from notebooklm import resolve_chat_reference_passage, then call
await resolve_chat_reference_passage(client, notebook_id, reference); it uses the exact document
range and falls back to find_citation_context() when necessary.
On failure, run safe read-only diagnosis first:
notebooklm auth check --test --passive --json
notebooklm list --json
notebooklm source list -n {notebook_id} --json
notebooklm artifact list -n {notebook_id} --json
notebooklm research status -n {notebook_id} --run-id {research_run_id} --jsonInspect only the commands relevant to the failed workflow. Do not mutate state during diagnosis.
source wait timeout uses exit 2;
artifact wait and research wait timeouts use exit 1.{error, code, message}, while wait
commands return domain envelopes such as {"status": "timeout", "error": "..."}.checks.token_fetch; log in only if it is not true.notebooklm artifact retry <artifact_id> -n {notebook_id} --help before retrying in place.Keep progress updates brief and include the relevant returned ID. Never expose credential contents.
If this file is already inside an agent skill directory, the skill itself is installed. Otherwise:
notebooklm skill install installs or updates supported local skill targets.notebooklm skill package builds an uploadable archive for sandboxed agent environments.notebooklm skill status --json reports installed versions and content_mismatch.© teng-lin, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2,331 other files (scripts) in the repository root of teng-lin/notebooklm-py.
Open the folder on GitHubat commit 1d8920f
NotebookLM Automation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| NotebookLM Automation this skillteng-lin/notebooklm-py | 20k | — | ~4.1k | Automated safety check: Pass | MIT | |
| NotebookLM Research AssistantPleasePrompto/notebooklm-skill | 7.8k | 14 repos | ~2.4k | Automated safety check: Notes | MIT | |
| Cninfo To Notebooklmjarodise/CNinfo2Notebookllm | 363 | — | ~1.1k | Automated safety check: Pass | None | |
| Notebooklmroomi-fields/notebooklm-mcp | 191 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Notebooklmsanjay3290/ai-skills | 431 | — | ~655 | Automated safety check: Pass | Apache-2.0 | |
| Zlibrary To Notebooklmzstmfhy/zlibrary-to-notebooklm | 1.7k | 1 repos | ~968 | Automated safety check: Pass | MIT |
PleasePrompto/notebooklm-skill
Lets Claude Code ask questions of your Google NotebookLM notebooks through browser automation and return answers grounded in your uploaded sources.
jarodise/CNinfo2Notebookllm
A skill your agent uses when user wants to analyze China stock reports (A-share or Hong Kong), upload annual/quarterly reports to NotebookLM, or research a Chinese listed company's financials
roomi-fields/notebooklm-mcp
This skill should be used when the user wants to query their Google NotebookLM notebooks for citation-backed, source-grounded answers, or manage notebooks, sources, and Studio content (audio…
sanjay3290/ai-skills
Query and manage Google NotebookLM notebooks with persistent profile auth, source sync, batch/multi queries, and structured exports.
zstmfhy/zlibrary-to-notebooklm
自动从 Z-Library 下载书籍并上传到 Google NotebookLM。支持 PDF/EPUB 格式,自动转换,一键创建知识库。
joeseesun/qiaomu-anything-to-notebooklm
Collects content from WeChat articles, web pages, YouTube, podcasts, documents and more, uploads it to NotebookLM and generates podcasts, slides or mind maps.
Works with
Installs, authenticates and operates Gemini Notebook (NotebookLM) through the notebooklm-py CLI or its typed async Python API, for notebooks, sources, grounded chat and generated artifacts. The skill prefers the notebooklm CLI for agent workflows, with --json output and explicit IDs so every operation can be inspected and run safely under concurrency. The typed async Python API is used only when you ask for application code or the CLI cannot express the workflow.
NotebookLM Automation fits situations like: installing and signing in to notebooklm-py; adding sources to a notebook and chatting with them; generating or downloading notebook artifacts from a script; running Gemini Notebook jobs unattended in CI.
Run `npx skills add teng-lin/notebooklm-py --skill notebooklm -a claude-code`. Or copy the skill folder (the teng-lin/notebooklm-py repository) into .claude/skills/notebooklm in your project. Claude Code loads it when a task matches its description.
Run `npx skills add teng-lin/notebooklm-py --skill notebooklm -a codex`. Or copy the skill folder (the teng-lin/notebooklm-py repository) into .agents/skills/notebooklm in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add teng-lin/notebooklm-py --skill notebooklm -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/notebooklm, .gemini/skills/notebooklm, .github/skills/notebooklm and .opencode/skills/notebooklm in your project.
Going by SKILL.md and its folder, NotebookLM Automation needs the command-line tools its instructions call (pip and uv). Our summary lists: Python 3.10 or newer; The notebooklm-py package; A signed-in Gemini Notebook account.
SKILL.md contains no URLs. Its commands use pip and uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
NotebookLM Automation is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with NotebookLM Automation: NotebookLM Research Assistant (PleasePrompto/notebooklm-skill, 7.8k stars), Cninfo To Notebooklm (jarodise/CNinfo2Notebookllm, 363 stars), Notebooklm (roomi-fields/notebooklm-mcp, 191 stars) and Notebooklm (sanjay3290/ai-skills, 431 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
teng-lin (a GitHub user) maintains it in teng-lin/notebooklm-py, which has 19,659 GitHub stars. The repository was last updated on October 7, 2026.
Source: teng-lin/notebooklm-py on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.