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
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| notebooklm_mcp_lisa-0.2.0.tar.gz | 113.7 kB | Without provenance | Details for notebooklm_mcp_lisa-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| notebooklm_mcp_lisa-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for notebooklm_mcp_lisa-0.2.0-py3-none-any.whl |
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}
|
Security for notebooklm-mcp-lisa 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.