notebooklm-mcp
<div align="center">
# NotebookLM REST API + MCP server
**Automate Google Gemini Notebook — formerly, and still widely known as, NotebookLM — at scale. 57-endpoint HTTP REST API for n8n / Zapier / Make / curl, an MCP server for Claude Code / Cursor / Codex, a UTCP interface for clients that call the API natively, and Rust and Ruby clients. Citation-backed Q&A, full Studio generation (audio · video · infographic · report · presentation · data table), multi-account rotation with auto-reauth across personal and Google Workspace accounts.**
> v4.8.0 — **Node 22 is now the floor, and the last four open advisories are gone with it.** The declared floor of Node 18 had quietly become fiction: three production dependencies already required Node 20 or newer, and the test matrix kept passing on 18 without exercising them. Raising it also let the third-party file globber go — its dependency chain carried four advisories with no fix upstream — replaced by Node's built-in search, now actually under test. Builds on **4.0.0**, where the HTTP API stopped being open to the network and to any web page ([GHSA-p69m-c5rf-g2c3](https://github.com/roomi-fields/notebooklm-mcp/security/advisories/GHSA-p69m-c5rf-g2c3)): it binds loopback, refuses unlisted origins, and takes a bearer token — **remote access and Docker require `NOTEBOOKLM_API_KEY`**, see [Securing the HTTP API](./deployment/docs/15-SECURITY.md). Built on a **dual transport** — the internal `batchexecute` RPC API (10-100× faster than scraping, immune to UI rebrands) with the Playwright browser as an automatic fallback. See the [changelog](./CHANGELOG.md).
> **Note (July 2026):** Google rebranded **NotebookLM** to **Gemini Notebook**. It is the same product, existing links redirect, and this project drives the same underlying service — the browser path was updated for the new DOM in v2.3.0 and the RPC path in v3.0.0. Package and repository keep the `notebooklm` name.
<!-- Badges -->
[](https://github.com/roomi-fields/notebooklm-mcp/actions/workflows/ci.yml) [](https://www.npmjs.com/package/@roomi-fields/notebooklm-mcp) [](https://www.npmjs.com/package/@roomi-fields/notebooklm-mcp) [](https://crates.io/crates/notebooklm) [](https://docs.rs/notebooklm) [](https://rubygems.org/gems/notebooklm) [](https://codecov.io/gh/roomi-fields/notebooklm-mcp) [](https://opensource.org/licenses/MIT) [](https://www.typescriptlang.org/) [](https://nodejs.org/)
[](https://modelcontextprotocol.io/) [](https://www.utcp.io/) [](https://claude.ai/claude-code) [](./deployment/docs/04-N8N-INTEGRATION.md) [](https://github.com/roomi-fields/notebooklm-mcp) [](https://mcptoplist.com/server/io.github.roomi-fields%2Fnotebooklm-mcp) [](https://lightnow.ai/servers/io.github.roomi-fields/notebooklm-mcp)
<!-- End Badges -->
</div>
---
> **Unofficial project — good to know before you start**
>
> This is not affiliated with Google. It talks to the same `batchexecute`
> endpoints the NotebookLM web app uses, with a browser fallback when they move.
> They are undocumented, so they can change without notice — when that happens we
> ship a fix, as we have for every change so far.
>
> Two practical notes: use a **dedicated Google account** for automation, and
> expect NotebookLM's own quotas to apply at high volume. See
> [Disclaimer](#disclaimer) for the full text.
---
## What You Can Build
🔗 **No-code automation pipelines** — The 57-endpoint REST API means NotebookLM becomes a step in n8n, Zapier, Make, or a plain `curl` in cron. No agent, no MCP client, no Node in your stack — just HTTP. This is the half most NotebookLM libraries don't have.
🤖 **Agent tooling** — The same engine over MCP for Claude Code, Cursor and Codex, with a bundled skill that primes the agent on citation formats, the daily-quota-aware batch pattern, and transport selection.
📚 **Research at volume** — Multi-account rotation with automatic re-authentication, built for overnight runs of 1 000+ questions across several notebooks without babysitting.
🎙️ **Full Studio generation** — Audio overviews, video, infographics, reports, presentations, data tables, plus flashcards, quizzes and mind maps — generated and downloaded programmatically.
## Use Cases & Recipes
NotebookLM is a **grounded** engine: Gemini reads your sources and answers _from them_, with citations. The winning pattern is to let it do the expensive reading while your own stack handles orchestration and the last mile.
**Spend fewer tokens — offload the reading**
- **🪙 Zero-token synthesis layer** — Drop 30 documents in a notebook, let Gemini do the heavy analysis, and spend your agent's context only on the final polish. The reasoning happens server-side; your agent just orchestrates (`add_notebook` → `source_add` → `notebook_ask`).
- **💾 Answer cache you can re-read offline** — `vault_batch` writes every answer to disk as structured JSON against a published [schema](https://schemas.roomi-fields.com/nblm-answer-v1.json), so a batch run becomes a corpus you can grep, diff, re-index, or feed to a retrieval layer — without re-querying and re-spending quota.
**Wire it into things that aren't agents**
- **⚙️ NotebookLM as an n8n / Zapier / Make step** — Because it speaks plain HTTP, a citation-backed answer becomes one node in a workflow: a form submission triggers a question, the cited answer lands in a sheet, a Slack message, or a database. No agent runtime involved.
- **📄 Document intake pipeline** — Watch a folder or an inbox, push new PDFs and URLs in as sources, and ask a standing set of questions against them on every arrival.
**Grounded answers with a paper trail**
- **🔍 Citations with the actual source text** — Answers come back with source names _and the quoted excerpts_ they rest on, extracted from the citation panel — so a claim can be checked, not just attributed.
- **🎓 Literature review at thesis scale** — Batch 100+ research questions across multiple notebooks, rotate accounts as daily quotas run out, and resume where it stopped. Built for, and tested on, exactly this.
**Get artifacts back out**
- **🔁 One source set, every format** — Fan a single notebook out to a podcast, a video, a slide deck, a report, a quiz and a mind map, then download them all locally.
---
## In the Wild
Real deployments, not hypotheticals.
- **📚 A doctoral literature review at batch scale** — The project was built for, and is
continuously tested on, overnight runs of **1 000+ research questions** spread across
several notebooks: multi-account rotation picks up when a daily quota runs out, every
answer is written to disk with its citations, and an interrupted run resumes instead of
starting over. The batch pattern in [`vault_batch`](#features) exists because a thesis
needed it.
- **🔌 Replacing a RAG engine with the REST API** — [`musnymubarak/Calim_Doc`](https://github.com/musnymubarak/Calim_Doc)
swapped a Gemini-based retrieval engine for this project's HTTP API, running it as a
Docker service (`notebooklm:3000`) behind a full client and worker layer. A good
illustration of the REST half: no agent runtime, no MCP client — NotebookLM simply
became a backend service their Python app calls.
Built something with it? Open an issue — this section is for other people's work.
## Features
### Q&A with Citations
- **Ask questions** to NotebookLM and get accurate, citation-backed answers
- **Source citation extraction** with 5 formats: none, inline, footnotes, json, expanded (97% excerpt success rate)
- **Session management** for multi-turn conversations with auto-reauth on session expiry
### Content Generation
Generate multiple content types from your notebook sources:
| Content Type | Formats | Options |
| ------------------ | ------------------------ | ---------------------------------------------- |
| **Audio Overview** | Podcast-style discussion | Language (80+), custom instructions |
| **Video** | Brief, Explainer | 6 visual styles, language, custom instructions |
| **Infographic** | Horizontal, Vertical | Language, custom instructions |
| **Report** | Summary, Detailed | Language, custom instructions |
| **Presentation** | Overview, Detailed | Language, custom instructions |
| **Data Table** | Simple, Detailed | Language, custom instructions |
| **Flashcards** | Study cards | Language, custom instructions |
| **Quiz** | Assessment questions | Language, custom instructions |
| **Mind Map** | Interactive node graph | Saved to the notebook |
**Video Visual Styles**: classroom, documentary, animated, corporate, cinematic, minimalist
**Language of generated content**: pass `language` to any generator — a BCP-47 code (`es`, `ja`, `pt_BR`, `zh_Hans`) or a name in English or in the language itself (`"Spanish"`, `"Español"`). 81 languages are accepted, and an unrecognised one is refused rather than quietly swapped for another. Set a default with `NOTEBOOKLM_CONTENT_LANGUAGE`; it is deliberately independent of `NOTEBOOKLM_UI_LOCALE`, which only picks the interface language the browser fallback reads.
Flashcards and quizzes are generated via `generate_study_aid`; mind maps via `generate_mind_map`. v3 also adds `share_notebook`, `manage_labels`, and `research_sources` (web/Drive source discovery) — see the [changelog](./CHANGELOG.md).
### Content Download
- **Download Audio** — WAV audio files
- **Download Video** — MP4 video files
- **Download Infographic** — PNG image files
- Text-based content (report, presentation, data_table) is returned in the API response
- **Delete generated content** (`content_delete`) — until now a notebook accumulated every draft anyone ever asked for, with no way to remove one short of the web UI
### Source Management
- **Add sources**: Files (PDF, TXT, DOCX), URLs, Text, YouTube videos, Google Drive
- **List sources**: Every source with its ID and title (`source_list`)
- **Rename a source** (`rename_source`): fix a title in place, by id or by name
- **Check freshness** (`check_source_freshness`): which URL / Drive sources have drifted from what they point at — the whole notebook in one call. An unanswered source is reported as unknown, never as current
- **Read a source's guide** (`get_source_guide`): NotebookLM's own summary and key topics for one source
- **Read a source in full** (`source_read`): the exact text NotebookLM indexed — what it actually reasons over, which the web UI only shows in fragments. Quote a source verbatim, check what a PDF really yielded, or hand the raw material to another tool. Name the source instead of its ID if you prefer; an ambiguous name is refused rather than guessed. Long sources arrive **one page at a time**, with an explicit instruction for fetching the next — or `paginate: false` for the whole document at once.
### Notebook Summary and Chat History
- **What is in this notebook?** (`get_notebook_summary`) — NotebookLM's own summary of its sources plus the questions it suggests asking, without spending a question to find out
- **What was already asked?** (`get_chat_history`) — read back the recorded questions and answers, newest first. An agent resuming work stops paying to ask what it already asked. NotebookLM exposes only the most recent conversation per notebook
- **Clear the history** (`delete_chat_history`) — the web UI's "Delete history". There is no per-turn delete: the whole conversation goes
### Artifact Export and Revision
- **Export to Drive** (`export_artifact`) — send a finished artifact to Google Docs or Google Sheets
- **Revise one slide** (`revise_slide`) — change a single slide from a prompt instead of regenerating the whole deck
### Notebook Library
- **Multi-notebook management** with validation and smart selection
- **Auto-discovery**: Automatically generate metadata via NotebookLM queries
- **Search notebooks** by keyword in name, description, or topics
- **Scrape notebooks**: List all notebooks from NotebookLM with IDs and names
- **Bulk delete**: Delete multiple notebooks at once
### Accounts & Localization
- **Personal _and_ Google Workspace accounts** — recognizes both NotebookLM hosts (`notebooklm.google.com` and the `notebook.google.com` Workspace alias), so Workspace sessions authenticate cleanly instead of looping on "session expired"
- **UI-language-aware** — drives NotebookLM whether its interface is in English, French, German, or Japanese (`en` · `fr` · `de` · `ja`); [add a language](./docs/ADDING_A_LANGUAGE.md) in a single JSON file
### UTCP Interface
[UTCP](https://www.utcp.io/) — the Universal Tool Calling Protocol — is the
inverse of MCP: **there is no protocol server and no wrapper process**. A
client reads a tool manual once, then calls this REST API directly, so nothing
sits between the agent and the endpoint.
```bash
# The manual. 56 tools, named the same as the MCP tools.
curl -H "X-API-Key: $NOTEBOOKLM_API_KEY" http://localhost:3000/utcp
```
- **`GET /utcp`** — the manual for a running server, with every call address
rebased on the address the request arrived at, so one document serves a
loopback install and a reverse-proxied one alike.
- **Also published statically** at
[notebooklm.roomi-fields.com/utcp.json](https://notebooklm.roomi-fields.com/utcp.json),
for a client configured before the server is up.
- **57 named tools** — the manual reuses the MCP tool names, so
`search_passages` is `search_passages` on both sides rather than something
synthesised from a URL path. Every operation in the
[OpenAPI 3.1 spec](./deployment/docs/openapi.yaml) carries a matching
`operationId`, which also means a client pointed straight at the
specification converts it correctly on its own.
- **Authentication is declared the way UTCP clients implement it** — as an
`api_key` in the `X-API-Key` header, which this server accepts alongside the
bearer form. The key itself is never in the manual, only the literal
`${NOTEBOOKLM_API_KEY}`, which is how a client asks for a value from its own
environment. (A client that converts the specification instead will not pick
up authentication at all, since the converter does not map bearer schemes —
one reason to prefer the manual.)
Generated from the specification on every release and held in step by a build
guard, so the manual cannot describe a version that is not the one you are
running. Details: [REST API reference → `GET /utcp`](./deployment/docs/03-API.md).
### Rust client
A typed async client lives in this repository at
[`crates/notebooklm-client`](./crates/notebooklm-client) and is published as
[**`notebooklm`**](https://crates.io/crates/notebooklm) on crates.io
([docs](https://docs.rs/notebooklm)), one version per release. It covers **all
57 operations** — generated from the specification, with a synchronous twin
behind one feature flag.
```rust
let client = notebooklm::Client::local()?;
let answer = client.ask_question(&AskRequest::new(&id, "What is ikigai?")).await?;
println!("{}", answer.answer);
```
It deliberately **does not own a browser**: the Google session is bound to the
machine it was made on, expires server-side while local cookies still look
valid, and needs a driver kept patched against detection. The crate talks to
this server, which already does all three. The reasoning in full:
[driving it from Rust](https://notebooklm.roomi-fields.com/blog/notebooklm-rust).
### Ruby client
The same surface as a gem, in this repository at
[`gems/notebooklm`](./gems/notebooklm) and published as
[**`notebooklm`**](https://rubygems.org/gems/notebooklm) on RubyGems, also one
version per release. All 57 operations, generated from the same specification,
every response shape documented field by field — and no runtime dependencies.
```ruby
client = NotebookLM.local
answer = client.ask(notebook.id, 'What is ikigai?')
answer.citations.each { |c| puts "[#{c.number}] #{c.source_text}" }
```
Why a gem at all, and why it owns no browser either:
[driving it from Ruby](https://notebooklm.roomi-fields.com/blog/notebooklm-ruby).
### Integration Options
- **MCP Protocol** — Claude Code, Cursor, Codex, any MCP client
- **[UTCP](https://www.utcp.io/)** — a tool manual at `/utcp`, for clients that call the REST API natively with no protocol server in between ([see above](#utcp-interface))
- **Agent Skill** — ships a bundled [`notebooklm` skill](./skills/notebooklm/SKILL.md) (also standalone: [`roomi-fields/notebooklm-skill`](https://github.com/roomi-fields/notebooklm-skill)) that teaches the agent citation formats, the batch-to-cache pattern, and when to use which transport
- **HTTP REST API** — n8n, Zapier, Make.com, custom integrations
- **Docker** — Isolated deployment with Docker or Docker Compose
- **[RTFM](https://github.com/roomi-fields/rtfm) retrieval layer** — `/batch-to-vault` writes citation-backed answers as markdown + JSON sidecars (`nblm-answer-v1` schema), indexable by [RTFM](https://github.com/roomi-fields/rtfm) (FTS5 + semantic) for unlimited offline queries. Ideal for academic / SOTA workflows. [Guide](./deployment/docs/14-RTFM-INTEGRATION.md).
---
## Quick Start
### Option 0 — Claude Code marketplace (one-liner, recommended for Claude Code users)
The fastest way to get NotebookLM into Claude Code. Distributed via the [`roomi-fields/claude-plugins`](https://github.com/roomi-fields/claude-plugins) marketplace alongside [RTFM](https://github.com/roomi-fields/rtfm) (the retrieval companion — see [RTFM integration guide](./deployment/docs/14-RTFM-INTEGRATION.md)):
```text
/plugin marketplace add roomi-fields/claude-plugins
/plugin install notebooklm@roomi-fields
```
That registers the MCP server **and the `notebooklm` agent skill**, runs `npx -y @roomi-fields/notebooklm-mcp@<pinned-version>` automatically (Node ≥ 22 required), and lets you upgrade with two commands when a new release ships: `/plugin marketplace update roomi-fields` then `/reload-plugins`. Then run `npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth` once in a terminal to log into Google (a visible Chrome opens). To install RTFM at the same time: `/plugin install rtfm@roomi-fields`.
### Option 1 — HTTP REST API (n8n, Zapier, Make, curl, any HTTP client)
```bash
git clone https://github.com/roomi-fields/notebooklm-mcp.git
cd notebooklm-mcp
npm install && npm run build
npm run setup-auth # One-time Google login
npm run start:http # Start REST API on port 3000
```
```bash
# Citation-backed Q&A, single curl, JSON response
curl -X POST http://localhost:3000/ask \
-H 'Content-Type: application/json' \
-d '{"question": "Summarize chapter 3", "notebook_id": "your-id", "source_format": "json"}'
```
The full surface is **33 documented endpoints** — see the [REST API reference](https://notebooklm.roomi-fields.com/notebooklm-rest-api). For overnight batches of 1 000+ questions, see the [batch pattern](https://notebooklm.roomi-fields.com/batch-1000-questions).
### Option 2 — MCP Mode (Claude Code, Cursor, Codex)
```bash
# Build (same package, MCP transport)
git clone https://github.com/roomi-fields/notebooklm-mcp.git
cd notebooklm-mcp
npm install && npm run build
# Claude Code
claude mcp add notebooklm node /path/to/notebooklm-mcp/dist/index.js
# Cursor — add to ~/.cursor/mcp.json
{
"mcpServers": {
"notebooklm": {
"command": "node",
"args": ["/path/to/notebooklm-mcp/dist/index.js"]
}
}
}
```
**Log in once — in a terminal, not through the assistant.** Run the interactive
Google login as a command; a visible Chrome window opens, you sign in, and the
saved session is then reused by the MCP server:
```bash
npm run setup-auth # from a clone (Option 2 above)
notebooklm-mcp setup-auth # from a global install (npm i -g @roomi-fields/notebooklm-mcp)
```
Do the login in a terminal rather than by asking the assistant _"log me in"_:
some stdio MCP clients (e.g. Claude Desktop) cap tool-call duration and cut off
the up-to-10-minute interactive login before you can finish signing in (see
[issue #27](https://github.com/roomi-fields/notebooklm-mcp/issues/27)).
### Option 3 — Docker (NAS, server, headless)
```bash
# Build and run
docker build -t notebooklm-mcp .
docker run -d --name notebooklm-mcp -p 3000:3000 -p 6080:6080 -v notebooklm-data:/data notebooklm-mcp
# Authenticate via noVNC
# 1. Open http://localhost:6080/vnc.html
# 2. Run: curl -X POST http://localhost:3000/setup-auth -d '{"show_browser":true}'
# 3. Login to Google in the VNC window
```
See [Docker Guide](./deployment/docs/08-DOCKER.md) for NAS deployment (Synology, QNAP).
---
## Documentation
Full docs site: **<https://notebooklm.roomi-fields.com/>** · [OpenAPI 3.1 spec](./deployment/docs/openapi.yaml) · [UTCP manual](https://notebooklm.roomi-fields.com/utcp.json)
| Guide | Description |
| -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| [Installation](./deployment/docs/01-INSTALL.md) | Step-by-step setup for HTTP and MCP modes |
| [Configuration](./deployment/docs/02-CONFIGURATION.md) | Environment variables and security |
| [REST API reference](./deployment/docs/03-API.md) | Complete HTTP endpoint documentation (57 endpoints) |
| [Run 1 000 questions overnight](./deployment/docs/12-BATCH-1000.md) | Production batch pattern with auto-reauth and rotation |
| [**RTFM integration — cache as searchable vault**](./deployment/docs/14-RTFM-INTEGRATION.md) | Pipeline pattern: NotebookLM as one-shot ingestion, RTFM as retrieval layer. `/batch-to-vault` endpoint, `nblm-answer-v1` schema. |
| [n8n integration](./deployment/docs/04-N8N-INTEGRATION.md) | Workflow automation setup |
| [Troubleshooting](./deployment/docs/05-TROUBLESHOOTING.md) | Common issues and solutions |
| [Notebook library](./deployment/docs/06-NOTEBOOK-LIBRARY.md) | Multi-notebook management |
| [Auto-discovery](./deployment/docs/07-AUTO-DISCOVERY.md) | Autonomous metadata generation |
| [Content management](./deployment/docs/10-CONTENT-MANAGEMENT.md) | Audio, video, infographic, report, presentation |
| [Multi-account rotation](./deployment/docs/11-MULTI-ACCOUNT.md) | Multiple accounts with TOTP auto-reauth |
| [Docker](./deployment/docs/08-DOCKER.md) | Docker and Docker Compose deployment |
| [Multi-interface](./deployment/docs/09-MULTI-INTERFACE.md) | Run Claude Desktop + HTTP simultaneously |
| [**Compare with PleasePrompto v2.0.0**](./deployment/docs/13-COMPARE.md) | Feature matrix vs the upstream MCP-only server |
| [Chrome profile limitation](./docs/CHROME_PROFILE_LIMITATION.md) | Profile locking (solved in v1.3.6+) |
| [Adding a language](./docs/ADDING_A_LANGUAGE.md) | i18n system for multilingual UI support |
---
## Roadmap
See [ROADMAP.md](./ROADMAP.md) for planned features and version history.
**Latest releases:**
<!-- releases:start — generated from CHANGELOG.md by scripts/sync-facts.mjs; do not edit by hand -->
- **v4.8.0** (2026-11-09) — The live compute-meter quota, read with one call
- **v4.7.0** (2026-11-07) — The published specification was invalid, and nothing checked · The Rust client covers the whole API, and is generated · and more
- **v4.6.0** (2026-11-06) — Retry a failed generation without losing its id · A UTCP interface, and 56 named operations · and more
- **v4.5.0** (2026-10-30) — Search the sources without paying for an answer
- **v4.4.0** (2026-10-24) — Two security fixes, both reported by Umar Ahmed (ghostnshells)
- **v4.3.0** (2026-10-22) — Eight tools for calls the server already knew how to make · Two things the backlog had wrong
- **v4.2.0** (2026-10-18) — Security — the session store is no longer reachable through a file path
- **v4.1.0** (2026-10-18) — Changed — Node 22 is the floor, and the last four advisories left with it
- **v4.0.0** (2026-10-18) — Security — the HTTP API is no longer open to the network or to any web page · Fixed — an account could vanish on creation · and more
- **v3.2.0** (2026-09-03) — Added — `content_delete`: generated content can finally be removed · Closed — both open issues, settled by measurement rather than by waiting
<!-- releases:end -->
_Every earlier release, with the whole story of each, is in the full [CHANGELOG](./CHANGELOG.md)._
**Not yet implemented:**
- Discover sources (Web/Drive search with Fast/Deep modes)
- Edit notes (create, delete, and convert are implemented)
---
## Disclaimer
This tool automates browser interactions with NotebookLM. Use a dedicated Google account for automation. CLI tools like Claude Code can make mistakes — always review changes before deploying.
See full [Disclaimer](#disclaimer-details) below.
---
## Contributing
Found a bug? Have an idea? [Open an issue](https://github.com/roomi-fields/notebooklm-mcp/issues) or submit a PR!
See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
## License
MIT — Use freely in your projects. See [LICENSE](./LICENSE).
## Author
**Romain Peyrichou** — [@roomi-fields](https://github.com/roomi-fields)
## Acknowledgments
Thanks to everyone who has contributed code, ideas, and bug reports:
- **Khizar Jamshaid Iqbal** — [@KhizarJamshaidIqbal](https://github.com/KhizarJamshaidIqbal), 2025 UI selector fixes, doctor script, PII scrub
- **Kazik Pietka** — [@kpietkaa](https://github.com/kpietkaa), `notebook.google.com` rebrand support
- **Rui Ruiberriz** — [@Excauboi](https://github.com/Excauboi), `hl=<uiLocale>` on app URLs + click-through scrape fallback
- **[@he0xwhale](https://github.com/he0xwhale)** — `note_list` / `note_get` MCP tools
- **[@eminsnow](https://github.com/eminsnow)** — canonical tool names (`_` over `.`)
- **Julien Cantoni** — [@JulienCANTONI](https://github.com/JulienCANTONI)
- **Nils Friedrichs** — [@nils-friedrichs](https://github.com/nils-friedrichs), LightNow capability badge
- **Teodor Tenev** — [@teodor-t-tenev](https://github.com/teodor-t-tenev), stdio mode exits when its client is gone instead of spinning a core
- **[@shinjiyu](https://github.com/shinjiyu)** — reported the open HTTP API privately, with the fix (GHSA-p69m-c5rf-g2c3)
- **Umar Ahmed** — [@ghostnshells](https://github.com/ghostnshells), reported two advisories: the origin guard that trusted a missing header, and forced browser navigation
---
<details>
<summary><a name="disclaimer-details"></a>Full Disclaimer</summary>
**About browser automation:**
While I've built in humanization features (realistic typing speeds, natural delays, mouse movements), I can't guarantee Google won't detect or flag automated usage. Use a dedicated Google account for automation.
**About CLI tools and AI agents:**
CLI tools like Claude Code, Codex, and similar AI-powered assistants are powerful but can make mistakes:
- Always review changes before committing or deploying
- Test in safe environments first
- Keep backups of important work
- AI agents are assistants, not infallible oracles
I built this tool for myself and share it hoping it helps others, but I can't take responsibility for any issues that might occur. Use at your own discretion.
</details>
---
<div align="center">
Built with frustration about hallucinated APIs, powered by Google's NotebookLM
⭐ [Star on GitHub](https://github.com/roomi-fields/notebooklm-mcp) if this saves you debugging time!
</div>
TDQS
Scored across 51 tools
Several clusters look nearly interchangeable: library_list / notebook_list / library_search all enumerate notebooks, library_add / library_discover / notebook_create all add one, and note_get / note_list / library_get overlap in kind. Generation is also split across content_generate and generate_study_aid (flashcards/quiz), so an agent must read long descriptions to pick correctly. The problem is worsened because descriptions repeatedly instruct the agent to call names that do not exist in this set (add_notebook, list_sources, ask_question, setup_auth, cleanup_data), creating false selection targets.
The surface mixes at least three conventions: noun_verb (source_read, note_create, library_select), verb_noun (get_usage, manage_labels, research_sources, revise_slide), and bare noun pairs (server_health, vault_batch). Worse, the bodies of the descriptions reference a completely different, unprefixed naming scheme than the tool names actually exposed, so documentation and identifiers do not line up.
51 tools is far past the point where each one earns its place, and a large share is administrative (auth_setup, auth_logout, auth_switch, server_cleanup, server_health, session_reset, session_close) or duplicate add/list paths. The NotebookLM research workflow itself is a modest set buried inside this bulk.
Lifecycle coverage is genuinely broad: notebook create/list/delete/sharing, source add/list/read/rename/delete/freshness, notes create/list/get/chat-save/convert-to-source, content generate/download/export/retry/delete/slide-revision, chat history, sessions, usage quota, and artifact vaulting. Gaps are minor — no true rename of a NotebookLM notebook, no per-turn chat deletion (acknowledged in the description), and study-aid generation is not reachable via content_generate.