Manages Google NotebookLM notebooks: query content, add/list/search/remove, enable/disable. Activates on NotebookLM URLs or mentions for knowledge base queries.
From notebooklm-connectornpx claudepluginhub leejuoh/claude-code-zero --plugin notebooklm-connectorThis skill is limited to using the following tools:
references/commands.mdreferences/gotchas.mdreferences/schemas.mdDesigns and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Implements structured self-debugging workflow for AI agent failures: capture errors, diagnose patterns like loops or context overflow, apply contained recoveries, and generate introspection reports.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
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__*)