MCP server for NotebookLM - Let your AI agents (Claude Code, Codex) research documentation directly with grounded, citation-backed answers from Gemini. Persistent auth, library management, cross-client sharing. Zero hallucinations, just your knowledge base.
# NotebookLM MCP Server
[](https://www.npmjs.com/package/notebooklm-mcp)
[](https://www.typescriptlang.org/)
[](https://modelcontextprotocol.io/)
[](./LICENSE)
MCP server for Google NotebookLM. It drives a real Chrome via Patchright (stealth + persistent fingerprint) so an agent can chat against a notebook, ingest sources, generate audio overviews, and read DOM-level citations. Two transports are supported: `stdio` (default) and Streamable-HTTP. v2.0.0 is the current line; v1 is no longer supported.
- [Requirements](#requirements--platform-support)
- [Install](#install)
- [Connect](#connect-to-claude-code) — Claude Code, Cursor, Codex, generic MCP
- [Authentication](#authentication)
- [Transports](#transports)
- [Multi-account](#multi-account)
- [Tools](#tools)
- [Profiles](#tool-profiles)
- [Citations](#citations)
- [Provenance & AI marker](#provenance--ai-marker)
- [Configuration reference](#configuration-reference)
- [Development](#development)
- [Migration from v1](#changelog--migration)
---
## Requirements & Platform Support
- **Node.js** ≥ 18.
- **Chrome** (stable channel) preferred. The bundled Patchright Chromium is used as a fallback when Chrome refuses to launch — set `BROWSER_CHANNEL=chromium` to force it.
- **Linux / macOS / Windows.**
- **WSL2 + WSLg** (Windows 11+) is fully supported. WSL1 cannot launch a Chromium and is not supported — upgrade to WSL2.
- **Headless Linux servers**: the one-time `setup_auth` needs a display because the login flow opens a visible window. Run it once under `xvfb-run` (`xvfb-run -a npx notebooklm-mcp`). After login, the persistent Chrome profile lets every subsequent run go fully headless.
---
## Install
### Published package
```bash
npx notebooklm-mcp@latest
```
This is the recommended path for end users. `npx` keeps the binary cached and self-updates on `@latest`.
### From source
```bash
git clone https://github.com/PleasePrompto/notebooklm-mcp
cd notebooklm-mcp
npm install
npm run build
node dist/index.js
```
The `prepare` script also runs `npm run build`, so a fresh `npm install` produces a runnable `dist/index.js`.
---
## Connect to Claude Code
CLI form:
```bash
claude mcp add notebooklm -- npx notebooklm-mcp@latest
# or, from a local clone:
claude mcp add notebooklm -- node /absolute/path/to/notebooklm-mcp/dist/index.js
```
Manual form — drop into `~/.claude.json`:
```json
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["notebooklm-mcp@latest"]
}
}
}
```
For a local build, replace `command`/`args` with `"command": "node"`, `"args": ["/absolute/path/to/dist/index.js"]`.
---
## Connect to other clients
### Cursor — `~/.cursor/mcp.json`
```json
{
"mcpServers": {
"notebooklm": {
"command": "npx",
"args": ["notebooklm-mcp@latest"]
}
}
}
```
### Codex CLI
```bash
codex mcp add notebooklm npx notebooklm-mcp@latest
```
### Generic MCP client (stdio)
Any client that can spawn an MCP server over stdio can use the same `npx notebooklm-mcp@latest` invocation. The server speaks MCP 2025 + the SDK's `Server` capability set (`tools`, `resources`, `prompts`, `completions`, `logging`).
### HTTP-only clients (n8n, Zapier, Make, hosted agents)
Run the server in HTTP mod...