notebooklm-mcp
This server lets AI assistants control Gemini Notebook end-to-end: notebooks, sources, research, queries/chats, Studio content, sharing, organization, downloads/exports, profiles/auth, and automation.
Manage notebooks: list, get, describe, create, rename, delete, manage aliases, and handle sharing (status, public link, invites, batch invites).
Add and manage sources: add URLs, text, Google Drive docs, or local files; bulk-add URLs; list Drive freshness; sync Drive sources; rename, delete, describe, and fetch raw source content.
Run research: start fast/deep web or Drive research, poll progress, and import discovered sources, optionally only cited ones or selected indices.
Query and chat: ask notebook questions synchronously or asynchronously; configure chat goal/response length; list, get, export, and save chat sessions as notes.
Generate Studio artifacts: create audio/video overviews, infographics, slide decks, reports, flashcards, quizzes, data tables, and mind maps; check status, rename, delete, and revise slide decks.
Download and export: download individual artifacts or all artifacts across notebooks; export data tables to Google Sheets and reports to Google Docs.
Organize and automate: manage collections, labels, tags, notes, cross-notebook queries, batch operations, and multi-step pipelines.
Manage accounts and diagnostics: list/switch profiles, refresh auth, save auth tokens as a fallback, check plan usage, and get server/version/auth health info.
Integrates GitHub Copilot with NotebookLM, allowing Copilot to manage notebooks, sources, and generate content through MCP tools.
Enables Perplexity Desktop to interface with NotebookLM for creating notebooks, adding sources, and generating audio content.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@notebooklm-mcpCreate a notebook about quantum computing and generate a podcast."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Gemini Notebook (formerly Google NotebookLM) CLI & MCP Server

Programmatic access to Gemini Notebook โ via command-line interface (CLI) or Model Context Protocol (MCP) server.
๐จ New: Protected login storage (recommended) Your saved Google login can now be encrypted, with its key kept in your computer's keychain instead of a plain file. We highly recommend everyone switch on a personal computer:
nlm auth storage set protected๐ก You can also use the 'nlm setup' wizard and select the 'Credentials Protection' option in the wizard
Optional: nothing changes unless you turn it on. Servers, cron, Docker and SSH setups can keep the plain file. ๐ How it works ยท ๐บ Watch this short video
๐ค Fun fact: this video was created by an agent using the gemini-notebook-mcp.
Note: Personal/consumer accounts are tested regularly. Gemini Notebook Enterprise support is experimental. The documented
notebook.cloud.google.comhost has been live-verified with a project-qualifiedglobaldeployment; other Enterprise host variants may require additional validation.
โ If you find notebooklm-mcp-cli useful, consider buying me a coffee. It's free and built in my spare time โ but testing every Gemini Notebook feature takes real time and resources. A coffee helps me cover it and keep shipping. Thank you! ๐
๐บ Watch the Demos
Latest
Claude Cowork & Interactive Reports | Codex Setup + Cinematic Video & Slides |
|
|
MCP Demos
General Overview | Claude Desktop | Perplexity Desktop | MCP Super Assistant |
|
|
|
|
CLI Demos
CLI Overview | CLI, MCP & Skills | Setup, Doctor & mcpb | Infographics Support |
|
|
|
|
โก Quick Start
Three commands take you from nothing to a connected AI assistant:
Install (gives you
nlmand the MCP server):
uv tool install notebooklm-mcp-cliSign in to your Google account:
nlm loginConnect your AI tools:
nlm setupThe setup wizard (nlm setup)
nlm setup finds the AI tools installed on your machine and connects them to
Gemini Notebook โ no config files to edit. Pick an option with the arrow keys:
Menu option | What it does |
Show my tools' status | One table for every detected tool: MCP connection (โ set up ยท โ not yet ยท โ old name) and skill version (โฌ when an upgrade is available). |
Add the MCP to my tools/agents | Tick the tools to connect (Space), then Enter. Nothing is pre-selected. Connections still using the old |
Add the skill to my tools/agents | Installs the skill that teaches your AI how to use Gemini Notebook well โ for All my projects (default) or Just this folder. Upgrades are pre-ticked; older versions are only replaced after you confirm. |
Remove an MCP or skill | Lists what's installed, grouped into MCP connections and skills. Nothing is pre-selected, and each group needs its own confirmation. |
Credential protection | Protect your saved logins in your OS keystore, or restore them to plain files. It only offers what applies: Protect when a login is plain, Restore when one is protected. With several logins you get a checkbox picker. |
Copy MCP setup for a tool not listed | Copies a ready-to-paste JSON snippet to your clipboard. Advanced options switch to uvx, the bare command, or entry-only JSON. |
Esc goes back from any screen (and quits from the main menu).
Every file is backed up to
~/.notebooklm-mcp-cli/backups/before it is changed.Connects to: Claude Code, Claude Desktop (regular and Relay AI / 3P), Codex CLI / ChatGPT desktop app, Gemini CLI, Cursor, Windsurf, Cline, Antigravity, GitHub Copilot (VS Code), and OpenCode. The skill also installs for Hermes and OpenClaw.
Claude Desktop Chat & Cowork, and claude.ai: these only use skills uploaded to your Claude account. In Add the skill, tick Claude Desktop / claude.ai โ the wizard saves
~/Downloads/nlm-skill.zipand shows where to upload it (Customize โ Skills โ Add). Or runnlm skill package.Claude Desktop: fully quit it (Cmd+Q) before connecting โ it can overwrite its settings while open, so the wizard refuses to write until it's closed.
Scripts and CI: every option has a direct command โ
nlm setup add <tool>,nlm setup remove <tool>,nlm setup list,nlm skill install <tool>. See MCP Configuration.
Related MCP server: NotebookLM MCP Server
Two Ways to Use
๐ฅ๏ธ Command-Line Interface (CLI)
Use nlm directly in your terminal for scripting, automation, or interactive use:
nlm notebook list # List all notebooks
nlm notebook create "Research Project" # Create a notebook
nlm source add <notebook> --url "https://..." # Add sources
nlm audio create <notebook> --confirm # Generate podcast
nlm download audio <notebook> --id <artifact-id> # Download audio file
nlm download all <notebook> -d ./exports # Download every artifact
nlm share public <notebook> # Enable public linkRun nlm --ai for comprehensive AI-assistant documentation.
๐ค MCP Server (for AI Agents)
Connect AI assistants (Claude, Gemini, Cursor, etc.) to Gemini Notebook:
nlm setup # Guided wizard โ see Quick Start above
nlm setup add codex # Or connect one client directlyThen use natural language: "Create a notebook about quantum computing and generate a podcast"
Features
Capability | CLI Command | MCP Tool |
List notebooks |
|
|
Create notebook |
|
|
Add Sources (URL, Text, Drive, File) |
|
|
Query notebook (persists to web UI) |
|
|
List/view/export/delete chat sessions |
|
|
Create Studio Content (Audio, Video, etc.) |
|
|
Interactive reports (read + embedded elements) |
|
|
Revise slide decks |
|
|
Download artifacts |
|
|
Download all artifacts (one or all notebooks) |
|
|
Web/Drive research |
|
|
Share notebook |
|
|
Sync Drive sources |
|
|
Batch operations |
|
|
Cross-notebook query |
|
|
Pipelines (multi-step workflows) |
|
|
Tag & smart select |
|
|
Manage collections (home page groups) | โ |
|
Configure AI tools |
| โ |
Install AI Skills |
| โ |
Diagnose issues |
| โ |
Check remaining plan usage |
|
|
Manage login encryption (Protected mode) |
| โ |
๐ More Documentation:
Getting Started โ Install, login, agent setup, and migration from another Gemini Notebook MCP
CLI Guide โ Complete command reference
MCP Guide โ All 55 MCP tools with examples
Authentication โ Setup and troubleshooting
Remote MCP โ Web/mobile connector feasibility, security, and authentication limitations
API Reference โ Internal API docs for contributors
Important Disclaimer
This MCP and CLI use internal APIs that:
Are undocumented and may change without notice
Require cookie extraction from your browser (I have a tool for that!)
May not be aligned with Google's Terms of Service
Use at your own risk for personal/experimental purposes.
Installation
๐ Claude Desktop users: Download the extension (
.mcpbfile) โ double-click โ done! One-click install, no config needed.
Install from PyPI. This single package includes both the CLI and MCP server:
Using uv (Recommended)
uv tool install notebooklm-mcp-cliUsing uvx (Run Without Install)
uvx --from notebooklm-mcp-cli nlm --help
uvx --from notebooklm-mcp-cli notebooklm-mcpUsing pip
pip install notebooklm-mcp-cliUsing pipx
pipx install notebooklm-mcp-cliAfter installation, you get:
nlmโ Command-line interfacenotebooklm-mcpโ Gemini Notebook MCP server for AI assistants
# Clone the repository
git clone https://github.com/jacob-bd/gemini-notebook-mcp-cli.git
cd notebooklm-mcp
# Install with uv
uv tool install .Upgrading
# Using uv
uv tool upgrade notebooklm-mcp-cli
# Using pip
pip install --upgrade notebooklm-mcp-cli
# Using pipx
pipx upgrade notebooklm-mcp-cliAfter upgrading, restart your AI tool to reconnect to the updated MCP server:
Claude Code: Restart the application, or use
/mcpto reconnectCursor: Restart the application
Gemini CLI: Restart the CLI session
Upgrading from Legacy Versions
If you previously installed the separate CLI and MCP packages, you need to migrate to the unified package.
Step 1: Check What You Have Installed
uv tool list | grep notebooklmLegacy packages to remove:
Package | What it was |
| Old CLI-only package |
| Old MCP-only package |
Step 2: Uninstall Legacy Packages
# Remove old CLI package (if installed)
uv tool uninstall notebooklm-cli
# Remove old MCP package (if installed)
uv tool uninstall notebooklm-mcp-serverStep 3: Reinstall the Unified Package
After removing legacy packages, reinstall to fix symlinks:
uv tool install --force notebooklm-mcp-cliWhy
--force? When multiple packages provide the same executable,uvcan leave broken symlinks after uninstalling. The--forceflag ensures clean symlinks.
Step 4: Verify Installation
uv tool list | grep notebooklmYou should see only:
notebooklm-mcp-cli v0.2.0
- nlm
- notebooklm-mcpStep 5: Re-authenticate
Your existing cookies should still work, but if you encounter auth issues:
nlm loginNote: The configured MCP server name is now
gemini-notebook-mcp. The executable remainsnotebooklm-mcpfor compatibility with existing installations.
Getting Started
If you are setting up the tool for the first time โ or migrating from a browser-based Gemini Notebook MCP โ see the Getting Started Guide. It covers install, login, agent registration, and a step-by-step migration path that avoids the "two Gemini Notebook servers registered" trap.
Uninstalling
To completely remove the MCP:
# Using uv
uv tool uninstall notebooklm-mcp-cli
# Using pip
pip uninstall notebooklm-mcp-cli
# Using pipx
pipx uninstall notebooklm-mcp-cli
# Remove cached auth tokens and data (optional)
rm -rf ~/.notebooklm-mcp-cliAlso remove from your AI tools:
nlm setup remove claude-code
nlm setup remove cursor
# ... or any configured toolAuthentication
Before using the CLI or MCP, you need to authenticate with Gemini Notebook:
CLI Authentication (Recommended)
# Auto mode: launches your browser, you log in, cookies extracted automatically
nlm login
# Check if already authenticated
nlm login --check
# Use a named profile (for multiple Google accounts)
nlm login --profile work
nlm login --profile personal
# Manual mode: import cookies from a file
nlm login --manual --file cookies.txt
# External CDP provider (e.g., OpenClaw-managed browser)
nlm login --provider openclaw --cdp-url http://127.0.0.1:18800New profiles ask where to keep the saved login before the browser opens: Protected (encrypted, key in your OS keystore, recommended) or a plain file. Scripts can skip the question with nlm login --storage protected (or --storage file). Existing profiles keep their mode; change it any time in nlm setup โ Credential protection.
Profile management:
nlm login --check # Show current auth status
nlm login switch <profile> # Switch the default profile
nlm login profile list # List all profiles with email addresses
nlm login profile delete <profile> # Delete a profile
nlm login profile rename <old> <new> # Rename a profileFrom an MCP-only app (for example Claude CoWork): ask the AI to use the profile tool. It can list your accounts, switch for the session, and, only if you ask, make one your saved default.
Unattended / scheduled refresh:
A live session self-heals โ when Google's short-lived cookies age out, the client automatically runs a headless refresh. For unattended machines you can also refresh proactively from a scheduler so a session never lapses:
nlm auth refresh # Headless, no interaction; exits non-zero on failure
nlm auth refresh --profile work # Refresh a named profile
nlm auth refresh --http-only # Validate without opening a browser--http-only forces HTTP transport, including when CDP transport is configured.
It cannot renew browser-dependent PSIDTS cookies or revive a fully expired login.
Automatic recovery uses a per-process cooldown and failure budget; explicit
refresh commands bypass these limits. See authentication guidance.
Run browser-based refresh on a timer (cron/launchd). It needs a saved Chrome profile from a prior
nlm login, and does not apply when NOTEBOOKLM_COOKIES is set as an
environment variable (that value overrides saved credentials).
Enterprise Authentication (Gemini Notebook Enterprise)
For organizations using Gemini Notebook Enterprise via Google Cloud, ask your Enterprise administrator for the project ID or number, the deployment location/multi-region, and confirmation that your account has access. The current documented host is notebook.cloud.google.com; older deployments may use notebooklm.cloud.google.com or vertexaisearch.cloud.google.com.
Set Base URL, GCP Project ID & Location:
export NOTEBOOKLM_BASE_URL="https://notebook.cloud.google.com" # Required: your GCP project ID or project number from your administrator export NOTEBOOKLM_PROJECT_ID="your-gcp-project-id-or-number" # Optional: GCP location/multi-region from your administrator: global (default), us, or eu export NOTEBOOKLM_LOCATION="global"Save an Enterprise Auth Profile: This opens the configured Enterprise URL in an isolated browser profile. Sign in with your organization account:
nlm login --profile enterprise nlm login switch enterpriseYou can switch back to a personal profile at any time:
unset NOTEBOOKLM_BASE_URL NOTEBOOKLM_PROJECT_ID NOTEBOOKLM_LOCATION nlm login switch personalConfigure MCP Server with Enterprise Environment Variables: When adding the MCP server to AI assistants (Claude, Cursor, etc.), pass
NOTEBOOKLM_BASE_URL,NOTEBOOKLM_PROJECT_ID, and optionallyNOTEBOOKLM_LOCATION:{ "mcpServers": { "gemini-notebook-mcp": { "command": "notebooklm-mcp", "env": { "NOTEBOOKLM_BASE_URL": "https://notebook.cloud.google.com", "NOTEBOOKLM_PROJECT_ID": "your-gcp-project-id-or-number", "NOTEBOOKLM_LOCATION": "global" } } } }
Each profile gets its own isolated browser session, so you can be logged into multiple Google accounts simultaneously. Enterprise environment variables apply to the current process, so keep them in an Enterprise-only shell or MCP configuration when you also use a personal account.
Standalone Auth Tool
If you only need the MCP server (not the CLI):
nlm login # Auto mode (launches browser)
nlm login --manual # Manual file modeHow it works: Auto mode launches a dedicated browser profile (supports Chrome, Arc, Dia, Comet, Brave, Edge, Chromium, Firefox, and more), you log in to Google, and cookies are extracted automatically. Your login persists for future auth refreshes.
Prefer a specific browser? Set it with nlm config set auth.browser chromium (or comet, dia, brave, arc, edge, chrome, firefox, etc.). Falls back to auto-detection if the preferred named browser is not found. For any other Chromium-compatible browser, set its executable with nlm config set auth.browser_path /path/to/browser or NLM_BROWSER_PATH; an invalid explicit path fails closed instead of launching a different browser. When Chromium/CDP is unavailable, auto can fall back to Firefox.
For detailed instructions and troubleshooting, see docs/AUTHENTICATION.md.
MCP Configuration
โ ๏ธ Context Window Warning: This MCP provides 55 tools. Disable it when not using Gemini Notebook to preserve context. In Claude Code:
@gemini-notebook-mcpto toggle. To keep it on but expose only a subset, see Selective tool exposure.
Automatic Setup (Recommended)
The setup wizard is the recommended way to connect tools โ see Quick Start for what each menu option does:
nlm setupMCP configuration goes to each app's user-level settings. Codex CLI and the
ChatGPT desktop app share one MCP configuration on the same host. GitHub
Copilot uses the VS Code user profile in the wizard; the direct command without
--scope user targets the current workspace.
For direct setup or scripts, keep using the existing commands:
nlm setup add codex # Codex CLI / ChatGPT desktop
nlm setup add github-copilot --scope user # VS Code user profile
nlm setup add github-copilot # Current workspace
nlm setup add claude-desktop --profile 3p # Relay AI / Claude 3P
nlm setup list # Show MCP configuration statusClaude Desktop setup only writes to profiles that are detected as present. If
both regular and Relay AI/3P profiles exist, the CLI asks whether to configure
regular, 3P, or both. For scripts, use --profile regular|3p|both. If no
Claude Desktop profile is detected, nothing is created or changed.
Removal uses the same profile selection, for example
nlm setup remove claude-desktop --profile regular.
Removal only offers detected profiles containing this MCP or a recognized
legacy entry; unrelated MCP servers are left untouched.
Before adding or removing the MCP, fully quit the selected Claude Desktop profile. The CLI detects running regular and Relay AI/3P instances and refuses to write while they are open, because Claude may rewrite the config and discard the change. Reopen Claude Desktop after setup completes.
Install AI Skills (Optional)
The wizard can install the prompting and workflow skill after MCP setup. It defaults to All projects (user level) and can instead install into the current project. Existing current or newer versions are preserved; older or unversioned skills require confirmation before replacement, with a backup made first.
You can also manage skills directly. Supported local skill targets include Cline, Antigravity, OpenClaw, Hermes, Codex, OpenCode, Claude Code, and Gemini CLI.
# Install skill files
nlm skill install cline
nlm skill install openclaw
nlm skill install codex
nlm skill install antigravity
# Update skills
nlm skill updateUser-level skill installation requires the target tool to be detected first;
the CLI will not create a missing tool directory or install anyway. Use
--level project when you intentionally want a project-local skill.
Claude Desktop (Chat and Cowork) and claude.ai
Claude Desktop's Code tab is Claude Code, so it uses the skill installed in
~/.claude/skills/. The Chat and Cowork tabs, and claude.ai, only use
skills uploaded to your Claude account. Create the upload file with the wizard
(tick Claude Desktop / claude.ai in Add the skill) or directly:
nlm skill package # saves ~/Downloads/nlm-skill.zip
nlm skill package --output ~/DesktopThen in Claude Desktop (or claude.ai) open Customize โ Skills โ Add, pick
nlm-skill.zip, and turn the skill on. Re-upload after updating nlm to get
the latest skill. The MCP for Chat and Cowork comes from the normal Claude
Desktop connection (nlm setup โ Add the MCP).
Remove from a tool
nlm setup remove claude-codeUsing uvx (No Install Required)
If you don't want to install the package, you can use uvx to run on-the-fly:
# Run CLI commands directly
uvx --from notebooklm-mcp-cli nlm setup add cursor
uvx --from notebooklm-mcp-cli nlm loginFor tools that use JSON config, point them to uvx:
{
"mcpServers": {
"gemini-notebook-mcp": {
"command": "uvx",
"args": ["--from", "notebooklm-mcp-cli", "notebooklm-mcp"]
}
}
}Tip: Run
nlm setup add jsonfor an interactive wizard that generates the right JSON snippet for your tool.
Claude Code / Gemini CLI support adding MCP servers via their own CLI:
claude mcp add --scope user gemini-notebook-mcp notebooklm-mcp
gemini mcp add --scope user gemini-notebook-mcp notebooklm-mcpCursor / Windsurf resolve commands from your PATH, so the command name is enough:
{
"mcpServers": {
"gemini-notebook-mcp": {
"command": "notebooklm-mcp"
}
}
}Tool | Config Location |
Cursor |
|
Windsurf |
|
GitHub Copilot (VS Code workspace) uses .vscode/mcp.json with a top-level servers key:
{
"servers": {
"gemini-notebook-mcp": {
"command": "notebooklm-mcp",
"args": []
}
}
}Claude Desktop may not resolve PATH โ use the full path to the binary:
{
"mcpServers": {
"gemini-notebook-mcp": {
"command": "/full/path/to/notebooklm-mcp"
}
}
}Find your path with: which notebooklm-mcp
Tool | Config Location |
Claude Desktop (macOS current/3P) |
|
Claude Desktop (macOS legacy) |
|
Claude Desktop (Windows) |
|
Claude Desktop (Windows 3P) |
|
Claude Desktop (Linux) |
|
Claude Desktop (Linux 3P) |
|
GitHub Copilot |
|
๐ Full configuration details: MCP Guide โ Server options, environment variables, HTTP transport, and context window management. For Claude web/mobile and public deployment, read Remote MCP Deployment first.
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 Gemini Notebook 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"
(All queries sent from CLI or MCP automatically persist in your Gemini Notebook web UI chat history!)
Content Generation
"Create an audio podcast overview of this notebook in deep dive format"
"Generate a video explainer with classic visual style"
"Make a short vertical video overview of the key idea"
"Make a briefing doc from these sources"
"Create flashcards for studying, medium difficulty"
"Generate an infographic in landscape orientation with professional style"
"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"
"Check this specific artifact without listing every Studio item"
"List only the generated videos in this notebook"
Sharing & Collaboration
"Show me the sharing settings for this notebook"
"Make this notebook public so anyone with the link can view it"
"Disable public access to this notebook"
"Invite user@example.com as an editor to this notebook"
"Add a viewer to my research notebook"
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 | Auto-refresh via headless browser (if profile saved) |
CSRF Token | ~minutes | Auto-refreshed on every request failure |
Session ID | Per MCP session | Auto-extracted on MCP start |
v0.1.9+: The server now automatically handles token expiration:
Refreshes CSRF tokens immediately when expired
Reloads cookies from disk if updated externally
Runs headless browser auth if profile has saved login
You can also call refresh_auth() to explicitly reload and validate tokens, or
refresh_auth(profile="work") to refresh a named saved account without
switching the MCP server's active account.
If automatic refresh fails (Google login fully expired), run nlm login again.
For suspected browser-bound auth replay failures, run nlm doctor auth-replay.
If the cdp_in_page probe succeeds while normal replay fails, see
Experimental browser-backed RPC transport.
Troubleshooting
uv tool upgrade Not Installing Latest Version
Symptoms:
Running
uv tool upgrade notebooklm-mcp-cliinstalls an older version (e.g., 0.1.5 instead of 0.1.9)uv cache cleandoesn't fix the issue
Why this happens: uv tool upgrade respects version constraints from your original installation. If you initially installed an older version or with a constraint, upgrade stays within those bounds by design.
Fix โ Force reinstall:
uv tool install --force notebooklm-mcp-cliThis bypasses any cached constraints and installs the absolute latest version from PyPI.
Verify:
uv tool list | grep notebooklm
# Should show: notebooklm-mcp-cli v0.1.9 (or latest)Limitations
Rate limits: Chat and Studio usage is metered as compute against a rolling (~5h) window and a weekly cap, scaled by plan tier. Run
nlm usageto see what is left and when it resetsNo 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 Gemini Notebook - 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.
Credits
Special thanks to:
Le Anh Tuan (@latuannetnam) for contributing the HTTP transport, debug logging system, and performance optimizations.
David Szabo-Pele (@davidszp) for the
source_get_contenttool and Linux auth fixes.saitrogen (@saitrogen) for the research polling query fallback fix.
devnull03 (@devnull03) for multi-browser CDP authentication support (Arc, Brave, Edge, Chromium, Vivaldi, Opera).
VooDisss (@VooDisss) for multi-browser authentication improvements.
codepiano (@codepiano) for the configurable DevTools timeout for the auth CLI.
Tony Hansmann (@997unix) for contributing the
nlm setupandnlm doctorcommands and CLI Guide documentation.Fabiana Furtado (@fabianafurtadoff) for batch operations, cross-notebook query, pipelines, and smart select/tagging (PR #90).
Amy-Ra-lph (@Amy-Ra-lph) for security hardening: TOCTOU-safe credential storage, sensitive cookie redaction from debug logs, and pinning all CI actions to full commit SHAs (PRs #205โ207).
Kyle Brodeur (@kylebrodeur) for WSL2 authentication support with Windows Chrome integration (PR #138).
Robiton (@Robiton) for enterprise Gemini Notebook support via configurable base URL (PR #114).
pjeby (@pjeby) for connection pooling and fast startup improvements (PR #54).
beausea (@beausea) for making the interface language configurable via the
NOTEBOOKLM_HLenvironment variable (PR #59).JumpLao (@JumpLao) for extended audio, video, and image format support (PR #82).
cbruyndoncx (@cbruyndoncx) for including
cited_textpassages in query output (PR #81).zxyasfas (@zxyasfas) for cited-only research import (PR #188).
Serdar Akฤฑn (@SERDAR-AKIN) for the multi-probe
AuthHealthCheckerthat fixes false"stale"reports for semi-stale cookies (PR #219).
Star History
License
Available Tools
55 toolsaliasAliasB
Manage aliases: short names that stand in for notebook IDs.
Once an alias exists, any tool's notebook_id can be the alias. Aliases are shared across all profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Alias name (get/set/delete). | |
| value | No | The real ID the alias points to (set). | |
| action | No | list (default) | get | set | delete | list |
| alias_type | No | Optional label, e.g. "notebook" (set). | unknown |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
batchBatchA
Perform batch operations across multiple notebooks.
Actions:
query: Query multiple notebooks with the same question
add_source: Add the same source URL to multiple notebooks
create: Create multiple notebooks at once
delete: Delete multiple notebooks (IRREVERSIBLE, requires confirm=True)
studio: Generate studio artifacts across multiple notebooks
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Apply to ALL notebooks | |
| tags | No | Comma-separated tags to select notebooks | |
| query | No | Question to ask (for action=query) | |
| action | Yes | Operation to perform (query, add_source, create, delete, studio) | |
| titles | No | Comma-separated notebook titles (for action=create) | |
| confirm | No | Must be True for delete action | |
| source_url | No | URL to add (for action=add_source) | |
| artifact_type | No | Artifact type (for action=studio): audio, video, report, etc. | audio |
| notebook_names | No | Comma-separated notebook names or IDs |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_configureChat ConfigureC
Configure notebook chat settings.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | default|learning_guide|custom | default |
| notebook_id | Yes | Notebook UUID | |
| custom_prompt | No | Required when goal=custom (max 10000 chars) | |
| response_length | No | default|longer|shorter | default |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_deleteChat DeleteA
Permanently delete all chat history for a notebook. Requires confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| notebook_id | Yes | Notebook ID or title alias |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_exportChat ExportC
Export a chat transcript to Markdown or JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Export format: 'md' or 'json' (default: 'md') | md |
| notebook_id | Yes | Notebook ID or title alias | |
| conversation_id | No | Optional conversation ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_getChat GetB
Get full transcript of a specific chat session.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | Notebook ID or title alias | |
| conversation_id | No | Optional conversation ID (defaults to latest active session) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_listChat ListA
List chat sessions for a notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max chat sessions to return (default: 20) | |
| notebook_id | Yes | Notebook ID or title alias |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
chat_save_to_noteChat Save To NoteC
Save a chat (or one turn of it) as a Note in the notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| turn | No | 1-indexed turn to save; 0 (default) saves the whole chat | |
| title | No | Optional note title | |
| notebook_id | Yes | Notebook ID or title alias | |
| conversation_id | Yes | Conversation ID (see chat_list) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
collection_createCollection CreateC
Create a new collection.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the collection | |
| notebook_ids | No | List of notebook UUIDs to include in the collection (optional) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
collection_deleteCollection DeleteA
Delete a collection permanently. Notebooks inside the collection are NOT deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| collection_id | Yes | UUID of the collection |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
collection_editCollection EditA
Edit an existing collection's name and/or list of notebooks.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the collection (optional) | |
| notebook_ids | No | New complete list of notebook UUIDs to include (optional) | |
| collection_id | Yes | UUID of the collection |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
collection_listCollection ListA
List all native collections.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
collection_set_emojiCollection Set EmojiA
Set or clear the emoji marker on a collection.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | Yes | Emoji character (use empty string "" to clear) | |
| collection_id | Yes | UUID of the collection |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
cross_notebook_queryCross Notebook QueryA
Query multiple notebooks and get aggregated answers with per-notebook citations.
Specify notebooks by name, by tags, or use all=True for all notebooks.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Query ALL notebooks (use with caution โ rate limits apply) | |
| tags | No | Comma-separated tags to select notebooks (e.g. "ai,mcp") | |
| query | Yes | Question to ask across notebooks | |
| notebook_names | No | Comma-separated notebook names or IDs (e.g. "AI Research, Dev Tools") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
download_all_artifactsDownload All ArtifactsA
Download all completed studio artifacts of one notebook โ or every notebook.
Creates a subdirectory of output_dir named after each notebook title and saves every completed artifact there, named after its title with the type's default extension (report โ .md, mind_map โ .json, video โ .mp4, slide_deck โ .pdf/.pptx, ...). Artifacts that are still generating or failed are skipped and listed in the result. A failure on one artifact (or one notebook in a sweep) does not stop the others.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | No | Base directory for the per-notebook folders, relative to the download directory (default: the download directory itself). Paths outside it are refused; see download_artifact. | . |
| notebook_id | No | Notebook UUID (omit when all_notebooks=True) | |
| all_notebooks | No | Sweep every notebook in the account instead of one | |
| output_format | No | For quiz/flashcards only: json|markdown|html | json |
| skip_existing | No | Skip artifacts whose target file already exists โ makes repeated runs incremental | |
| artifact_types | No | Restrict to these types, e.g. ["video", "slide_deck", "mind_map", "report"]. Default: all types. | |
| slide_deck_format | No | For slide decks only: pdf (default) or pptx |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
download_artifactDownload ArtifactC
Download any NotebookLM artifact to a file.
Unified download tool replacing 9 separate download tools. Supports all artifact types: audio, video, report, mind_map, slide_deck, infographic, data_table, file, quiz, flashcards.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Poll while the artifact download is still propagating | |
| artifact_id | No | Optional specific artifact ID (uses latest if not provided) | |
| notebook_id | Yes | Notebook UUID | |
| output_path | Yes | Where to save the file, relative to the download directory (e.g. "podcast.m4a" or "My Notebook/report.md"). Downloads are confined to that directory; a path outside it is refused. It defaults to ~/Downloads/gemini-notebook and the operator can move it with NOTEBOOKLM_DOWNLOAD_DIR. The saved absolute path comes back in the result. | |
| wait_timeout | No | Service polling budget when ``wait`` is enabled; internal CDN retries and the file transfer can extend total wall time | |
| artifact_type | Yes | Type of artifact to download: - audio: Audio Overview (MP4/MP3) - video: Video Overview (MP4) - report: Report (Markdown) - mind_map: Mind Map (JSON) - slide_deck: Slide Deck (PDF or PPTX) - infographic: Infographic (PNG) - data_table: Data Table (CSV) - data_table_xlsx: Data Table Excel export (XLSX) - file: Generic Studio file export - quiz: Quiz (json|markdown|html) - flashcards: Flashcards (json|markdown|html) | |
| output_format | No | For quiz/flashcards only: json|markdown|html (default: json) | json |
| poll_interval | No | Seconds between readiness checks | |
| slide_deck_format | No | For slide_deck only: pdf (default) or pptx |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
export_artifactExport ArtifactA
Export a NotebookLM artifact to Google Docs or Sheets.
Supports:
Data Tables โ Google Sheets
Reports (Briefing Doc, Study Guide, Blog Post) โ Google Docs
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title for exported document (optional) | |
| artifact_id | Yes | Artifact UUID to export | |
| export_type | Yes | "docs" or "sheets" | |
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
labelLabelA
Manage source labels in a notebook. Unified tool for all label operations.
Labels let you organize sources into thematic categories. Requires 5+ sources for auto-labeling. Sources can belong to multiple labels simultaneously.
Supports: auto, list, reorganize, create, rename, set_emoji, move_source, delete
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label display name (required for create and rename) | |
| emoji | No | Emoji character for set_emoji (e.g. "๐"), or "" to clear | |
| action | Yes | Operation to perform: - auto: AI auto-labels all sources into thematic categories - list: List current labels (triggers AI if none exist) - reorganize: Force AI re-categorization (requires confirm=True unless unlabeled_only=True) - create: Create a new empty label (requires name) - rename: Rename a label (requires label_id, name) - set_emoji: Set or clear emoji on a label (requires label_id, emoji) - move_source: Assign a source to a label (requires label_id, source_id) - delete: Delete label(s) permanently (requires label_id or label_ids, confirm=True) | |
| confirm | No | Must be True for delete action and for reorganize with unlabeled_only=False | |
| label_id | No | Label UUID (required for rename, set_emoji, move_source, delete) | |
| label_ids | No | List of label UUIDs for batch delete (alternative to label_id) | |
| source_id | No | Source UUID to assign (required for move_source) | |
| notebook_id | Yes | Notebook UUID | |
| unlabeled_only | No | For reorganize: if True, only label sources not yet in any label. If False (default), replaces ALL existing labels from scratch (requires confirm=True). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
noteNoteB
Manage notes in a notebook. Unified tool for all note operations.
Supports: create, list, update, delete
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Note title (optional for create/update) | |
| action | Yes | Operation to perform: - create: Create a new note - list: List all notes in notebook - update: Update an existing note - delete: Delete a note permanently (requires confirm=True) | |
| confirm | No | Must be True for delete action | |
| content | No | Note content (required for create, optional for update) | |
| note_id | No | Note UUID (required for update/delete) | |
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_createNotebook CreateB
Create a new notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional title for the notebook |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_deleteNotebook DeleteA
Delete notebook permanently. IRREVERSIBLE. Requires confirm=True.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_describeNotebook DescribeA
Get AI-generated notebook summary with suggested topics.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_getNotebook GetC
Get notebook details with sources.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_listNotebook ListC
List all notebooks.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Maximum number of notebooks to return (default: 100) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_queryNotebook 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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Question to ask | |
| timeout | No | Wall-clock query budget in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0; source-heavy notebooks may need 180+) | |
| source_ids | No | Source IDs to query (default: all) | |
| notebook_id | Yes | Notebook UUID | |
| conversation_id | No | For follow-up questions | |
| new_conversation | No | Start a fresh conversation when conversation_id is omitted |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_query_startNotebook Query StartA
Start a notebook query asynchronously for source-heavy notebooks or long questions.
Use this instead of notebook_query when the response may take longer than the default 120-second budget. A timeout around 180 seconds is a useful starting point for source-heavy notebooks. Returns immediately with a query_id. Poll notebook_query_status with the query_id to get the result.
Workflow: notebook_query_start -> poll notebook_query_status until completed.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Question to ask | |
| timeout | No | Wall-clock query budget in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0; source-heavy notebooks may need 180+) | |
| source_ids | No | Source IDs to query (default: all) | |
| notebook_id | Yes | Notebook UUID | |
| conversation_id | No | For follow-up questions | |
| new_conversation | No | Start a fresh conversation when conversation_id is omitted |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_query_statusNotebook Query StatusA
Check the status of an async notebook query started with notebook_query_start.
Returns the query result when completed, or current status if still in progress. Poll this tool every few seconds until status is 'completed' or 'error'.
| Name | Required | Description | Default |
|---|---|---|---|
| query_id | Yes | The query ID returned by notebook_query_start |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
notebook_renameNotebook RenameC
Rename a notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| new_title | Yes | New title | |
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
pipelinePipelineA
Manage and execute multi-step notebook pipelines.
Actions:
run: Execute a pipeline on a notebook
list: List all available pipelines (builtin and user-defined)
create: Save a user-defined pipeline (pipeline_name + steps; each step is {"action": , "params": {...}})
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Step definitions (required for action=create) | |
| action | Yes | Operation to perform (run, list, create) | |
| input_url | No | URL variable for pipelines that need it (replaces $INPUT_URL) | |
| description | No | Pipeline description (for action=create) | |
| notebook_id | No | Target notebook UUID (required for action=run) | |
| pipeline_name | No | Pipeline name (required for action=run, e.g. "ingest-and-podcast") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
profileProfileB
List saved Google accounts (profiles) and choose which one to use.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Profile name for status / switch. | |
| action | No | list (default) | status | switch - list: every saved profile with email, storage mode, and which is active - status: storage details for `name` (or the active profile); metadata only - switch: use profile `name` for every later tool call until this MCP server restarts. In apps that share one server across chats (e.g. Claude Desktop), other open chats switch too. | list |
| make_default | No | Only with action="switch". False (default) leaves the saved default alone. True ALSO makes it the saved default for the CLI and every future session - only when the user explicitly asks to change their default account. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
refresh_authRefresh AuthA
Reload auth for the requested profile without switching the active account.
Call this after running nlm login to pick up new tokens,
or attempt headless recovery with the profile's saved browser.
An explicit profile does not switch the MCP server's active account.
Returns status indicating if tokens were refreshed successfully.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
reportReportC
Work with an interactive report's embedded elements. Unified report tool.
Create the report itself with studio_create(artifact_type="report", report_format="Interactive"). Then:
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | (generate) list of {"element_id", "steering_prompt"?, "settings"?}. Omit steering_prompt to use the element's saved prompt or card description. settings use names from action="elements". Sources and language come from the report. | |
| action | Yes | Operation to perform: - get: report markdown, prompt, language, source_ids, parse_status and every element - elements: list elements; each has element_id, type (audio|video| slide_deck|infographic|flashcards|quiz|mind_map|unsupported), element_status, description (card recommendation), section ({heading, text} it sits in, or null) and settings (allowed values + defaults). Optional wait_for / timeout / include_content. - generate: validate or run a plan of 1-20 elements (see plan) | |
| confirm | No | (generate) without it the plan is only validated and returned with generations_to_start for the user's approval; with confirm=True every item is started. One item's failure does not stop others; a quota/auth failure stops the rest (stopped_reason). outcome per item: started | failed | unknown (kickoff response lost; NOT re-sent) | not_started. Never set confirm=True unless the user approved this exact plan or explicitly delegated choosing AND generating. | |
| timeout | No | (elements) max seconds to wait (default 600); timed_out=true is not an error | |
| language | No | (generate) BCP-47 override (default: the report's language) | |
| wait_for | No | (elements) element ids to wait on, list or comma-separated; returns when all are completed/failed/suggested/missing or timeout | |
| artifact_id | Yes | Interactive report artifact UUID | |
| notebook_id | Yes | Notebook UUID | |
| include_content | No | (elements) inline content of completed quiz/flashcards/ mind map for review. Review is against the plan and section, not the original sources. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
research_importResearch ImportA
Import discovered sources into notebook.
Call after research_status shows status="completed".
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Research task ID | |
| timeout | No | Import timeout in seconds (default: 300, increase for large notebooks) | |
| cited_only | No | Import only sources cited by the research report. Overrides source_indices when enabled. | |
| notebook_id | Yes | Notebook UUID | |
| source_indices | No | Source indices to import (default: all) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
research_startResearch 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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | fast (~30s, ~10 sources) | deep (~5min, ~40 sources, web only) | fast |
| query | Yes | What to search for (e.g. "quantum computing advances") | |
| title | No | Title for new notebook | |
| source | No | web|drive (where to search) | web |
| notebook_id | No | Existing notebook (creates new if not provided) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
research_statusResearch StatusA
Poll research progress. Blocks until complete or timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional query text for fallback matching when task_id changes (deep research). Contributed by @saitrogen (PR #15). | |
| compact | No | If True (default), truncate report and limit sources shown to save tokens. Use compact=False to get full details. | |
| task_id | No | Optional Task ID to poll for a specific research task. | |
| max_wait | No | Max seconds to wait (default: 900, 0=single poll) | |
| auto_import | No | If True, automatically import sources when research completes. If False (default), returns next_action hint to call research_import manually. | |
| notebook_id | Yes | Notebook UUID | |
| poll_interval | No | Seconds between polls (default: 30) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
save_auth_tokensSave Auth TokensA
Save NotebookLM cookies (FALLBACK method - try nlm login first!).
IMPORTANT FOR AI ASSISTANTS:
First, run
nlm loginvia Bash/terminal (automated, preferred)Only use this tool if the automated CLI fails
| Name | Required | Description | Default |
|---|---|---|---|
| cookies | Yes | Cookie header from Chrome DevTools (only needed if CLI fails) | |
| csrf_token | No | Deprecated - auto-extracted | |
| session_id | No | Deprecated - auto-extracted | |
| request_url | No | Optional - contains session ID if extracting manually | |
| request_body | No | Optional - contains CSRF if extracting manually |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
server_infoServer InfoA
Get version, auth status, and conservative MCP capability visibility.
AI assistants: If update_available is True, inform the user that a new version is available and suggest updating with the provided command.
auth_status is the result of an AuthHealthChecker probe. The checker
runs a multi-probe strategy (homepage fetch + API fallback) with
30-second TTL caching and mtime-based bypass on auth-file changes.
The reported value may therefore be up to 30 seconds old, and an
external nlm login is picked up within one check cycle without
waiting for the TTL to expire.
auth_status meanings:
"configured" โ homepage (or API fallback) check passed; credentials are good. Cached credentials may be reported as configured for up to 30 seconds.
"not_configured" โ no credentials are stored (first-time setup).
"stale" โ credentials are known-bad (expired or past the 7-day heuristic). Operations will fail; ask the user to run
nlm loginto refresh."unverified" โ the check could not be completed (network error, timeout, non-200 response). Cached credentials may still work for actual API calls, so do not assume the user needs to re-auth.
"error" โ unexpected exception inside the check itself.
Returns: dict with version info: - version: Current installed version - latest_version: Latest version on PyPI (or None if check failed) - update_available: True if a newer version is available - auth_status: configured | stale | unverified | not_configured | error - storage_warning: Short warning if conflict/pending op exists (or None) - update_command: Command to run to update - mcp_capabilities: Built-in tool groups visible in this server process - provider_capabilities: Explicitly unprobed provider/account capabilities
active_profile: Which saved account is in use and why (session switch or saved default)
profiles: Saved accounts with email, storage mode (plain/protected) and any storage problems. Metadata only; never opens the OS keystore.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_addSource AddA
Add a source to a notebook. Unified tool for all source types.
Supports: url, text, drive, file
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to add (for source_type=url) | |
| text | No | Text content to add (for source_type=text) | |
| urls | No | List of URLs to add in bulk (for source_type=url, alternative to url) | |
| wait | No | If True, wait for source processing to complete before returning | |
| title | No | Display title (for text sources) | |
| doc_type | No | Drive doc type: doc|slides|sheets|pdf (for source_type=drive) | doc |
| file_path | No | Local file path on the machine running the MCP server (for source_type=file). A path on a different client/agent host is not accessible to the server. | |
| document_id | No | Google Drive document ID (for source_type=drive) | |
| notebook_id | Yes | Notebook UUID | |
| source_type | Yes | Type of source to add: - url: Web page or YouTube URL - text: Pasted text content - drive: Google Drive document - file: Local file upload. The canonical local-admission contract has 43 case-insensitive extensions. Admission does not guarantee provider processing success for an individual file. OFFICIAL_FILE_EXTENSIONS: .pdf, .txt, .md, .docx, .csv, .pptx, .epub, .avif, .bmp, .gif, .heic, .heif, .ico, .jp2, .jpe, .jpeg, .jpg, .png, .tif, .tiff, .webp, .3g2, .3gp, .aac, .aif, .aifc, .aiff, .amr, .au, .avi, .cda, .m4a, .mid, .mp3, .mp4, .mpeg, .ogg, .opus, .ra, .ram, .snd, .wav, .wma Image-bearing sources may feed Studio video generation's visual-crop pipeline; charts, photos, and diagrams may be extracted as on-screen aids. | |
| wait_timeout | No | Max seconds to wait if wait=True (default 120) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_deleteSource DeleteA
Delete source(s) permanently. IRREVERSIBLE. Requires confirm=True.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| source_id | No | Source UUID to delete (single) | |
| source_ids | No | List of source UUIDs to delete (bulk, alternative to source_id) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_describeSource DescribeB
Get AI-generated source summary with keyword chips.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | Source UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_get_contentSource 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.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Poll until indexed content is available | |
| source_id | Yes | Source UUID | |
| wait_timeout | No | Maximum seconds to wait when ``wait`` is enabled | |
| poll_interval | No | Seconds between readiness checks |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_list_driveSource List DriveA
List sources with types and Drive freshness status.
Use before source_sync_drive to identify stale sources.
Returned Drive sources include can_sync to identify files eligible
for a manual Drive sync attempt. An individual sync attempt may still fail.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | Notebook UUID | |
| skip_freshness | No | If True, skip per-source freshness checks for faster listing |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_renameSource RenameB
Rename a source in a notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| new_title | Yes | New display title for the source | |
| source_id | Yes | Source UUID to rename | |
| notebook_id | Yes | Notebook UUID containing the source |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_searchSource SearchA
Search relevant indexed passages within one NotebookLM notebook (read-only).
Optional source_ids restrict retrieval to sources belonging to this notebook. Returns at most 20 excerpted passages with native source UUIDs and titles. No Gemini or Opal credentials are used. Experimental, off by default.
Set NOTEBOOKLM_ENABLE_NATIVE_SOURCE_SEARCH=1 in the server environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| source_ids | No | ||
| max_results | No | ||
| notebook_id | Yes | ||
| snippet_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
source_sync_driveSource Sync DriveA
Sync Drive sources with latest content. Requires confirm=True.
Call source_list_drive first to identify stale sources.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| source_ids | Yes | Source UUIDs to sync |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
studio_createStudio CreateC
Create any NotebookLM studio artifact. Unified creation tool.
Supports: audio, video, infographic, slide_deck, report, flashcards, quiz, data_table, mind_map
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Mind Map | |
| confirm | No | Must be True after user approval | |
| language | No | ||
| difficulty | No | medium | |
| source_ids | No | Source IDs to use (default: all sources) | |
| description | No | ||
| notebook_id | Yes | Notebook UUID | |
| orientation | No | landscape | |
| audio_format | No | deep_dive | |
| audio_length | No | default | |
| detail_level | No | standard | |
| focus_prompt | No | ||
| slide_format | No | detailed_deck | |
| slide_length | No | default | |
| video_format | No | explainer | |
| visual_style | No | auto_select | |
| artifact_type | Yes | Type of artifact to create: - audio: Audio Overview (podcast) - video: Video Overview - infographic: Visual infographic - slide_deck: Presentation slides (PDF) - report: Text report (Briefing Doc, Study Guide, etc.) - flashcards: Study flashcards - quiz: Multiple choice quiz - data_table: Structured data table - mind_map: Visual mind map | |
| custom_prompt | No | ||
| report_format | No | Briefing Doc | |
| question_count | No | ||
| report_template | No | learning_overview | |
| infographic_style | No | auto_select | |
| video_style_prompt | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
studio_deleteStudio DeleteA
Delete studio artifact. IRREVERSIBLE. Requires confirm=True.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| artifact_id | Yes | Artifact UUID (from studio_status) | |
| notebook_id | Yes | Notebook UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
studio_reviseStudio ReviseA
Revise individual slides in an existing slide deck. Creates a NEW artifact.
Only slide decks support revision. The original artifact is not modified. Poll studio_status after calling to check when the new deck is ready.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True after user approval | |
| artifact_id | Yes | UUID of the existing slide deck to revise (from studio_status) | |
| notebook_id | Yes | Notebook UUID | |
| slide_instructions | Yes | List of revision instructions, each with: - slide: Slide number (1-based, slide 1 = first slide) - instruction: Text describing the desired change Example: [{"slide": 1, "instruction": "Make the title larger"}] |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
studio_statusStudio StatusC
Check studio content generation status and get URLs, or rename an artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum artifacts to return for status (1-100, default 20) | |
| action | No | Action to perform: - status (default): List all artifacts with their status and URLs - rename: Rename an artifact (requires artifact_id and new_title) - list_types: List all supported artifact types with their options | status |
| offset | No | Number of artifacts to skip for status pagination | |
| new_title | No | Required for action="rename" - the new title for the artifact | |
| artifact_id | No | For status, return only this artifact. Required for action="rename". | |
| notebook_id | Yes | Notebook UUID | |
| include_details | No | Include prompts, source IDs, report content, and media details |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
tagTagA
Manage notebook tags and find relevant notebooks by tag matching.
Actions:
add: Add tags to a notebook for smart selection
remove: Remove tags from a notebook
list: List all tagged notebooks with their tags
select: Find notebooks relevant to a query using tag matching
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated tags (required for add, remove; e.g. "ai,research,llm") | |
| query | No | Search query (required for select; e.g. "ai mcp" or "ai,mcp") | |
| action | Yes | Operation to perform (add, remove, list, select) | |
| notebook_id | No | Notebook UUID (required for add, remove) | |
| notebook_title | No | Optional display title (for add) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
usage_getUsage GetA
Show how much of the plan's usage allowance is left, and when it resets.
Gemini Notebook meters usage as compute against two windows at once: a short rolling window and a weekly one. Both are reported, each with the percentage used, the percentage remaining and the reset time in UTC.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Saved account profile, e.g. "work" or "personal". Overrides environment cookies for this call without switching the default account. Omit to use the MCP server's current authentication. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.16.0- Added
chat_delete - Added
source_search
1 tool update
v0.15.6- Changed
refresh_auth1 field changed- added
Input schema / properties / profileAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +}
4 tool updates
v0.15.1- Added
alias - Added
chat_save_to_note - Changed
pipeline3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Operation to perform (run, list)"New value: +"Operation to perform (run, list, create)" - added
Input schema / properties / descriptionAdded value: +{ + "default": "", + "description": "Pipeline description (for action=create)", + "type": "string" +} - added
Input schema / properties / stepsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Step definitions (required for action=create)" +}
- Added
profile
1 tool update
v0.13.0- Changed
download_artifact1 field changed- changed
Input schema / properties / wait_timeout / descriptionPrevious value: -"Maximum seconds to wait when ``wait`` is enabled"New value: +"Service polling budget when ``wait`` is enabled; internal\nCDN retries and the file transfer can extend total wall time"
2 tool updates
v0.12.0- Added
report - Changed
studio_create1 field changed- added
Input schema / properties / report_templateAdded value: +{ + "default": "learning_overview", + "type": "string" +}
1 tool update
v0.11.4- Changed
usage_get1 field changed- added
Input schema / properties / profileAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Saved account profile, e.g. \"work\" or \"personal\". Overrides\nenvironment cookies for this call without switching the default\naccount. Omit to use the MCP server's current authentication." +}
1 tool update
v0.11.3- Added
usage_get
45 tool updates
v0.11.2- Changed
batch9 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation to perform (query, add_source, create, delete, studio)" - added
Input schema / properties / all / descriptionAdded value: +"Apply to ALL notebooks" - added
Input schema / properties / artifact_type / descriptionAdded value: +"Artifact type (for action=studio): audio, video, report, etc." - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True for delete action" - added
Input schema / properties / notebook_names / descriptionAdded value: +"Comma-separated notebook names or IDs" - added
Input schema / properties / query / descriptionAdded value: +"Question to ask (for action=query)" - added
Input schema / properties / source_url / descriptionAdded value: +"URL to add (for action=add_source)" - added
Input schema / properties / tags / descriptionAdded value: +"Comma-separated tags to select notebooks" - added
Input schema / properties / titles / descriptionAdded value: +"Comma-separated notebook titles (for action=create)"
- Changed
chat_configure4 fields changed- added
Input schema / properties / custom_prompt / descriptionAdded value: +"Required when goal=custom (max 10000 chars)" - added
Input schema / properties / goal / descriptionAdded value: +"default|learning_guide|custom" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / response_length / descriptionAdded value: +"default|longer|shorter"
- Changed
chat_export3 fields changed- added
Input schema / properties / conversation_id / descriptionAdded value: +"Optional conversation ID" - added
Input schema / properties / format / descriptionAdded value: +"Export format: 'md' or 'json' (default: 'md')" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook ID or title alias"
- Changed
chat_get2 fields changed- added
Input schema / properties / conversation_id / descriptionAdded value: +"Optional conversation ID (defaults to latest active session)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook ID or title alias"
- Changed
chat_list2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Max chat sessions to return (default: 20)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook ID or title alias"
- Changed
collection_create2 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Name of the collection" - added
Input schema / properties / notebook_ids / descriptionAdded value: +"List of notebook UUIDs to include in the collection (optional)"
- Changed
collection_delete2 fields changed- added
Input schema / properties / collection_id / descriptionAdded value: +"UUID of the collection" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval"
- Changed
collection_edit3 fields changed- added
Input schema / properties / collection_id / descriptionAdded value: +"UUID of the collection" - added
Input schema / properties / name / descriptionAdded value: +"New name for the collection (optional)" - added
Input schema / properties / notebook_ids / descriptionAdded value: +"New complete list of notebook UUIDs to include (optional)"
- Changed
collection_set_emoji2 fields changed- added
Input schema / properties / collection_id / descriptionAdded value: +"UUID of the collection" - added
Input schema / properties / emoji / descriptionAdded value: +"Emoji character (use empty string \"\" to clear)"
- Changed
cross_notebook_query4 fields changed- added
Input schema / properties / all / descriptionAdded value: +"Query ALL notebooks (use with caution โ rate limits apply)" - added
Input schema / properties / notebook_names / descriptionAdded value: +"Comma-separated notebook names or IDs (e.g. \"AI Research, Dev Tools\")" - added
Input schema / properties / query / descriptionAdded value: +"Question to ask across notebooks" - added
Input schema / properties / tags / descriptionAdded value: +"Comma-separated tags to select notebooks (e.g. \"ai,mcp\")"
- Changed
download_all_artifacts7 fields changed- added
Input schema / properties / all_notebooks / descriptionAdded value: +"Sweep every notebook in the account instead of one" - added
Input schema / properties / artifact_types / descriptionAdded value: +"Restrict to these types, e.g. [\"video\", \"slide_deck\",\n\"mind_map\", \"report\"]. Default: all types." - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID (omit when all_notebooks=True)" - added
Input schema / properties / output_dir / descriptionAdded value: +"Base directory for the per-notebook folders, relative to\nthe download directory (default: the download directory itself).\nPaths outside it are refused; see download_artifact." - added
Input schema / properties / output_format / descriptionAdded value: +"For quiz/flashcards only: json|markdown|html" - added
Input schema / properties / skip_existing / descriptionAdded value: +"Skip artifacts whose target file already exists โ\nmakes repeated runs incremental" - added
Input schema / properties / slide_deck_format / descriptionAdded value: +"For slide decks only: pdf (default) or pptx"
- Changed
download_artifact9 fields changed- added
Input schema / properties / artifact_id / descriptionAdded value: +"Optional specific artifact ID (uses latest if not provided)" - added
Input schema / properties / artifact_type / descriptionAdded value: +"Type of artifact to download:\n- audio: Audio Overview (MP4/MP3)\n- video: Video Overview (MP4)\n- report: Report (Markdown)\n- mind_map: Mind Map (JSON)\n- slide_deck: Slide Deck (PDF or PPTX)\n- infographic: Infographic (PNG)\n- data_table: Data Table (CSV)\n- data_table_xlsx: Data Table Excel export (XLSX)\n- file: Generic Studio file export\n- quiz: Quiz (json|markdown|html)\n- flashcards: Flashcards (json|markdown|html)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / output_format / descriptionAdded value: +"For quiz/flashcards only: json|markdown|html (default: json)" - added
Input schema / properties / output_path / descriptionAdded value: +"Where to save the file, relative to the download\ndirectory (e.g. \"podcast.m4a\" or \"My Notebook/report.md\").\nDownloads are confined to that directory; a path outside it is\nrefused. It defaults to ~/Downloads/gemini-notebook and the\noperator can move it with NOTEBOOKLM_DOWNLOAD_DIR. The saved\nabsolute path comes back in the result." - added
Input schema / properties / poll_interval / descriptionAdded value: +"Seconds between readiness checks" - added
Input schema / properties / slide_deck_format / descriptionAdded value: +"For slide_deck only: pdf (default) or pptx" - added
Input schema / properties / wait / descriptionAdded value: +"Poll while the artifact download is still propagating" - added
Input schema / properties / wait_timeout / descriptionAdded value: +"Maximum seconds to wait when ``wait`` is enabled"
- Changed
export_artifact4 fields changed- added
Input schema / properties / artifact_id / descriptionAdded value: +"Artifact UUID to export" - added
Input schema / properties / export_type / descriptionAdded value: +"\"docs\" or \"sheets\"" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / title / descriptionAdded value: +"Title for exported document (optional)"
- Changed
label9 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation to perform:\n- auto: AI auto-labels all sources into thematic categories\n- list: List current labels (triggers AI if none exist)\n- reorganize: Force AI re-categorization (requires confirm=True unless unlabeled_only=True)\n- create: Create a new empty label (requires name)\n- rename: Rename a label (requires label_id, name)\n- set_emoji: Set or clear emoji on a label (requires label_id, emoji)\n- move_source: Assign a source to a label (requires label_id, source_id)\n- delete: Delete label(s) permanently (requires label_id or label_ids, confirm=True)" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True for delete action and for reorganize with unlabeled_only=False" - added
Input schema / properties / emoji / descriptionAdded value: +"Emoji character for set_emoji (e.g. \"๐\"), or \"\" to clear" - added
Input schema / properties / label_id / descriptionAdded value: +"Label UUID (required for rename, set_emoji, move_source, delete)" - added
Input schema / properties / label_ids / descriptionAdded value: +"List of label UUIDs for batch delete (alternative to label_id)" - added
Input schema / properties / name / descriptionAdded value: +"Label display name (required for create and rename)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / source_id / descriptionAdded value: +"Source UUID to assign (required for move_source)" - added
Input schema / properties / unlabeled_only / descriptionAdded value: +"For reorganize: if True, only label sources not yet in any label.\nIf False (default), replaces ALL existing labels from scratch (requires confirm=True)."
- Changed
note6 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation to perform:\n- create: Create a new note\n- list: List all notes in notebook\n- update: Update an existing note\n- delete: Delete a note permanently (requires confirm=True)" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True for delete action" - added
Input schema / properties / content / descriptionAdded value: +"Note content (required for create, optional for update)" - added
Input schema / properties / note_id / descriptionAdded value: +"Note UUID (required for update/delete)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / title / descriptionAdded value: +"Note title (optional for create/update)"
- Changed
notebook_create1 field changed- added
Input schema / properties / title / descriptionAdded value: +"Optional title for the notebook"
- Changed
notebook_delete2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
notebook_describe1 field changed- added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
notebook_get1 field changed- added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
notebook_list1 field changed- added
Input schema / properties / max_results / descriptionAdded value: +"Maximum number of notebooks to return (default: 100)"
- Changed
notebook_query6 fields changed- added
Input schema / properties / conversation_id / descriptionAdded value: +"For follow-up questions" - added
Input schema / properties / new_conversation / descriptionAdded value: +"Start a fresh conversation when conversation_id is omitted" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / query / descriptionAdded value: +"Question to ask" - added
Input schema / properties / source_ids / descriptionAdded value: +"Source IDs to query (default: all)" - added
Input schema / properties / timeout / descriptionAdded value: +"Wall-clock query budget in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0; source-heavy notebooks may need 180+)"
- Changed
notebook_query_start6 fields changed- added
Input schema / properties / conversation_id / descriptionAdded value: +"For follow-up questions" - added
Input schema / properties / new_conversation / descriptionAdded value: +"Start a fresh conversation when conversation_id is omitted" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / query / descriptionAdded value: +"Question to ask" - added
Input schema / properties / source_ids / descriptionAdded value: +"Source IDs to query (default: all)" - added
Input schema / properties / timeout / descriptionAdded value: +"Wall-clock query budget in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0; source-heavy notebooks may need 180+)"
- Changed
notebook_query_status1 field changed- added
Input schema / properties / query_id / descriptionAdded value: +"The query ID returned by notebook_query_start"
- Changed
notebook_rename2 fields changed- added
Input schema / properties / new_title / descriptionAdded value: +"New title" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
notebook_share_batch3 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / recipients / descriptionAdded value: +"List of dicts, each with 'email' (str) and optional 'role' (str).\n Role defaults to 'viewer'. Example: [{\"email\": \"a@b.com\", \"role\": \"editor\"}]"
- Changed
notebook_share_invite3 fields changed- added
Input schema / properties / email / descriptionAdded value: +"Email address to invite" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / role / descriptionAdded value: +"\"viewer\" or \"editor\" (default: viewer)"
- Changed
notebook_share_public2 fields changed- added
Input schema / properties / is_public / descriptionAdded value: +"True to enable public link, False to disable (default: True)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
notebook_share_status1 field changed- added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
pipeline4 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation to perform (run, list)" - added
Input schema / properties / input_url / descriptionAdded value: +"URL variable for pipelines that need it (replaces $INPUT_URL)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Target notebook UUID (required for action=run)" - added
Input schema / properties / pipeline_name / descriptionAdded value: +"Pipeline name (required for action=run, e.g. \"ingest-and-podcast\")"
- Changed
research_import5 fields changed- added
Input schema / properties / cited_only / descriptionAdded value: +"Import only sources cited by the research report.\nOverrides source_indices when enabled." - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / source_indices / descriptionAdded value: +"Source indices to import (default: all)" - added
Input schema / properties / task_id / descriptionAdded value: +"Research task ID" - added
Input schema / properties / timeout / descriptionAdded value: +"Import timeout in seconds (default: 300, increase for large notebooks)"
- Changed
research_start5 fields changed- added
Input schema / properties / mode / descriptionAdded value: +"fast (~30s, ~10 sources) | deep (~5min, ~40 sources, web only)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Existing notebook (creates new if not provided)" - added
Input schema / properties / query / descriptionAdded value: +"What to search for (e.g. \"quantum computing advances\")" - added
Input schema / properties / source / descriptionAdded value: +"web|drive (where to search)" - added
Input schema / properties / title / descriptionAdded value: +"Title for new notebook"
- Changed
research_status7 fields changed- added
Input schema / properties / auto_import / descriptionAdded value: +"If True, automatically import sources when research completes.\n If False (default), returns next_action hint to call research_import manually." - added
Input schema / properties / compact / descriptionAdded value: +"If True (default), truncate report and limit sources shown to save tokens.\n Use compact=False to get full details." - added
Input schema / properties / max_wait / descriptionAdded value: +"Max seconds to wait (default: 900, 0=single poll)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / poll_interval / descriptionAdded value: +"Seconds between polls (default: 30)" - added
Input schema / properties / query / descriptionAdded value: +"Optional query text for fallback matching when task_id changes (deep research).\nContributed by @saitrogen (PR #15)." - added
Input schema / properties / task_id / descriptionAdded value: +"Optional Task ID to poll for a specific research task."
- Changed
save_auth_tokens5 fields changed- added
Input schema / properties / cookies / descriptionAdded value: +"Cookie header from Chrome DevTools (only needed if CLI fails)" - added
Input schema / properties / csrf_token / descriptionAdded value: +"Deprecated - auto-extracted" - added
Input schema / properties / request_body / descriptionAdded value: +"Optional - contains CSRF if extracting manually" - added
Input schema / properties / request_url / descriptionAdded value: +"Optional - contains session ID if extracting manually" - added
Input schema / properties / session_id / descriptionAdded value: +"Deprecated - auto-extracted"
- Changed
source_add11 fields changed- added
Input schema / properties / doc_type / descriptionAdded value: +"Drive doc type: doc|slides|sheets|pdf (for source_type=drive)" - added
Input schema / properties / document_id / descriptionAdded value: +"Google Drive document ID (for source_type=drive)" - added
Input schema / properties / file_path / descriptionAdded value: +"Local file path on the machine running the MCP server\n(for source_type=file). A path on a different client/agent host\nis not accessible to the server." - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / source_type / descriptionAdded value: +"Type of source to add:\n- url: Web page or YouTube URL\n- text: Pasted text content\n- drive: Google Drive document\n- file: Local file upload. The canonical local-admission contract has\n 43 case-insensitive extensions. Admission does not guarantee provider\n processing success for an individual file.\n OFFICIAL_FILE_EXTENSIONS: .pdf, .txt, .md, .docx, .csv, .pptx, .epub, .avif, .bmp, .gif, .heic, .heif, .ico, .jp2, .jpe, .jpeg, .jpg, .png, .tif, .tiff, .webp, .3g2, .3gp, .aac, .aif, .aifc, .aiff, .amr, .au, .avi, .cda, .m4a, .mid, .mp3, .mp4, .mpeg, .ogg, .opus, .ra, .ram, .snd, .wav, .wma\n Image-bearing sources may feed Studio video generation's visual-crop\n pipeline; charts, photos, and diagrams may be extracted as on-screen aids." - added
Input schema / properties / text / descriptionAdded value: +"Text content to add (for source_type=text)" - added
Input schema / properties / title / descriptionAdded value: +"Display title (for text sources)" - added
Input schema / properties / url / descriptionAdded value: +"URL to add (for source_type=url)" - added
Input schema / properties / urls / descriptionAdded value: +"List of URLs to add in bulk (for source_type=url, alternative to url)" - added
Input schema / properties / wait / descriptionAdded value: +"If True, wait for source processing to complete before returning" - added
Input schema / properties / wait_timeout / descriptionAdded value: +"Max seconds to wait if wait=True (default 120)"
- Changed
source_delete3 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / source_id / descriptionAdded value: +"Source UUID to delete (single)" - added
Input schema / properties / source_ids / descriptionAdded value: +"List of source UUIDs to delete (bulk, alternative to source_id)"
- Changed
source_describe1 field changed- added
Input schema / properties / source_id / descriptionAdded value: +"Source UUID"
- Changed
source_get_content4 fields changed- added
Input schema / properties / poll_interval / descriptionAdded value: +"Seconds between readiness checks" - added
Input schema / properties / source_id / descriptionAdded value: +"Source UUID" - added
Input schema / properties / wait / descriptionAdded value: +"Poll until indexed content is available" - added
Input schema / properties / wait_timeout / descriptionAdded value: +"Maximum seconds to wait when ``wait`` is enabled"
- Changed
source_list_drive2 fields changed- added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / skip_freshness / descriptionAdded value: +"If True, skip per-source freshness checks for faster listing"
- Changed
source_rename3 fields changed- added
Input schema / properties / new_title / descriptionAdded value: +"New display title for the source" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID containing the source" - added
Input schema / properties / source_id / descriptionAdded value: +"Source UUID to rename"
- Changed
source_sync_drive2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / source_ids / descriptionAdded value: +"Source UUIDs to sync"
- Changed
studio_create4 fields changed- added
Input schema / properties / artifact_type / descriptionAdded value: +"Type of artifact to create:\n- audio: Audio Overview (podcast)\n- video: Video Overview\n- infographic: Visual infographic\n- slide_deck: Presentation slides (PDF)\n- report: Text report (Briefing Doc, Study Guide, etc.)\n- flashcards: Study flashcards\n- quiz: Multiple choice quiz\n- data_table: Structured data table\n- mind_map: Visual mind map" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / source_ids / descriptionAdded value: +"Source IDs to use (default: all sources)"
- Changed
studio_delete3 fields changed- added
Input schema / properties / artifact_id / descriptionAdded value: +"Artifact UUID (from studio_status)" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID"
- Changed
studio_revise4 fields changed- added
Input schema / properties / artifact_id / descriptionAdded value: +"UUID of the existing slide deck to revise (from studio_status)" - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True after user approval" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / slide_instructions / descriptionAdded value: +"List of revision instructions, each with:\n- slide: Slide number (1-based, slide 1 = first slide)\n- instruction: Text describing the desired change\nExample: [{\"slide\": 1, \"instruction\": \"Make the title larger\"}]"
- Changed
studio_status7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Action to perform:\n- status (default): List all artifacts with their status and URLs\n- rename: Rename an artifact (requires artifact_id and new_title)\n- list_types: List all supported artifact types with their options" - added
Input schema / properties / artifact_id / descriptionAdded value: +"For status, return only this artifact. Required for action=\"rename\"." - added
Input schema / properties / include_details / descriptionAdded value: +"Include prompts, source IDs, report content, and media details" - added
Input schema / properties / limit / descriptionAdded value: +"Maximum artifacts to return for status (1-100, default 20)" - added
Input schema / properties / new_title / descriptionAdded value: +"Required for action=\"rename\" - the new title for the artifact" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID" - added
Input schema / properties / offset / descriptionAdded value: +"Number of artifacts to skip for status pagination"
- Changed
tag5 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation to perform (add, remove, list, select)" - added
Input schema / properties / notebook_id / descriptionAdded value: +"Notebook UUID (required for add, remove)" - added
Input schema / properties / notebook_title / descriptionAdded value: +"Optional display title (for add)" - added
Input schema / properties / query / descriptionAdded value: +"Search query (required for select; e.g. \"ai mcp\" or \"ai,mcp\")" - added
Input schema / properties / tags / descriptionAdded value: +"Comma-separated tags (required for add, remove; e.g. \"ai,research,llm\")"
5 tool updates
v0.9.14- Added
collection_create - Added
collection_delete - Added
collection_edit - Added
collection_list - Added
collection_set_emoji
TDQS
Scored across 55 tools
Several tools have overlapping or hard-to-distinguish retrieval/organization purposes: notebook_query, source_search, cross_notebook_query, batch query, and research_start all relate to finding or asking about content. Vague unified tools like alias, tag, note, pipeline, label, report, batch, and profile require action parameters and add ambiguity, while profile/active_profile/profiles are especially easy to confuse.
Most resource-specific tools use a readable noun_verb pattern (notebook_create, source_add, studio_status), but many unified tools are bare nouns or vague action containers (alias, tag, note, pipeline, label, report, batch, profile). The mix of noun_verb, verb_noun, and single-word names is understandable but not predictable.
With 55 tools, the surface is far too large for a coherent MCP server. Many variants and unified action tools could be consolidated into fewer, better-scoped tools.
Coverage is broad: notebooks, sources, chat, studio artifacts, research, collections, tags, labels, sharing, auth, batch operations, and usage are all represented. Minor lifecycle gaps remain, such as limited collection retrieval or source content update, but the core NotebookLM workflows are well covered.
Maintenance
Related MCP Connectors
Google NotebookLM via natural language: create notebooks, add sources (PDF, URL, YouTube) and ask gr
Google Gemini Notebook (NotebookLM): notebooks, sources, cited chat, podcasts, video, slides
Enables AI assistants to retrieve event data and execute event management operations in Nunify.
Create and manage documents, spreadsheets, and presentations from your AI assistant.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceEnables 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.323MIT
- AlicenseAqualityDmaintenanceEnables 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.32MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to programmatically access and control Google NotebookLM, supporting operations like notebook management, source addition, audio generation, and more via natural language.39MIT
- AlicenseAqualityDmaintenanceEnables AI agents to interact with Google NotebookLM, including listing and managing notebooks and sources, asking grounded questions with citations, and generating audio overviews, briefings, quizzes, and mind maps.13MIT









