Help us improve
Share bugs, ideas, or general feedback.
From notebooklm-connector
Manages Google NotebookLM notebooks: query content, add/list/search/remove, enable/disable. Activates on NotebookLM URLs or mentions for knowledge base queries.
npx claudepluginhub leejuoh/claude-code-zero --plugin notebooklm-connectorHow this skill is triggered — by the user, by Claude, or both
Slash command
/notebooklm-connector:notebooklm-managerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Query orchestration and notebook registry management.
Queries Google NotebookLM notebooks for source-grounded, citation-backed Gemini answers. Manages auth, adds/lists notebooks via Python scripts with browser automation.
Queries Google NotebookLM notebooks for source-grounded, citation-backed Gemini answers via browser automation. Manages authentication, libraries, and persistent sessions for document-only responses.
Queries Google NotebookLM notebooks using Gemini for source-grounded answers from uploaded documents. Manages authentication, adds notebooks, and lists library via Python scripts.
Share bugs, ideas, or general feedback.
Query orchestration and notebook registry management.
Chrome MCP tools (mcp__claude-in-chrome__*) aren't in this skill's allowed tool set — calling them directly will error. All browser interaction goes through the chrome-mcp-query agent via Task. If the agent returns an error, don't attempt Chrome tools yourself.
Read ~/.claude-code-zero/notebooklm-connector/data-path to obtain DATA_DIR.
The PreToolUse hook automatically detects install scope (project vs user) and writes the correct path.
{DATA_DIR} and use it for ALL subsequent file operations.Read {DATA_DIR}/config.json for user preferences:
max_followups: Maximum follow-up queries in coverage analysis (default: 3)max_query_length: Maximum characters per query sent to NotebookLM (default: 40000)language: Preferred response language (null = match user's language)auto_coverage: Enable automatic coverage analysis (default: true)If the file is missing or a field is absent, use defaults above.
Extract from user message:
notebook_id: Which notebook (e.g., "claude-docs")question: What to askRead {DATA_DIR}/library.json to find notebook URL.
Default: clearHistory: false (keep previous context).
Set clearHistory: true only when the user explicitly requests it
(e.g., "clear history and query…", "start fresh on this notebook").
NotebookLM has a server-side character limit on chat input (~45,000–50,000 chars). There is no client-side enforcement — the textarea accepts any length, but the backend silently fails to respond beyond the limit, leaving the agent stuck in a polling loop.
Read max_query_length from config (default: 40000).
If question.length > max_query_length:
Task({
subagent_type: "notebooklm-connector:chrome-mcp-query",
prompt: `Execute the workflow: Input parsing → Tab setup → Title extraction → Submit question → Poll response → Output and exit
URL: {url}
Question: {question}
clearHistory: {true/false}
Output the response immediately upon receiving it and exit.`
})
Follow-up queries use the same Task format with the follow-up question. The agent's STEP 1 automatically reuses the existing tab for the same URL.
After Task returns, check the agent output:
| Agent Output Contains | Action |
|---|---|
ERROR_TYPE: CHROME_NOT_CONNECTED | Show Chrome Connection Troubleshooting (below), stop |
ERROR_TYPE: AUTH_REQUIRED | Tell user to log in to Google in Chrome, stop |
ERROR_TYPE: (any other) | Show error details from agent output, stop |
| Task tool itself errors | Inform user the agent could not start. Check plugin installation. |
truncated: true in agent output | Present the response but warn user that NotebookLM truncated the input. Suggest shortening the query or increasing max_query_length in config. |
| Response is empty or very short (< 20 chars) | Inform user that NotebookLM returned no meaningful response. Likely causes: input too long, no relevant content in notebook, or backend timeout. Do NOT proceed to coverage analysis. |
| Normal response (no ERROR_TYPE, ≥ 20 chars) | Proceed to Section 5 |
Chrome Connection Troubleshooting (show to user):
chrome://extensions → Ensure "Claude in Chrome" extension is enabled/chrome → Select "Reconnect extension"NotebookLM frequently answers only the first part of multi-topic questions. Without this check, users get incomplete answers and need to re-query manually.
If auto_coverage is false in config, skip to Section 6.
After every successful Task(chrome-mcp-query) return, check coverage before presenting the answer.
The PostToolUse hook will also remind you via COVERAGE_REMINDER.
Re-read user's original message. List ALL keywords/topics.
Each keyword: ✅ covered / ❌ missing
Launch follow-up: Task(subagent_type: "notebooklm-connector:chrome-mcp-query", same URL, missing topic question)
Follow-ups are cheap — the same Chrome tab is reused.
Then return to STEP A.
All covered OR max_followups reached → Synthesize and present (Section 6 format).
After limit: AskUserQuestion to confirm whether to continue.
**Notebook**: [Title] (`{id}`)
**Answer**: [response]
---
**Suggested follow-ups**:
- [question 1]
- [question 2]
If language is set in config, present the answer in that language.
See references/commands.md for full command reference.
| Command | Description |
|---|---|
list | Show active notebooks |
add <url> | Smart add (auto-discover) |
show <id> | Notebook details |
search <query> | Find notebooks |
Data is isolated per install scope. The hook resolves the correct path automatically.
When ${CLAUDE_PLUGIN_DATA} is available, it is used as the base directory.
Otherwise falls back to ~/.claude-code-zero/notebooklm-connector/.
{base}/
├── data-path # Always at ~/.claude-code-zero/notebooklm-connector/data-path
├── global/data/ # User-level install (shared across projects)
│ ├── library.json
│ ├── archive.json
│ ├── config.json
│ └── notebooks/{id}.json
└── projects/<md5-hash>/data/ # Project-level install (per-project isolation)
├── library.json
├── archive.json
├── config.json
└── notebooks/{id}.json
The data-path file is always at ~/.claude-code-zero/notebooklm-connector/data-path (fixed location).
Data directory and default files are lazily created on first data-path read.
Migration (automatic):
data/ → global/data/: Existing flat data layout is moved to the global subdirectory.~/.claude/plugins/..., ~/.claude/claude-code-zero/...) are copied to global/data/.~/.claude-code-zero/ → ${CLAUDE_PLUGIN_DATA}/: When the env var becomes available, data is migrated.mcp__claude-in-chrome__*)