Skip to main content
Glama
NotebookLM MCP Server

NotebookLM MCP Server

by set2374

NotebookLM MCP Server

NotebookLM MCP Header

An MCP server for NotebookLM (notebooklm.google.com).

Note: Tested with Pro/free tier accounts. May work with NotebookLM Enterprise accounts but has not been tested.

📺 Watch the Demos

General Overview

Claude Desktop

Perplexity Desktop

General

Claude

Perplexity

Features

Tool

Description

notebook_list

List all notebooks

notebook_create

Create a new notebook

notebook_get

Get notebook details with sources

notebook_describe

Get AI-generated summary of notebook content

source_describe

Get AI-generated summary and keywords for a source

source_get_content

Get raw text content from a source (no AI processing)

notebook_rename

Rename a notebook

chat_configure

Configure chat goal/style and response length

notebook_delete

Delete a notebook (requires confirmation)

notebook_add_url

Add URL/YouTube as source

notebook_add_text

Add pasted text as source

notebook_add_drive

Add Google Drive document as source

notebook_query

Ask questions and get AI answers

source_list_drive

List sources with freshness status

source_sync_drive

Sync stale Drive sources (requires confirmation)

source_delete

Delete a source from notebook (requires confirmation)

research_start

Start Web or Drive research to discover sources

research_status

Poll research progress with built-in wait

research_import

Import discovered sources into notebook

audio_overview_create

Generate audio podcasts (requires confirmation)

video_overview_create

Generate video overviews (requires confirmation)

infographic_create

Generate infographics (requires confirmation)

slide_deck_create

Generate slide decks (requires confirmation)

studio_status

Check studio artifact generation status

studio_delete

Delete studio artifacts (requires confirmation)

save_auth_tokens

Save cookies for authentication

Related MCP server: NotebookLM MCP Server

Important Disclaimer

This MCP uses internal APIs that:

  • Are undocumented and may change without notice

  • Require cookie extraction from your browser (I have a tool for that!)

Use at your own risk for personal/experimental purposes.

Installation

Install from PyPI using your preferred Python package manager:

uv tool install notebooklm-mcp-server

Using pip

pip install notebooklm-mcp-server

Using pipx

pipx install notebooklm-mcp-server
# Clone the repository
git clone https://github.com/jacob-bd/notebooklm-mcp.git
cd notebooklm-mcp

# Install with uv
uv tool install .

Upgrading

# Using uv
uv tool upgrade notebooklm-mcp-server

# Using pip
pip install --upgrade notebooklm-mcp-server

# Using pipx
pipx upgrade notebooklm-mcp-server

After upgrading, restart your AI tool to reconnect to the updated MCP server:

  • Claude Code: Restart the application, or use /mcp to reconnect

  • Cursor: Restart the application

  • Gemini CLI: Restart the CLI session

Uninstalling

To completely remove the MCP:

# Using uv
uv tool uninstall notebooklm-mcp-server

# Using pip
pip uninstall notebooklm-mcp-server

# Using pipx
pipx uninstall notebooklm-mcp-server

# Remove cached auth tokens (optional)
rm -rf ~/.notebooklm-mcp

Also remove from your AI tools:

Tool

Command

Claude Code

claude mcp remove notebooklm-mcp

Gemini CLI

gemini mcp remove notebooklm-mcp

Cursor/VS Code

Remove entry from ~/.cursor/mcp.json or ~/.vscode/mcp.json

Authentication

Before using the MCP, you need to authenticate with NotebookLM. Run:

# Recommended: Auto mode (launches Chrome, you log in)
notebooklm-mcp-auth

# Alternative: File mode (manual cookie extraction)
notebooklm-mcp-auth --file

Auto mode launches a dedicated Chrome profile, you log in to Google, and cookies are extracted automatically. Your login persists for future auth refreshes.

File mode shows instructions for manually extracting cookies from Chrome DevTools and saving them to a file.

After successful auth, add the MCP to your AI tool and restart.

For detailed instructions, troubleshooting, and how the authentication system works, see docs/AUTHENTICATION.md.

MCP Configuration

⚠️ Context Window Warning: This MCP provides 31 tools which consume a significant portion of your context window. It's recommended to disable the MCP when not actively using NotebookLM to preserve context for your other work. In Claude Code, use @notebooklm-mcp to toggle it on/off, or use /mcp command.

No environment variables needed - the MCP uses cached tokens from ~/.notebooklm-mcp/auth.json.

Use the built-in CLI command to add the MCP server:

Add for all projects (recommended):

claude mcp add --scope user notebooklm-mcp notebooklm-mcp

Or add for current project only:

claude mcp add notebooklm-mcp notebooklm-mcp

That's it! Restart Claude Code to use the MCP tools.

Verify installation:

claude mcp list

If you prefer to edit the config file manually, add to ~/.claude.json:

{
  "mcpServers": {
    "notebooklm-mcp": {
      "command": "notebooklm-mcp"
    }
  }
}

Restart Claude Code after editing.

Cursor, VS Code, Claude Desktop & Other IDEs

For tools that use JSON configuration files:

Tool

Config File Location

Cursor

~/.cursor/mcp.json

VS Code

~/.vscode/mcp.json

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS)

Step 1: Find your installed path:

which notebooklm-mcp

This typically returns /Users/<YOUR_USERNAME>/.local/bin/notebooklm-mcp on macOS.

Step 2: Add this configuration (replace the path with your result from Step 1):

{
  "mcpServers": {
    "notebooklm-mcp": {
      "command": "/Users/<YOUR_USERNAME>/.local/bin/notebooklm-mcp"
    }
  }
}

Restart the application after adding the configuration.

Other MCP-Compatible Tools

CLI tools with built-in MCP commands (AIDER, Codex, OpenCode, etc.):

<your-tool> mcp add notebooklm-mcp notebooklm-mcp

Tools using JSON config files — use the full path approach shown above.

Use the built-in CLI command to add the MCP server:

Add for all projects (recommended):

gemini mcp add --scope user notebooklm-mcp notebooklm-mcp

Or add for current project only:

gemini mcp add notebooklm-mcp notebooklm-mcp

That's it! Restart Gemini CLI to use the MCP tools.

Verify installation:

gemini mcp list

Add to ~/.gemini/settings.json under mcpServers (run which notebooklm-mcp to find your path):

"notebooklm-mcp": {
  "command": "/Users/<YOUR_USERNAME>/.local/bin/notebooklm-mcp"
}

Restart Gemini CLI after editing.

Managing Context Window Usage

Since this MCP has 31 tools, it's good practice to disable it when not in use:

Claude Code:

# Toggle on/off by @-mentioning in chat
@notebooklm-mcp

# Or use the /mcp command to enable/disable
/mcp

Cursor/Gemini CLI:

  • Comment out the server in your config file when not needed

  • Or use your tool's MCP management features if available

What You Can Do

Simply chat with your AI tool (Claude Code, Cursor, Gemini CLI) using natural language. Here are some examples:

Research & Discovery

  • "List all my NotebookLM notebooks"

  • "Create a new notebook called 'AI Strategy Research'"

  • "Start web research on 'enterprise AI ROI metrics' and show me what sources it finds"

  • "Do a deep research on 'cloud marketplace trends' and import the top 10 sources"

  • "Search my Google Drive for documents about 'product roadmap' and create a notebook"

Adding Content

  • "Add this URL to my notebook: https://example.com/article"

  • "Add this YouTube video about Kubernetes to the notebook"

  • "Add my meeting notes as a text source to this notebook"

  • "Import this Google Doc into my research notebook"

AI-Powered Analysis

  • "What are the key findings in this notebook?"

  • "Summarize the main arguments across all these sources"

  • "What does this source say about security best practices?"

  • "Get an AI summary of what this notebook is about"

  • "Configure the chat to use a learning guide style with longer responses"

Content Generation

  • "Create an audio podcast overview of this notebook in deep dive format"

  • "Generate a video explainer with classic visual style"

  • "Make a briefing doc from these sources"

  • "Create flashcards for studying, medium difficulty"

  • "Generate an infographic in landscape orientation"

  • "Build a mind map from my research sources"

  • "Create a slide deck presentation from this notebook"

Smart Management

  • "Check which Google Drive sources are out of date and sync them"

  • "Show me all the sources in this notebook with their freshness status"

  • "Delete this source from the notebook"

  • "Check the status of my audio overview generation"

Pro tip: After creating studio content (audio, video, reports, etc.), poll the status to get download URLs when generation completes.

Authentication Lifecycle

Component

Duration

Refresh

Cookies

~2-4 weeks

Re-extract from Chrome when expired

CSRF Token

Per MCP session

Auto-extracted on MCP start

Session ID

Per MCP session

Auto-extracted on MCP start

When cookies expire, you'll see an auth error. Just extract fresh cookies and call save_auth_tokens() again.

Troubleshooting

Chrome DevTools MCP Not Working (Cursor/Gemini CLI)

If Chrome DevTools MCP shows "no tools, prompts or resources" or fails to start, it's likely due to a known npx bug with the puppeteer-core module.

Symptoms:

  • Cursor/Gemini CLI shows MCP as connected but with "No tools, prompts, or resources"

  • Process spawn errors in logs: spawn pnpx ENOENT or module not found errors

  • Can't extract cookies for NotebookLM authentication

Fix:

  1. Install pnpm (if not already installed):

    npm install -g pnpm
  2. Update Chrome DevTools MCP configuration:

    For Cursor (~/.cursor/mcp.json):

    "chrome-devtools": {
      "command": "pnpm",
      "args": ["dlx", "chrome-devtools-mcp@latest", "--browser-url=http://127.0.0.1:9222"]
    }

    For Gemini CLI (~/.gemini/settings.json):

    "chrome-devtools": {
      "command": "pnpm",
      "args": ["dlx", "chrome-devtools-mcp@latest"]
    }
  3. Restart your IDE/CLI for changes to take effect.

Why this happens: Chrome DevTools MCP uses puppeteer-core which changed its module path in v23+, but npx caching behavior causes module resolution failures. Using pnpm dlx avoids this issue.

Related Issues:

Limitations

  • Rate limits: Free tier has ~50 queries/day

  • No official support: API may change without notice

  • Cookie expiration: Need to re-extract cookies every few weeks

Contributing

See CLAUDE.md for detailed API documentation and how to add new features.

Vibe Coding Alert

Full transparency: this project was built by a non-developer using AI coding assistants. If you're an experienced Python developer, you might look at this codebase and wince. That's okay.

The goal here was to scratch an itch - programmatic access to NotebookLM - and learn along the way. The code works, but it's likely missing patterns, optimizations, or elegance that only years of experience can provide.

This is where you come in. If you see something that makes you cringe, please consider contributing rather than just closing the tab. This is open source specifically because human expertise is irreplaceable. Whether it's refactoring, better error handling, type hints, or architectural guidance - PRs and issues are welcome.

Think of it as a chance to mentor an AI-assisted developer through code review. We all benefit when experienced developers share their knowledge.

License

MIT License

Available Tools

32 tools
audio_overview_createA

Generate audio overview. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) format: deep_dive|brief|critique|debate length: short|default|long language: BCP-47 code (en, es, fr, de, ja) focus_prompt: Optional focus text confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, format, length, +3 more. Returns: object

chat_configureB

Configure notebook chat settings.

Args: notebook_id: Notebook UUID goal: default|learning_guide|custom custom_prompt: Required when goal=custom (max 10000 chars) response_length: default|longer|shorter

Inputs: notebook_id (required), goal, custom_prompt, response_length. Returns: object

data_table_createA

Generate data table. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID description: Description of the data table to create source_ids: Source IDs (default: all) language: Language code (default: "en") confirm: Must be True after user approval

Inputs: notebook_id (required), description (required), source_ids, language, +1 more. Returns: object

flashcards_createA

Generate flashcards. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) difficulty: easy|medium|hard confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, difficulty, confirm. Returns: object

infographic_createA

Generate infographic. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) orientation: landscape|portrait|square detail_level: concise|standard|detailed language: BCP-47 code (en, es, fr, de, ja) focus_prompt: Optional focus text confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, orientation, detail_level, +3 more. Returns: object

mind_map_createB

Generate and save mind map. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) title: Display title confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, title, confirm. Returns: object

mind_map_listB

List all mind maps in a notebook.

Args: notebook_id: Notebook UUID

Inputs: notebook_id (required). Returns: object

notebook_add_driveB

Add Google Drive document as source.

Args: notebook_id: Notebook UUID document_id: Drive document ID (from URL) title: Display title doc_type: doc|slides|sheets|pdf

Inputs: notebook_id (required), document_id (required), title (required), doc_type. Returns: object

notebook_add_textC

Add pasted text as source.

Args: notebook_id: Notebook UUID text: Text content to add title: Optional title

Inputs: notebook_id (required), text (required), title. Returns: object

notebook_add_urlC

Add URL (website or YouTube) as source.

Args: notebook_id: Notebook UUID url: URL to add

Inputs: notebook_id (required), url (required). Returns: object

notebook_createB

Create a new notebook.

Args: title: Optional title for the notebook

Inputs: title. Returns: object

notebook_deleteA

Delete notebook permanently. IRREVERSIBLE. Requires confirm=True.

Args: notebook_id: Notebook UUID confirm: Must be True after user approval

Inputs: notebook_id (required), confirm. Returns: object

notebook_describeB

Get AI-generated notebook summary with suggested topics.

Args: notebook_id: Notebook UUID

Returns: summary (markdown), suggested_topics list

Inputs: notebook_id (required). Returns: object

notebook_getB

Get notebook details with sources.

Args: notebook_id: Notebook UUID

Inputs: notebook_id (required). Returns: object

notebook_listB

List all notebooks.

Args: max_results: Maximum number of notebooks to return (default: 100)

Inputs: max_results. Returns: object

notebook_queryA

Ask AI about EXISTING sources already in notebook. NOT for finding new sources.

Use research_start instead for: deep research, web search, find new sources, Drive search.

Args: notebook_id: Notebook UUID query: Question to ask source_ids: Source IDs to query (default: all) conversation_id: For follow-up questions

Inputs: notebook_id (required), query (required), source_ids, conversation_id. Returns: object

notebook_renameB

Rename a notebook.

Args: notebook_id: Notebook UUID new_title: New title

Inputs: notebook_id (required), new_title (required). Returns: object

quiz_createA

Generate quiz. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) question_count: Number of questions (default: 2) difficulty: Difficulty level (default: 2) confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, question_count, difficulty, +1 more. Returns: object

report_createA

Generate report. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) report_format: "Briefing Doc"|"Study Guide"|"Blog Post"|"Create Your Own" custom_prompt: Required for "Create Your Own" language: BCP-47 code (en, es, fr, de, ja) confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, report_format, custom_prompt, +2 more. Returns: object

research_importA

Import discovered sources into notebook.

Call after research_status shows status="completed".

Args: notebook_id: Notebook UUID task_id: Research task ID source_indices: Source indices to import (default: all)

Inputs: notebook_id (required), task_id (required), source_indices. Returns: object

research_startA

Deep research / fast research: Search web or Google Drive to FIND NEW sources.

Use this for: "deep research on X", "find sources about Y", "search web for Z", "search Drive". Workflow: research_start -> poll research_status -> research_import.

Args: query: What to search for (e.g. "quantum computing advances") source: web|drive (where to search) mode: fast (~30s, ~10 sources) | deep (~5min, ~40 sources, web only) notebook_id: Existing notebook (creates new if not provided) title: Title for new notebook

Inputs: query (required), source, mode, notebook_id, +1 more. Returns: object

research_statusA

Poll research progress. Blocks until complete or timeout.

Args: notebook_id: Notebook UUID poll_interval: Seconds between polls (default: 30) max_wait: Max seconds to wait (default: 300, 0=single poll) compact: If True (default), truncate report and limit sources shown to save tokens. Use compact=False to get full details.

Inputs: notebook_id (required), poll_interval, max_wait, compact. Returns: object

save_auth_tokensB

Save NotebookLM cookies. CSRF and session ID are auto-extracted.

Args: cookies: Cookie header from Chrome DevTools get_network_request csrf_token: (deprecated, auto-extracted from request_body or page) session_id: (deprecated, auto-extracted from request_url or page) request_body: Optional request body from get_network_request (contains CSRF token) request_url: Optional request URL from get_network_request (contains session ID)

Inputs: cookies (required), csrf_token, session_id, request_body, +1 more. Returns: object

slide_deck_createA

Generate slide deck. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) format: detailed_deck|presenter_slides length: short|default language: BCP-47 code (en, es, fr, de, ja) focus_prompt: Optional focus text confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, format, length, +3 more. Returns: object

source_deleteA

Delete source permanently. IRREVERSIBLE. Requires confirm=True.

Args: source_id: Source UUID to delete confirm: Must be True after user approval

Inputs: source_id (required), confirm. Returns: object

source_describeB

Get AI-generated source summary with keyword chips.

Args: source_id: Source UUID

Returns: summary (markdown with bold keywords), keywords list

Inputs: source_id (required). Returns: object

source_get_contentA

Get raw text content of a source (no AI processing).

Returns the original indexed text from PDFs, web pages, pasted text, or YouTube transcripts. Much faster than notebook_query for content export.

Args: source_id: Source UUID

Returns: content (str), title (str), source_type (str), char_count (int)

Inputs: source_id (required). Returns: object

source_list_driveA

List sources with types and Drive freshness status.

Use before source_sync_drive to identify stale sources.

Args: notebook_id: Notebook UUID

Inputs: notebook_id (required). Returns: object

source_sync_driveA

Sync Drive sources with latest content. Requires confirm=True.

Call source_list_drive first to identify stale sources.

Args: source_ids: Source UUIDs to sync confirm: Must be True after user approval

Inputs: source_ids (required), confirm. Returns: object

studio_deleteA

Delete studio artifact. IRREVERSIBLE. Requires confirm=True.

Args: notebook_id: Notebook UUID artifact_id: Artifact UUID (from studio_status) confirm: Must be True after user approval

Inputs: notebook_id (required), artifact_id (required), confirm. Returns: object

studio_statusC

Check studio content generation status and get URLs.

Args: notebook_id: Notebook UUID

Inputs: notebook_id (required). Returns: object

video_overview_createA

Generate video overview. Requires confirm=True after user approval.

Args: notebook_id: Notebook UUID source_ids: Source IDs (default: all) format: explainer|brief visual_style: auto_select|classic|whiteboard|kawaii|anime|watercolor|retro_print|heritage|paper_craft language: BCP-47 code (en, es, fr, de, ja) focus_prompt: Optional focus text confirm: Must be True after user approval

Inputs: notebook_id (required), source_ids, format, visual_style, +3 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 32 tools

    Disambiguation4/5

    Most tools have distinct purposes targeting specific resources or actions (e.g., audio_overview_create vs. video_overview_create, notebook_add_drive vs. notebook_add_text). However, some overlap exists between research_start and notebook_query, where the descriptions clarify that research_start is for finding new sources while notebook_query is for querying existing ones, which could still cause confusion if not carefully read.

    Naming Consistency5/5

    Tool names follow a highly consistent verb_noun pattern throughout (e.g., notebook_create, notebook_delete, source_list_drive, research_start). All tools use snake_case with clear, descriptive names, making the set predictable and easy to navigate.

    Tool Count3/5

    With 32 tools, the count is borderline high for a notebook management and content generation server. While the domain is broad (notebooks, sources, research, studio artifacts), the number feels heavy and could overwhelm agents, though each tool appears to serve a specific function within the scope.

    Completeness5/5

    The tool surface provides comprehensive coverage for the notebook management domain, including full CRUD for notebooks and sources, content generation (audio, video, reports, etc.), research workflows, and studio operations. There are no obvious gaps; agents can perform all expected lifecycle actions from creation to deletion with detailed options.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      Not graded
      maintenance
      Enables interaction with Google's NotebookLM through natural language, allowing users to create and manage notebooks, add sources from URLs/YouTube/Google Drive, query AI for insights, generate audio podcasts and other studio content, and perform AI-powered research and analysis.
      32
      3
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables interaction with Google NotebookLM through natural language to create and manage notebooks, add sources from URLs/YouTube/Google Drive, perform AI-powered research and analysis, generate audio podcasts, videos, infographics, and slide decks from notebook content.
      32
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables interaction with Google's NotebookLM via the Model Context Protocol to manage notebooks, sources, and research tasks. Users can create, query, and summarize content, as well as generate artifacts like audio overviews and slide decks using natural language.
      32
      1
      MIT
    • A
      license
      B
      quality
      A
      maintenance
      Enables AI assistants to programmatically interact with Google NotebookLM, allowing them to create and manage notebooks, add sources, query content, generate audio/video, and perform research tasks through natural language commands.
      55
      14,897 PyPI
      6,485
      MIT