From smart-blog-skills
Queries Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents. Manages notebook library and handles Google authentication.
How this skill is triggered — by the user, by Claude, or both
Slash command
/smart-blog-skills:notebooklm [ask|discover|library|setup|status|cleanup] [question-or-url][ask|discover|library|setup|status|cleanup] [question-or-url]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Query Google NotebookLM notebooks directly from Claude Code for citation-backed
Query Google NotebookLM notebooks directly from Claude Code for citation-backed answers from Gemini. Each question opens a headless browser session, retrieves the answer exclusively from your uploaded documents, and closes. Responses are Tier 1 quality (user's own primary sources) -- zero hallucination risk. Answers satisfy the FLOW evidence triple: use the returned source title as the inline citation and the notebook URL plus retrieval date as the bibliography entry.
| Command | What it does |
|---|---|
/smart-blog-skills:notebooklm ask <question> | Query a notebook for source-grounded answers |
/smart-blog-skills:notebooklm discover <url> | Smart-discover notebook content before cataloging |
/smart-blog-skills:notebooklm library list | List all notebooks in library |
/smart-blog-skills:notebooklm library add <url> | Add a notebook to library |
/smart-blog-skills:notebooklm library search <query> | Search notebooks by keyword |
/smart-blog-skills:notebooklm library remove <id> | Remove a notebook from library |
/smart-blog-skills:notebooklm setup | One-time Google authentication (browser visible) |
/smart-blog-skills:notebooklm status | Check authentication status |
/smart-blog-skills:notebooklm cleanup | Clean browser state (preserves library) |
run.py)NEVER call scripts directly. ALWAYS use python3 scripts/run.py [script]:
# CORRECT:
python3 scripts/run.py auth_manager.py status
python3 scripts/run.py ask_question.py --question "..."
# WRONG -- fails without venv:
python3 scripts/auth_manager.py status
Before any query operation, check authentication:
python3 scripts/run.py auth_manager.py status
/smart-blog-skills:notebooklm setup to authenticate."For /smart-blog-skills: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
For /smart-blog-skills:notebooklm ask <question>:
Run auth check (see gate pattern above). If not authenticated, guide to setup.
Determine which notebook to query:
--notebook-url provided: use directly--notebook-id provided: look up in library# 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
Every response ends with a follow-up prompt. Required behavior:
For /smart-blog-skills: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>"
NEVER guess or use generic descriptions. Always discover or ask the user.
# 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
All data stored inside the skill directory:
scripts/data/library.json -- Notebook metadata and libraryscripts/data/auth_info.json -- Authentication statusscripts/data/browser_state/ -- Chrome profile with cookiesSecurity: All data directories are gitignored. Never commit auth or browser state.
| Error | Resolution |
|---|---|
| Not authenticated | Run /smart-blog-skills:notebooklm setup |
| ModuleNotFoundError | Always use run.py wrapper |
| Browser crash | cleanup_manager.py --confirm --preserve-library, then re-auth |
| Rate limit (50/day) | Wait until midnight PST or switch Google account |
| Notebook not found | Check 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 |
npx claudepluginhub rainday/smart-blog-skills --plugin smart-blog-skillsQueries Google NotebookLM from Claude Code for citation-backed answers from user-uploaded documents. Manages notebook library and Google auth. Used standalone or by blog-write/blog-researcher for Tier 1 research data.
Queries Google NotebookLM notebooks from Claude Code via browser automation. Returns Gemini-generated answers grounded only in uploaded documents, reducing hallucinations.
Queries Google NotebookLM notebooks from Claude Code for source-grounded, citation-backed answers via Gemini. Includes browser automation, library management, and persistent auth.