notebooklm-mcp
An unofficial MCP server for Google NotebookLM that enables users to manage notebooks, add sources, ask questions with citations, and generate audio podcasts via a Playwright-based automation layer.
README
notebooklm-mcp
An unofficial NotebookLM MCP server and CLI — inspired by
jacob-bd/notebooklm-mcp-cli.
⚠️ NotebookLM has no public API. This project talks to NotebookLM's internal
batchexecute/GenerateFreeFormStreamedRPCs through a Playwright persistent-context session. It is not affiliated with Google.
What works today
| Tool | Status | Notes |
|---|---|---|
notebook_list |
✅ | Returns "mine" + "shared" notebooks. Pagination for many owned notebooks not yet discovered (shows most-recent owned). |
notebook_create |
✅ | Untitled empty notebook. |
notebook_delete |
✅ | Permanent, no undo. |
notebook_query |
✅ | Streams the answer with inline [1][2] citations. |
source_add |
⚠️ | kind="text" and kind="url" work. drive / file stubs. |
research_start |
✅ | NotebookLM Discover → returns candidate URLs (does not auto-import). |
research_and_ask |
✅ | One-shot: create → research → import → ask N questions → (optional) delete. |
studio_create |
⚠️ | artifact="audio" (podcast) works. video / slides / mindmap / etc. stubs. |
download_artifact |
✅ | Saves completed audio as .m4a. |
refresh_auth |
✅ | Checks whether the stored Google session is still live. |
Stubs (raise NotImplementedError): notebook_share_public,
notebook_share_invite, source_sync_drive, source_get_content,
studio_revise, cross_notebook_query, batch, pipeline, tag.
End-to-end workflow this supports
Manual orchestration:
notebook_create() → empty notebook
research_start(nid, topic) → ~10 candidate URLs
source_add(nid, kind="url")×N → import the ones you want
notebook_query(nid, question) → grounded answer with citations
studio_create(nid, "audio") → start podcast generation (2-5 min)
download_artifact(nid) → .m4a file on disk
Or, in a single call:
research_and_ask(
topic="history of the Cold War space race",
questions=["Who reached space first?", "Key consequences?"],
max_sources=3,
keep_notebook=False, # ephemeral — delete after
)
# → { sources_imported: [...], qa: [{question, answer, ...}, ...] }
Install
Quick start (from PyPI)
uv tool install notebooklm-mcp-lisa
uvx --from notebooklm-mcp-lisa playwright install chromium
nlm login # one-time Google sign-in (opens a browser)
nlm setup add claude-code # or: claude-desktop
The setup add command edits the target's config file so the MCP server is
registered — no JSON editing by hand. Restart the client to pick it up.
Verify registration any time:
nlm setup list
Dev setup (from source)
git clone https://github.com/gracelee087/notebooklm-mcp-lisa.git
cd notebooklm-mcp
uv sync
uv run playwright install chromium
uv run nlm login
First-time Google login
NotebookLM requires a signed-in Google session. Run once, headed:
uv run nlm login
A Chromium window opens. Complete Google OAuth; the session is saved to
the OS user-data dir (NLM_PROFILE_DIR to override). Subsequent runs are
headless.
Verify:
uv run nlm status
# {'logged_in': True}
Run the MCP server
uv run notebooklm-mcp
# or
uv run nlm serve
Claude Code (project-scoped, auto-picked-up)
.mcp.json in this repo is already configured. When you open the project in
Claude Code it prompts you to trust and loads notebooklm automatically.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"notebooklm": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/this/repo", "run", "notebooklm-mcp"]
}
}
}
Repo layout
src/notebooklm_mcp/
server.py # FastMCP entry
cli.py # `nlm` CLI (login/status/serve)
browser.py # Playwright persistent context
config.py # paths, env
tools/
notebook.py source.py studio.py research.py workflow.py auth.py
Status
- [x] Package scaffold, MCP server, CLI
- [x] Playwright session with persistent Google login
- [x] All tools registered (stubs)
- [ ]
notebook_listDOM scrape - [ ]
notebook_querychat flow - [ ]
source_add(url/text/drive/file) - [ ]
studio_createaudio (podcast) + download - [ ] remaining tools
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.