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
Release files for notebooklm-mcp-lisa 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| notebooklm_mcp_lisa-0.2.0.tar.gz | 113.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| notebooklm_mcp_lisa-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 138.9 kB
Release files / notebooklm_mcp_lisa-0.2.0.tar.gz
| Download URL | notebooklm_mcp_lisa-0.2.0.tar.gz |
|---|---|
| Size | 113.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d449ab76496e437f60aa32a27bd91e553d30c5521cb1472d5731117f2862d353
|
|
BLAKE2b-256 checksum How to use checksums |
ee816cfcb60fd43ec88d2d7425450c6d43bd6724b2311a7923d6ce8e513545f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / notebooklm_mcp_lisa-0.2.0-py3-none-any.whl
| Download URL | notebooklm_mcp_lisa-0.2.0-py3-none-any.whl |
|---|---|
| Size | 25.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
873f525ee3a84504315f75f505b49c94bbe79aa36b5dba31911e15510e835fb8
|
|
BLAKE2b-256 checksum How to use checksums |
06b0d8a47c70236fa41a38ac6adf87c173772b63c4cac0a2b74012e2347b1584
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|