Files
wehub-resource-sync 09e9f3545f
CodeQL / Analyze (push) Waiting to run
dependency-audit / pip-audit (push) Waiting to run
Test / Code Quality (push) Waiting to run
Test / Test (macos-latest, Python 3.10) (push) Blocked by required conditions
Test / Test (macos-latest, Python 3.11) (push) Blocked by required conditions
Test / Test (macos-latest, Python 3.12) (push) Blocked by required conditions
Test / Test (macos-latest, Python 3.13) (push) Blocked by required conditions
Test / Test (macos-latest, Python 3.14) (push) Blocked by required conditions
Test / Test (ubuntu-latest, Python 3.10) (push) Blocked by required conditions
Test / Test (ubuntu-latest, Python 3.11) (push) Blocked by required conditions
Test / Test (ubuntu-latest, Python 3.12) (push) Blocked by required conditions
Test / Test (ubuntu-latest, Python 3.13) (push) Blocked by required conditions
Test / Test (ubuntu-latest, Python 3.14) (push) Blocked by required conditions
Test / Test (windows-latest, Python 3.10) (push) Blocked by required conditions
Test / Test (windows-latest, Python 3.11) (push) Blocked by required conditions
Test / Test (windows-latest, Python 3.12) (push) Blocked by required conditions
Test / Test (windows-latest, Python 3.13) (push) Blocked by required conditions
Test / Test (windows-latest, Python 3.14) (push) Blocked by required conditions
chore: import upstream snapshot with attribution
2026-07-13 13:30:13 +08:00
..

NotebookLM MCP — Claude Desktop extension (.mcpb / DXT)

This directory packages the notebooklm-py MCP server as a one-click Claude Desktop extension (.mcpb, formerly DXT). Installing the bundle wires the NotebookLM tools into Claude Desktop without any manual JSON editing.

Contents

File Purpose
manifest.json The extension manifest (name, version, server command).
run_server.py A resilient launcher that locates uvx and runs uvx --from "notebooklm-py[mcp]" notebooklm-mcp, forwarding stdin/stdout/stderr for clean JSON-RPC.

The launcher resolves the server from PyPI on demand via uvx, so there is no vendored Python environment in the bundle — only the two files above.

Prerequisites

  1. uv / uvx — the launcher shells out to uvx:

    # macOS / Linux
    curl -LsSf https://astral.sh/uv/install.sh | sh
    # Windows (PowerShell)
    powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
    

    run_server.py searches PATH plus the common install dirs (~/.local/bin, ~/.cargo/bin, /opt/homebrew/bin, /usr/local/bin, /snap/bin, and the Windows equivalents), so a restricted host PATH is fine.

  2. Authenticate once with your Google account:

    uvx --from "notebooklm-py[mcp]" notebooklm login
    

    This stores credentials under ~/.notebooklm/ for the active profile, which the server binds at startup.

Install

  • Claude Desktop: download notebooklm-mcp.mcpb from the latest release (under Assets), then double-click it — or Settings → Extensions → Install Extension… and pick the file. Restart Claude Desktop; the NotebookLM tools (e.g. notebook_list, chat_ask, studio_generate) appear in the tool picker.

    Each stable release attaches a prebuilt, version-matched bundle (built and uploaded by .github/workflows/publish-mcpb.yml), so there is nothing to build yourself. (Pre-releases don't ship a bundle — the launcher resolves the latest stable server from PyPI regardless.)

For other MCP clients (Claude Code, Cursor, Windsurf) that read a JSON config instead of a .mcpb, use the CLI installer instead:

notebooklm mcp install claude-code   # or: cursor / windsurf / claude-desktop

Build from source (contributors)

End users should download the prebuilt bundle from the release above. If you are developing the extension itself, build it locally with the official @anthropic-ai/mcpb CLI (formerly dxt):

# From the repository root:
npx @anthropic-ai/mcpb pack desktop-extension notebooklm-mcp.mcpb

This produces notebooklm-mcp.mcpb, a zip of manifest.json + run_server.py — the same artifact the release workflow attaches.

The CLI validates manifest.json against the DXT schema during pack. The repo's own tests/unit/test_mcp_desktop_extension.py asserts the manifest is valid JSON with the required keys, that its version tracks the package version, and that run_server.py builds the correct uvx command, so the bundle stays shippable.

How the launcher passes through stdio

The MCP host talks to the server over JSON-RPC on stdin/stdout. run_server.py therefore:

  • prints nothing to stdout (diagnostics go to stderr only), and
  • passes the host's stdin/stdout/stderr straight through to the child uvx process.

If uvx cannot be found, the launcher prints a clear install hint to stderr and exits non-zero — it never contaminates the JSON-RPC channel.