Unofficial NotebookLM MCP server and CLI — drives NotebookLM's internal RPCs through a Playwright session.
Project description
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
- Package scaffold, MCP server, CLI
- Playwright session with persistent Google login
- All tools registered (stubs)
-
notebook_listDOM scrape -
notebook_querychat flow -
source_add(url/text/drive/file) -
studio_createaudio (podcast) + download - remaining tools
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file notebooklm_mcp_lisa-0.2.0.tar.gz.
File metadata
- Download URL: notebooklm_mcp_lisa-0.2.0.tar.gz
- Upload date:
- Size: 113.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d449ab76496e437f60aa32a27bd91e553d30c5521cb1472d5731117f2862d353
|
|
| MD5 |
7b461213aec77e9482d9d30110fc020a
|
|
| BLAKE2b-256 |
ee816cfcb60fd43ec88d2d7425450c6d43bd6724b2311a7923d6ce8e513545f3
|
File details
Details for the file notebooklm_mcp_lisa-0.2.0-py3-none-any.whl.
File metadata
- Download URL: notebooklm_mcp_lisa-0.2.0-py3-none-any.whl
- Upload date:
- Size: 25.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
873f525ee3a84504315f75f505b49c94bbe79aa36b5dba31911e15510e835fb8
|
|
| MD5 |
c14ae24f32731fd218db2640df8962be
|
|
| BLAKE2b-256 |
06b0d8a47c70236fa41a38ac6adf87c173772b63c4cac0a2b74012e2347b1584
|