# Notebooklm MCP

> Query, inspect, and manage Google NotebookLM notebooks from Claude Code. Trigger whenever the user says "query notebook", "ask notebooklm", "search notebooks", "list notebooks", "notebooklm server info", "get notebook", "inject source into notebook", "what did notebooklm say about", or any request to pull evidence from a named NotebookLM notebook as grounding for an artifact. Covers three access paths: (1) the mcp__notebooklm-mcp__* MCP tool surface (35 tools) when the stdio server is loaded, (2) a Claude-in-Chrome browser route against notebooklm.google.com when the MCP is unavailable, (3) a Playwright fallback using notebooklm_uploader.py for bulk source injection. Always ask the user which notebook to query before any call. Never auto-select. Never fabricate notebook IDs or contents. Every query runs through the 100 Percent Confidence Loop and every synthesized answer passes the Trinity Dialectic gate.

- Skill: `0sxd/notebooklm-mcp` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add 0sxd/notebooklm-mcp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/0sxd/notebooklm-mcp/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: 0SxD (https://skillmd.com/u/0sxd)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/0sxd/notebooklm-mcp

---


# 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:
1. `mcp__Claude_in_Chrome__navigate` to the notebook URL the user named.
2. `mcp__Claude_in_Chrome__get_page_text` to extract the current panel.
3. `mcp__Claude_in_Chrome__javascript_tool` to post a chat query into the
   notebook's chat surface (inspect the DOM first; selectors drift).
4. Wait for response, `get_page_text` again, extract.
5. 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

1. **Target verification.** Did the user name the notebook? If not, STOP and ask.
2. **Access path probe.** ToolSearch for MCP tool schema. If missing, use Path B.
3. **Confidence loop.** Three questions: target identity, expected evidence type,
   use of the evidence downstream.
4. **Query.** Path A or Path B. Record the exact prompt, session ID, notebook ID
   in a session log.
5. **Sanitize.** Zero-Context Reviewer scavenge pass on the returned payload.
6. **Synthesize.** Answer with citations back to the notebook source.
7. **Trinity Dialectic.** Logos (evidence quality), Pathos (intent alignment),
   Ethos (no hallucination). Below threshold: loop back, revise.
8. **Log.** Append a row to today's session log.

## Session log template

Append to `session_logs/session_log_YYYY-MM-DD.md`:

```markdown
## 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 login` if 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)

