Notebooklm Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Notebooklm Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Stop jumping between browser tabs. NotebookLM MCP brings the full analytical power of Google NotebookLM directly into your local terminal, IDE, and AI assistants like Claude, Cursor, and VS Code.
Manage notebooks, ingest diverse sources, trigger deep research, and generate studio-quality content—all via a single, standardized Model Context Protocol (MCP) interface.
New to MCP? The Model Context Protocol is a standard for connecting LLMs to external data sources and tools. This package speaks MCP over stdio — your AI client (Claude Desktop, Cursor, VS Code, etc.) spawns notebooklm-mcp serve as a subprocess and the two communicate over JSON-RPC. The 32 tools below become callable functions in the model's tool list.notebooklm-mcp auth. Our automated CDP-based flow handles secure cookie extraction so you can focus on your data.Run it instantly with npx:
npx -y @m4ykeldev/notebooklm-mcp serveOr install globally for better performance:
npm install -g @m4ykeldev/notebooklm-mcpDevelopers who want to hack on the source: this repo uses pnpm (pinned viapackageManagerinpackage.json). After cloning, runcorepack enable && pnpm install. See CONTRIBUTING.md on GitHub for the full dev / release flow.
Say goodbye to manual cookie hunting. Our smart auth flow does the heavy lifting for you.
notebooklm-mcp auth_A secure Chrome window will open. Simply log into your Google account, and we'll handle the rest. Your session is stored locally and securely._
Auth fallbacks if automated Chrome can't run:
notebooklm-mcp auth --manual # interactive copy/paste from your browser
notebooklm-mcp auth --file tokens.json # import a previously exported bundle
notebooklm-mcp auth --show-tokens # verify the cached sessionFor headless / CI environments, set NOTEBOOKLM_COOKIES (and optionally NOTEBOOKLM_CSRF_TOKEN, NOTEBOOKLM_SESSION_ID) instead of running the auth flow. Token resolution order: env var → ~/.notebooklm-mcp/auth.json → error.
Pick your client below — every section shows the config file path per OS, a minimal copy-paste block, and the advanced variant with --query-timeout and NOTEBOOKLM_COOKIES env override.
| Client | Config file | Format |
|---|---|---|
| Claude Desktop | claude_desktop_config.json | JSON |
| Claude Code (CLI) | ~/.claude.json or claude mcp add | JSON / CLI |
| Codex CLI | ~/.codex/config.toml | TOML |
| OpenAI Agents SDK (Python) | in-code | Python |
| OpenAI Agents SDK (TypeScript) | in-code | TypeScript |
| Gemini CLI | ~/.gemini/settings.json | JSON |
| Cursor | ~/.cursor/mcp.json | JSON |
| VS Code (Copilot Chat agent mode) | .vscode/mcp.json | JSON |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | JSON |
| JetBrains AI Assistant / Junie | ~/.junie/mcp/mcp.json | JSON |
| Zed | ~/.config/zed/settings.json | JSON |
| OpenCode (sst) | opencode.jsonc | JSONC |
| Cline (VS Code extension) | extension settings UI | JSON |
| Goose (Block) | ~/.config/goose/config.yaml | YAML |
| 5ire | in-app settings | GUI |
| Aider | not yet supported | — |
| Generic stdio caller | yours | — |
~/Library/Application Support/Claude/claude_desktop_config.json~/.config/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000", "--debug"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: restart Claude Desktop, click the hammer icon at the bottom-right of the input. Gotchas: absolute paths only; relative paths fail silently on startup.
</details>
Recommended path is the claude mcp add CLI (writes the JSON for you):
claude mcp add --transport stdio notebooklm -- npx -y @m4ykeldev/notebooklm-mcp serve<details><summary>Equivalent JSON (project scope, <code>./.mcp.json</code>)</summary>
{
"mcpServers": {
"notebooklm": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}</details>
<details><summary>With timeout + env override (CLI)</summary>
claude mcp add --transport stdio \
--env NOTEBOOKLM_COOKIES="SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." \
notebooklm -- npx -y @m4ykeldev/notebooklm-mcp serve --query-timeout 180000Verify: claude mcp list && claude mcp get notebooklm, or /mcp inside a session. Gotchas: all options before the server name; use -- to separate options from the command. Project-scoped .mcp.json needs interactive approval on first sight.
</details>
~/.codex/config.toml~/.config/codex/config.toml%APPDATA%\codex\config.toml[mcp_servers.notebooklm]
command = "npx"
args = ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]<details><summary>With timeout + env override</summary>
[mcp_servers.notebooklm]
command = "npx"
args = ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"]
env = { NOTEBOOKLM_COOKIES = "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." }Verify: codex --list-tools should list the NotebookLM tools. Gotchas: Codex CLI's MCP schema is still being formalized — double-check against the latest openai/codex README.
</details>
Wire it in code (no config file):
from agents.mcp import MCPServerStdio
async with MCPServerStdio(
name="NotebookLM",
params={
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
},
) as server:
tools = await server.list_tools()
print([t.name for t in tools]) # 32 tools<details><summary>With timeout + env override</summary>
async with MCPServerStdio(
name="NotebookLM",
params={
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."},
},
) as server:
...</details>
import { MCPServerStdio } from "@openai/agents";
const server = new MCPServerStdio({
command: "npx",
args: ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
});
await server.connect();
const tools = await server.listTools();
console.log(tools.map((t) => t.name)); // 32 tools<details><summary>With timeout + env override</summary>
const server = new MCPServerStdio({
command: "npx",
args: ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
env: { NOTEBOOKLM_COOKIES: "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." },
});</details>
~/.gemini/settings.json (user-global) or .gemini/settings.json (per-project).
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override (Gemini supports <code>$VAR</code> expansion)</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
"timeout": 180000,
"env": {
"NOTEBOOKLM_COOKIES": "$NOTEBOOKLM_COOKIES"
}
}
}
}Verify: gemini mcp list, or /mcp in a session. Gotchas: undefined $VAR resolves to empty string — pre-export them in your shell.
</details>
~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project)%APPDATA%\Cursor\mcp.json{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: Cursor Settings → MCP should show notebooklm in green, or MCP: View Server Status in the Command Palette. Gotchas: Cursor only loads MCP servers at startup — fully quit and relaunch after edits. Soft ~40-tool ceiling across all enabled servers combined.
</details>
.vscode/mcp.json (per-project). Top-level key is `servers` (not mcpServers — Microsoft renamed this).
{
"servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: Command Palette → MCP: Open User Configuration. Ask Copilot Chat in agent mode to list NotebookLM notebooks.
</details>
~/.codeium/windsurf/mcp_config.json%APPDATA%\Codeium\Windsurf\mcp_config.json{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override (uses Windsurf's <code>${env:VAR}</code> interpolation)</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "${env:NOTEBOOKLM_COOKIES}"
}
}
}
}Verify: open the Cascade sidebar → MCP settings → confirm notebooklm is active. Gotchas: prefer ${env:VAR} / ${file:/path} interpolation over inlining cookies; Windsurf substitutes at server-launch time so secrets stay out of the config file.
</details>
~/.junie/mcp/mcp.json (user-global) or .junie/mcp/mcp.json (per-project)%APPDATA%\JetBrains\Junie\mcp.json{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: Settings (Ctrl+Alt+S) → Tools → Junie → MCP Settings — notebooklm should appear in the discovered list.
</details>
~/.config/zed/settings.json — the relevant key is `context_servers` (Zed's MCP equivalent).
{
"context_servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"context_servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: Zed's AI Agent Panel lists notebooklm as an available context source.
</details>
opencode.jsonc (project root) or ~/.config/opencode/config.json.
{
"mcp": {
"servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}
}<details><summary>With timeout + env override</summary>
{
"mcp": {
"servers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}
}Verify: start OpenCode and ask "List my NotebookLM notebooks." — the model should call notebook_list. Gotchas: OpenCode's MCP schema is still evolving; confirm against the OpenCode docs if startup fails.
</details>
Managed via Cline's MCP settings UI inside VS Code. Underlying file (don't edit by hand): ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json.
Configure MCP Servers.{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
}
}
}<details><summary>With timeout + env override</summary>
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
"env": {
"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
}
}
}
}Verify: ask Cline "List my NotebookLM notebooks." — the tool-call panel shows notebook_list.
</details>
~/.config/goose/config.yaml (or via goose configure). Goose calls MCP servers "extensions".
extensions:
notebooklm:
type: stdio
command: npx
args:
- "-y"
- "@m4ykeldev/notebooklm-mcp"
- serve<details><summary>With timeout + env override</summary>
extensions:
notebooklm:
type: stdio
command: npx
args:
- "-y"
- "@m4ykeldev/notebooklm-mcp"
- serve
- "--query-timeout"
- "180000"
env:
NOTEBOOKLM_COOKIES: "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."Verify: goose configure → confirm the extension is enabled, then goose session and ask "List my NotebookLM notebooks."
</details>
GUI app (no user-editable config file):
Settings (Mod+K → Providers).notebooklmStdionpx-y @m4ykeldev/notebooklm-mcp serve (add --query-timeout 180000 if needed)NOTEBOOKLM_COOKIES=SID=...; HSID=...; SSID=...; APISID=...; SAPISID=...Verify: ask in chat "List my NotebookLM notebooks." — tool-call panel shows notebook_list.
Aider does not yet have first-class MCP-server client integration. Workarounds: run notebooklm-mcp serve separately and pipe responses, or use the generic stdio caller inside a small wrapper script. Track upstream support via the Aider Discord.
If your client speaks the MCP protocol over stdio but isn't listed above, every config above reduces to the same primitive:
spawn: npx -y @m4ykeldev/notebooklm-mcp serve
stdio: parent <- stdout (JSON-RPC responses) | parent -> stdin (JSON-RPC requests)
env: (optional)
NOTEBOOKLM_COOKIES=... # skip the auth flow in CI
NOTEBOOKLM_CSRF_TOKEN=...
NOTEBOOKLM_SESSION_ID=...
flags: (optional)
--query-timeout <ms> # per-RPC timeout, default 120000
--debug # verbose stderr loggingOn connection the server advertises 32 tools — see the Complete Tool Reference below.
After restarting your client, ask:
"List my NotebookLM notebooks."
If the model invokes notebook_list and returns a table of titles, you're connected.
Once wired up, your AI can drive NotebookLM end-to-end with natural language. The model picks the right tool from the 32 below.
| Goal | Sample prompt | Tools the model will call |
|---|---|---|
| Inventory | _"Show me every NotebookLM project I own"_ | notebook_list |
| Start a project | _"Create a notebook called 'Q3 Earnings' and add the AAPL 10-Q PDF at https://…"_ | notebook_create, notebook_add_url |
| Grounded Q&A | _"From the AAPL notebook, what is the year-over-year services revenue change?"_ | notebook_query |
| Multi-source brief | _"In my 'Climate Policy' notebook, generate a one-page briefing doc focused on IRA tax credits"_ | report_create, studio_status |
| Studio podcast | _"Make a 10-min audio overview of my 'AI Safety Reading' notebook"_ | audio_overview_create, studio_status |
| Deep Research → import | _"Run deep research on 'kelp aquaculture in Maine' and import the findings into my 'Climate' notebook"_ | research_start, research_status, research_import |
| Cleanup | _"Delete the audio overview I generated yesterday in 'AI Safety Reading'"_ | studio_status, studio_delete |
Every tool is designed to work seamlessly within your AI's context window.
| Tool | Description |
|---|---|
notebook_list | Get an overview of all your notebooks, including titles, source counts, and ownership metadata. |
notebook_create | Create a new NotebookLM project instantly from your terminal or AI assistant. |
notebook_get | Retrieve deep metadata and a full list of sources for a specific notebook. |
notebook_describe | Get a high-level, AI-generated summary of everything inside a notebook. |
notebook_rename | Update the title of an existing notebook. |
notebook_delete | Permanently remove a notebook (requires explicit confirmation). |
| Tool | Description |
|---|---|
notebook_add_url | Add any website or YouTube video as a source. Transcripts are automatically handled. |
notebook_add_text | Ingest raw text snippets or local file contents directly into your project. |
notebook_add_drive | Connect and import documents, sheets, or slides from your Google Drive. |
source_describe | Get detailed AI analysis, summaries, and key topics for any individual source. |
source_get_content | Extract the full underlying text of a source for processing by other AI tools. |
source_list_drive | List all Drive-based sources and check if they are up-to-date with the original files. |
source_sync_drive | Sync selected Google Drive sources to pull the latest changes into NotebookLM. |
source_delete | Remove a specific source from your notebook. |
| Tool | Description |
|---|---|
research_start | Launch an autonomous research task using Google's engine (Web or Drive sources). |
research_status | Track the progress of active research tasks and view discovered insights. |
research_import | Instantly import the findings of a research task as new sources in your notebook. |
notebook_query | Ask complex, grounded questions. Answers are cited directly from your sources. |
chat_configure | Fine-tune your AI's behavior by setting specific goals or preferred response lengths. |
| Tool | Description |
|---|---|
audio_overview_create | Transform your notebook's sources into a professional, podcast-style audio discussion. |
video_overview_create | Generate a structured video explainer based on your project data. |
report_create | Create professional Briefing Docs, Study Guides, or Blog Posts tailored to your sources. |
slide_deck_create | Turn your research into a presenter-ready slide deck automatically. |
infographic_create | Visualize complex data and relationships with an AI-generated infographic. |
flashcards_create | Generate interactive study flashcards to master your notebook's content. |
quiz_create | Create a comprehensive quiz to test knowledge grounded in your provided sources. |
data_table_create | Extract and organize information into a structured, downloadable data table. |
mind_map_create | Build a visual mind map connecting the core concepts of your notebook. |
studio_status | Check the generation status of your Studio artifacts and get download links. |
studio_delete | Clean up your workspace by deleting old Studio artifacts. |
| Tool | Description |
|---|---|
refresh_auth | Manually trigger a session refresh if you encounter connection issues. |
save_auth_tokens | Manually save cookie data (legacy fallback method). |
notebooklm-mcp serve [--query-timeout <ms>] [--debug]
notebooklm-mcp auth [--manual] [--file <path>] [--show-tokens]
notebooklm-mcp --version| Flag | Default | Description |
|---|---|---|
serve --query-timeout | 120000 | Per-RPC timeout in ms. Bump for large studio jobs or slow research. |
serve --debug | off | Verbose stderr logging of every RPC + retry. |
auth --manual | off | Skip Chrome automation; paste cookies yourself. |
auth --file <path> | — | Import a previously exported tokens JSON. |
auth --show-tokens | — | Print the cached session's metadata (cookie names, age, CSRF/SID presence — never the secret values). |
| Symptom | Likely cause | Fix |
|---|---|---|
| _"Could not find Google Chrome or Chromium"_ | No Chrome/Chromium on PATH | Install Chrome or run notebooklm-mcp auth --manual |
| _"Authentication expired"_ inside the AI session | Cookies stale | The server auto-refreshes once; if it can't, re-run notebooklm-mcp auth |
| Tool calls hang past 2 min | Big studio job over default timeout | Restart server with --query-timeout 300000 |
| _"file_path … outside the allowed roots"_ | notebook_add_text got a path outside cwd / tmp | Copy the file into your working directory or pass content inline |
| MCP client reports server crashed on startup | dist/cli.js missing (dev clone) | pnpm install && pnpm run build |
| Multiple Chrome windows pop up on concurrent failures | Older version without single-flight mutex | Upgrade to ≥ v0.2.5 |
notebooklm-mcp serve --query-timeout 180000
notebooklm-mcp auth --show-tokens to verify your session validity without exposing the secrets.NOTEBOOKLM_COOKIES (plus NOTEBOOKLM_CSRF_TOKEN, NOTEBOOKLM_SESSION_ID) to skip the browser flow entirely.~/.notebooklm-mcp/auth.json (mode 0600) inside ~/.notebooklm-mcp/ (mode 0700). Nothing leaves your machine except calls to Google.notebook_add_text rejects file_path arguments outside the working directory or the OS temp directory — a hostile MCP prompt cannot ask the server to read your ~/.ssh/id_rsa.127.0.0.1 — no fixed-port squatting, no LAN exposure.pnpm audit (high+) → npm audit signatures (Sigstore) → lockfile registry pinning → publish-manifest preview before pnpm publish ships via OIDC trusted publishers. See CONTRIBUTING.md → Releasing on GitHub.Open-source and available under the MIT License.
Crafted with precision for the AI-first developer. Part of the Model Context Protocol ecosystem.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.