Skip to main content

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 / GenerateFreeFormStreamed RPCs 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_list DOM scrape
  • notebook_query chat flow
  • source_add (url/text/drive/file)
  • studio_create audio (podcast) + download
  • remaining tools

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

notebooklm_mcp_lisa-0.2.0.tar.gz (113.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

notebooklm_mcp_lisa-0.2.0-py3-none-any.whl (25.3 kB view details)

Uploaded Python 3

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

Hashes for notebooklm_mcp_lisa-0.2.0.tar.gz
Algorithm Hash digest
SHA256 d449ab76496e437f60aa32a27bd91e553d30c5521cb1472d5731117f2862d353
MD5 7b461213aec77e9482d9d30110fc020a
BLAKE2b-256 ee816cfcb60fd43ec88d2d7425450c6d43bd6724b2311a7923d6ce8e513545f3

See more details on using hashes here.

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

Hashes for notebooklm_mcp_lisa-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 873f525ee3a84504315f75f505b49c94bbe79aa36b5dba31911e15510e835fb8
MD5 c14ae24f32731fd218db2640df8962be
BLAKE2b-256 06b0d8a47c70236fa41a38ac6adf87c173772b63c4cac0a2b74012e2347b1584

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page