NotebookLM MCP Skill
Access Google NotebookLM from Claude Code with a single consistent interface, regardless of which underlying path is live this session. Wraps the notebooklm-mcp-cli MCP, the Claude-in-Chrome browser route, and the Playwright uploader.
Operating contract
- Zero Assumption Mandate: never auto-select a notebook. If the user has not named the target notebook, STOP and ask: "Which notebook should I use for this?"
- 100 Percent Confidence Loop: clear Architecture, Evidence, and Intent doubts before any query.
- Trinity Dialectic gate: every synthesized answer scores Logos (evidence), Pathos (intent), and Ethos (alignment) before it is presented. A global score below threshold loops back for revision.
- Always cite the notebook by name and UUID when synthesizing output.
- Always log the query and sanitized payload in the session log for the day.
Status block (update each session)
MCP server: <loaded | not loaded -- using Path B>
MCP version: <x.y.z>
Auth status: <current | EXPIRED -- run "nlm login" before any notebook call>
Active path: <A | B | C>
Access paths, in preference order
Path A, notebooklm-mcp-cli (preferred when loaded)
Package: notebooklm-mcp-cli (upstream github.com/jacob-bd/notebooklm-mcp-cli).
Transport: stdio. Registered in ~/.claude.json. 35 tools prefixed
mcp__notebooklm-mcp__*.
Binary location (Windows): C:\Users\<local-username>\.local\bin\notebooklm-mcp.EXE
Core tools:
mcp__notebooklm-mcp__server_info-- confirm server is live, return version.mcp__notebooklm-mcp__notebook_list-- list every notebook visible to the authenticated account.mcp__notebooklm-mcp__notebook_query-- query a specific notebook.mcp__notebooklm-mcp__source_add,notebook_get,search_notebooks-- depending on session allowlist.
Check presence with ToolSearch select:mcp__notebooklm-mcp__server_info. If the
search returns a schema, the MCP is loaded. If not, fall back to Path B.
Auth: nlm.EXE (Google OAuth). Account-scoped. Re-run nlm login after auth expiry
or when switching Google accounts.
Path B, Claude in Chrome against notebooklm.google.com
When the MCP is not loaded this session. Uses mcp__Claude_in_Chrome__* tools
(navigate, get_page_text, javascript_tool, read_console_messages, read_page).
Recipe:
mcp__Claude_in_Chrome__navigateto the notebook URL the user named.mcp__Claude_in_Chrome__get_page_textto extract the current panel.mcp__Claude_in_Chrome__javascript_toolto post a chat query into the notebook's chat surface (inspect the DOM first; selectors drift).- Wait for response,
get_page_textagain, extract. - Zero-Context Reviewer sanitize the payload (strip conversational filler, formatting noise) before passing it to the main context.
Never run headless. Inherits the logged-in Chrome session.
Path C, Playwright uploader fallback
Script: <project-root>/notebooklm_uploader.py (see notebooklm-batch-uploader).
Use: bulk source injection (adding books or markdown to notebooks at scale), not
for single-query grounding. Requires pip install playwright and
playwright install chromium. Uses channel="chrome" and headless=False.
Canonical workflow
- Target verification. Did the user name the notebook? If not, STOP and ask.
- Access path probe. ToolSearch for MCP tool schema. If missing, use Path B.
- Confidence loop. Three questions: target identity, expected evidence type, use of the evidence downstream.
- Query. Path A or Path B. Record the exact prompt, session ID, notebook ID in a session log.
- Sanitize. Zero-Context Reviewer scavenge pass on the returned payload.
- Synthesize. Answer with citations back to the notebook source.
- Trinity Dialectic. Logos (evidence quality), Pathos (intent alignment), Ethos (no hallucination). Below threshold: loop back, revise.
- Log. Append a row to today's session log.
Session log template
Append to session_logs/session_log_YYYY-MM-DD.md:
## Entry [N]
- **Notebook (named by user):** [name + UUID]
- **Query:** [verbatim text passed]
- **Session ID:** [from MCP or "browser-{date}-{n}" for Path B]
- **Raw payload (ZCR sanitized):** [stripped content]
- **Trinity scores:** Logos=[0-5] Pathos=[0-5] Ethos=[0-5] -> [PROCEED | LOOP_BACK]
- **Gaps / follow-ups:** [list]
Must do
- Always ask which notebook to query when unspecified.
- Always cite the notebook by name and UUID when synthesizing.
- Always log the query plus sanitized payload in the session log for the day.
- Always Trinity-gate the synthesis before replying.
- Always reuse an existing session ID if continuing a thread in the same notebook on the same day.
Must NOT do
- Never auto-select a notebook.
- Never fabricate notebook IDs, UUIDs, or content.
- Never bypass the Trinity Dialectic gate on synthesized output.
- Never write raw unsanitized MCP output to long-term memory. Stage in a scratch/research directory first; promote only after review.
Trigger phrases (non-exhaustive)
"query notebook", "ask notebooklm", "search notebooks", "list notebooks", "notebooklm server info", "get notebook", "inject source into notebook", "what did notebooklm say about", "cite from notebooklm", "pull evidence from", "grounding from notebook", "add source to notebook".
Verification checklist before use
- Access path probed this session? (ToolSearch
select:mcp__notebooklm-mcp__server_info) - User named the notebook?
- Session log for today exists or is about to be created?
- Auth confirmed current? (run
nlm loginif expired)
References
- Upstream MCP:
github.com/jacob-bd/notebooklm-mcp-cli - Batch uploader:
notebooklm-batch-uploader(sibling repo) - Book organizer:
notebooklm-book-organizer(sibling repo) - Research protocol:
notebooklm-research-protocol(sibling repo)