PluginBench
Skill
Review
Audit score 70

blog-notebooklm

agricidaniel/claude-blog

Query Google NotebookLM notebooks for citation-backed answers from your uploaded documents.

What is blog-notebooklm?

Query Google NotebookLM notebooks directly from Claude Code to get source-grounded, citation-backed answers from documents you've uploaded. Use this when you need research answers tied to specific sources, want to manage a library of notebooks, or need to integrate document-based research into blog writing workflows.

  • Query notebooks with natural-language questions and receive answers with source citations
  • Manage a library of NotebookLM notebooks with search, add, remove, and activate operations
  • Discover notebook content before cataloging to auto-generate metadata
  • Integrate source-grounded research into blog-write and blog-researcher workflows
  • Handle Google authentication with one-time setup and graceful fallback when not configured
  • Support follow-up questioning to fill gaps and synthesize complete answers

How to install blog-notebooklm

npx skills add https://github.com/agricidaniel/claude-blog --skill blog-notebooklm
Prerequisites
  • Google account with NotebookLM access
  • Python 3.11 or later
  • Google Chrome (installed automatically on first run)
  • One-time interactive Google authentication via browser
Claude Code
Cursor
Windsurf
Cline

How to use blog-notebooklm

  1. 1.Run `/blog notebooklm setup` to authenticate with your Google account (opens browser for login)
  2. 2.Run `/blog notebooklm library list` to see existing notebooks or `/blog notebooklm library add <url>` to add a new one
  3. 3.Run `/blog notebooklm ask <question>` to query the active notebook; the skill will ask follow-up questions if gaps remain
  4. 4.Use `/blog notebooklm discover <url>` to preview notebook content before adding it to your library
  5. 5.Run `/blog notebooklm status` to verify authentication at any time

Use cases

Good for
  • Research a topic across multiple uploaded documents and get cited answers for blog posts
  • Build a searchable library of research notebooks organized by topic
  • Verify claims in draft blog content against primary or secondary source documents
  • Integrate document-based fact-checking into an automated blog writing pipeline
  • Query specialized notebooks (e.g., academic papers, industry reports) for specific research questions
Who it's for
  • Researchers and journalists writing source-grounded content
  • Blog writers who want to cite uploaded documents in posts
  • Teams managing a shared library of research notebooks
  • Content creators integrating fact-checking into workflows

blog-notebooklm FAQ

Do I need to set up authentication every time?

No. Authentication is one-time via `/blog notebooklm setup`. It persists via browser profile and cookies. Use `/blog notebooklm status` to check, or `/blog notebooklm reauth` if needed.

Can I query multiple notebooks?

Yes. Set an active notebook with `/blog notebooklm library activate <id>`, or pass `--notebook-id` or `--notebook-url` to query a specific one without changing the active notebook.

What if I'm not authenticated when using this skill internally?

When called from blog-write or blog-researcher, the skill fails silently and returns no result, so your writing workflow is never blocked.

Are the answers from NotebookLM guaranteed to be accurate?

No. Answers are source-grounded model responses based on your uploaded documents, but they may omit context or misinterpret sources. Always verify citations against the underlying source document.

How do I add a notebook without knowing its content?

Use `/blog notebooklm discover <url>` to query the notebook for a content overview, then add it with the discovered metadata.

Full instructions (SKILL.md)

Source of truth, from agricidaniel/claude-blog.


name: blog-notebooklm description: > Query Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents. Manages notebook library, handles Google authentication, and supports smart discovery. Works standalone via /blog notebooklm or internally from blog-write and blog-researcher for source-grounded research context. Falls back gracefully when not configured. Use when user says "notebooklm", "notebook", "query notebook", "ask notebook", "notebook research", "source grounded research", "document query", "notebook library". user-invokable: true argument-hint: "[ask|discover|library|setup|status|cleanup] [question-or-url]" license: MIT metadata: author: AgriciDaniel version: "2.2.0" source: "https://github.com/PleasePrompto/notebooklm-skill"

Blog NotebookLM: Source-Grounded Research from Your Documents

Query Google NotebookLM notebooks directly from Claude Code for citation-backed answers from Gemini. Each question opens a headless browser session, retrieves the answer from your uploaded documents, and closes. Responses are source-grounded model answers, not proof of truth: uploaded documents may be primary or secondary, and the answer can still omit context.

Answers provide usable provenance only when the returned citation identifies a verifiable underlying source. Record a stable source URL and a publication, study-period, or retrieval date when that detail affects verification or interpretation. Use the underlying source title as the inline citation. Do not cite the private NotebookLM URL as the bibliography entry for public content.

Quick Reference

CommandWhat it does
/blog notebooklm ask <question>Query a notebook for source-grounded answers
/blog notebooklm discover <url>Smart-discover notebook content before cataloging
/blog notebooklm library listList all notebooks in library
/blog notebooklm library add <url>Add a notebook to library
/blog notebooklm library search <query>Search notebooks by keyword
/blog notebooklm library remove <id>Remove a notebook from library
/blog notebooklm setupOne-time Google authentication (browser visible)
/blog notebooklm statusCheck authentication status
/blog notebooklm cleanupClean browser state (preserves library)

Prerequisites

  • Google account with NotebookLM access
  • Python 3.11+ (venv managed automatically by run.py)
  • Google Chrome (installed automatically on first run via Patchright)
  • One-time authentication setup (interactive Google login in visible browser)

Use the run.py Wrapper

Call scripts only through the run.py wrapper: python3 scripts/run.py [script]:

# CORRECT:
python3 scripts/run.py auth_manager.py status
python3 scripts/run.py ask_question.py --question "..."

# Do not call files under scripts/ directly. The wrapper owns venv setup.

The run.py wrapper automatically creates .venv, installs dependencies, sets up Chrome, and executes the target script.

Auth Check (Gate Pattern)

Before any query operation, check authentication:

python3 scripts/run.py auth_manager.py status
  • If authenticated: proceed with the query
  • If not authenticated: inform user and guide to setup: "NotebookLM requires Google login. Run /blog notebooklm setup to authenticate."
  • When called internally (from blog-write or blog-researcher): return silently with no error if not authenticated. Never block the writing workflow.

Setup Workflow

For /blog notebooklm setup:

# Opens a visible browser for manual Google login (one-time)
python3 scripts/run.py auth_manager.py setup

Tell the user: "A browser window will open. Please log in to your Google account." Authentication persists via browser profile + cookie injection (hybrid approach).

Other auth commands:

python3 scripts/run.py auth_manager.py status   # Check auth
python3 scripts/run.py auth_manager.py reauth   # Re-authenticate
python3 scripts/run.py auth_manager.py clear     # Clear all auth data

Query Workflow

For /blog notebooklm ask <question>:

Step 1: Check Auth

Run auth check (see gate pattern above). If not authenticated, guide to setup.

Step 2: Resolve Notebook

Determine which notebook to query:

  • If --notebook-url provided: validate it is a NotebookLM notebook URL, then use it
  • If --notebook-id provided: look up in library
  • If neither: use active notebook from library
  • If no active notebook: show library and ask user to select

Step 3: Ask the Question

# Basic query (uses active notebook)
python3 scripts/run.py ask_question.py --question "Your question here"

# Query specific notebook by ID
python3 scripts/run.py ask_question.py --question "..." --notebook-id notebook-id

# Query by URL directly
python3 scripts/run.py ask_question.py --question "..." --notebook-url "https://..."

# JSON output (for internal/programmatic use)
python3 scripts/run.py ask_question.py --question "..." --json

# Show browser for debugging
python3 scripts/run.py ask_question.py --question "..." --show-browser

Step 4: Analyze and Follow Up

Every response ends with a follow-up prompt. Required behavior:

  1. STOP: do not immediately respond to the user
  2. ANALYZE: compare the answer to the user's original request
  3. IDENTIFY GAPS: determine if more information is needed
  4. ASK FOLLOW-UP: if gaps exist, immediately ask a follow-up question
  5. REPEAT: continue until information is complete
  6. SYNTHESIZE: combine all answers before responding to the user

Smart Discovery Workflow

For /blog notebooklm discover <url>:

When adding a notebook without knowing its content, query it first:

# Step 1: Discover content
python3 scripts/run.py ask_question.py \
  --question "What is the content of this notebook? What topics are covered? Provide a complete overview briefly and concisely" \
  --notebook-url "<URL>"

# Step 2: Add with discovered metadata
python3 scripts/run.py notebook_manager.py add \
  --url "<URL>" \
  --name "<Based on content>" \
  --description "<Based on content>" \
  --topics "<Extracted topics>"

Do not guess descriptions; discover or ask the user.

Library Management

# List all notebooks
python3 scripts/run.py notebook_manager.py list

# Add notebook (all params required -- discover or ask user!)
python3 scripts/run.py notebook_manager.py add \
  --url "https://notebooklm.google.com/notebook/..." \
  --name "Descriptive Name" \
  --description "What this notebook contains" \
  --topics "topic1,topic2,topic3"

# Search by keyword
python3 scripts/run.py notebook_manager.py search --query "keyword"

# Set active notebook
python3 scripts/run.py notebook_manager.py activate --id notebook-id

# Remove notebook
python3 scripts/run.py notebook_manager.py remove --id notebook-id

# Library statistics
python3 scripts/run.py notebook_manager.py stats

Internal API (for blog-write / blog-researcher)

When invoked as a Task subagent from blog-write or blog-researcher:

Input (provided by calling skill):

  • question: Research question relevant to the blog topic
  • notebook_id or notebook_url: Which notebook to query
  • context: "internal" (signals graceful fallback mode)

Process:

  1. Check auth status: if not authenticated, return empty result silently
  2. Query the notebook with the research question
  3. Parse and return structured response

Output (returned to calling skill):

### NotebookLM Research
- **Source:** [Notebook name]
- **Question:** [What was asked]
- **Answer:** [Source-grounded response from user's documents]
- **Underlying Source:** [Public source URL or document identifier]
- **Underlying Source Date:** [Publication date or retrieval date]
- **Source Quality:** [Tier 1-3 after classifying the underlying document]

Graceful fallback: If auth is missing or query fails, return immediately with no error. The calling workflow continues with WebSearch-based research. Never block blog-write or blog-rewrite because NotebookLM is unavailable.

Data Storage

All data stored inside the skill directory:

  • data/library.json: Notebook metadata and library
  • data/auth_info.json: Authentication status
  • data/browser_state/: Chrome profile with cookies

Security: All data directories are gitignored. Never commit auth or browser state.

Browser lifecycle and authenticated-context isolation are centralized in scripts/browser_session.py. Command scripts must use that helper instead of opening an additional persistent profile or copying cookies into another file.

Error Handling

ErrorResolution
Not authenticatedRun /blog notebooklm setup
ModuleNotFoundErrorAlways use run.py wrapper
Browser crashcleanup_manager.py --confirm --preserve-library, then re-auth
Rate limit (50/day)Wait until midnight PST or switch Google account
Notebook not foundCheck with notebook_manager.py list
Query timeout (120s)Retry with simpler question or --show-browser to debug
MCP unavailable (internal)Return silently: writing workflow uses WebSearch

Limitations

  • No session persistence (each question = new browser session)
  • Rate limits on free Google accounts (50 queries/day)
  • Manual upload required (user must add docs to NotebookLM web UI)
  • Browser overhead (few seconds per question for launch + teardown)
  • Local Claude Code only (not available in web UI)

Reference Documentation

Load on-demand: do NOT load all at startup:

  • references/commands.md: Full CLI commands, parameters, and workflow patterns
  • references/troubleshooting.md: Error solutions, recovery procedures, debugging