Skip to main content
Glama
CRtheHILLS

OneClickLM

by CRtheHILLS
README.md
<p align="center">
  <img src="assets/banner.png" alt="OneClickLM" width="800" />
</p>

<h1 align="center">OneClickLM</h1>

<p align="center">
  <strong>The NotebookLM MCP server that actually works.</strong><br>
  Auto-healing auth · Zero config · One command · 6 powerful tools
</p>

<p align="center">
  <a href="https://www.npmjs.com/package/oneclicklm"><img src="https://img.shields.io/npm/v/oneclicklm?style=flat-square&color=cb3837" alt="npm" /></a>
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License" /></a>
  <a href="https://github.com/CRtheHILLS/OneClickLM/stargazers"><img src="https://img.shields.io/github/stars/CRtheHILLS/OneClickLM?style=flat-square&color=yellow" alt="Stars" /></a>
  <a href="https://smithery.ai/server/oneclicklm"><img src="https://img.shields.io/badge/Smithery-Registry-purple?style=flat-square" alt="Smithery" /></a>
</p>

<p align="center">
  <a href="#-quick-start">Quick Start</a> ·
  <a href="#-the-problem">The Problem</a> ·
  <a href="#-available-tools">Tools</a> ·
  <a href="#-ide-setup">IDE Setup</a> ·
  <a href="#-comparison">Comparison</a>
</p>

---

## Hi! I'm CR 👋

I built OneClickLM because I was tired of every NotebookLM MCP server breaking on me every few days.

After connecting NotebookLM to a **6-domain AI chatbot platform** ([BEYOND HUMAN](https://github.com/CRtheHILLS/beyond-human)), I hit literally every failure mode — expired tokens, Chrome crashes, concurrent query timeouts, you name it. So I built the tool I wished existed.

**OneClickLM just works.** Login once, forget about it forever.

---

## 💥 The Problem

Every NotebookLM MCP server on GitHub shares the same fatal flaw: **they break within days.**

Google silently rotates auth tokens, and no one handles it.

| What happens | What you see |
|:---|:---|
| `build_label` expires (every 1-2 weeks) | 🔴 400 Bad Request, zero explanation |
| CSRF token goes stale | 🔴 Queries silently fail |
| Chrome already running | 🔴 Login crashes with CDP conflict |
| Two queries at once | 🔴 Timeout cascade, server dies |
| Python + pipx + virtualenv | 🔴 30 minutes just to install |
| Connection drops | 🔴 Queries hang forever |

**Sound familiar?** Yeah, I went through all of this. So you don't have to.

---

## ✅ The Solution

| Feature | How it works |
|:---|:---|
| **Auto-healing auth** | Detects expired tokens → refreshes automatically → you never notice |
| **Zero config** | `npx oneclicklm login` once, then it just works. Forever. |
| **No Chrome conflicts** | Uses system Chrome for login, then pure HTTP. No CDP, no conflicts. |
| **Smart queue** | Serializes concurrent calls. No timeouts, no crashes. |
| **6 powerful tools** | List, query, create notebooks + add sources. Everything you need. |
| **TypeScript native** | No Python, no virtualenv, no pipx. Just Node.js. |

---

## 🚀 Quick Start

**Step 1: Login (one time only)**

```bash
npx oneclicklm login
```

A browser opens → sign in with Google → done. Your cookies are saved locally (~/.oneclicklm/).

**Step 2: Add to your MCP client**

```json
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["oneclicklm"]
    }
  }
}
```

**Step 3: Start talking to your notebooks!**

```
"List my NotebookLM notebooks"
"What are the key findings in my Research notebook?"
"Create a new notebook called 'Project Alpha'"
"Add this URL to my notebook: https://example.com/paper.pdf"
```

That's it. No API keys, no profiles, no metadata.json, no build_label hunting.

---

## 🛠 Available Tools

| Tool | What it does | Example prompt |
|:---|:---|:---|
| `notebook_list` | List all your notebooks | "Show me my NotebookLM notebooks" |
| `notebook_get` | Get notebook details + sources | "What sources are in my Research notebook?" |
| `notebook_query` | Ask questions, get cited answers | "What does my notebook say about X?" |
| `notebook_create` | Create a new notebook | "Create a notebook called 'Q1 Report'" |
| `source_add` | Add URL, YouTube, or text sources | "Add this article to my notebook" |
| `source_list` | List all sources + their status | "Show sources in my Project notebook" |

> **Pro tip:** notebook_query uses the same AI (Gemini) as the NotebookLM web app — your answers are grounded in your actual sources with zero hallucination.

---

## 💻 IDE Setup

<details>
<summary><strong>🟢 Cursor</strong></summary>

Add to `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["oneclicklm"]
    }
  }
}
```

</details>

<details>
<summary><strong>🟣 Claude Code (CLI)</strong></summary>

```bash
claude mcp add notebooklm -- npx oneclicklm
```

</details>

<details>
<summary><strong>🔵 VS Code (Copilot)</strong></summary>

Add to `.vscode/mcp.json`:

```json
{
  "servers": {
    "notebooklm": {
      "command": "npx",
      "args": ["oneclicklm"]
    }
  }
}
```

</details>

<details>
<summary><strong>🟡 Windsurf</strong></summary>

Add to `~/.windsurf/mcp.json`:

```json
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["oneclicklm"]
    }
  }
}
```

</details>

---

## 🔍 How OneClickLM Compares

| Feature | OneClickLM | notebooklm-mcp (Python) | notebooklm-mcp-cli |
|:---|:---:|:---:|:---:|
| Auto token refresh | ✅ | ❌ | ❌ |
| Auto build_label update | ✅ | ❌ | ❌ |
| Auto-reconnect on failure | ✅ | ❌ | ❌ |
| Request queue (no crashes) | ✅ | ❌ | ❌ |
| Zero-config install | ✅ `npx` | ❌ pipx + profiles | ❌ pipx + profiles |
| Language | TypeScript | Python | Python |
| Chrome conflicts | None | Common | Common |
| Human-readable errors | ✅ | ❌ | ❌ |
| Create notebooks via MCP | ✅ | ❌ | ✅ |
| Add sources via MCP | ✅ | ❌ | ✅ |

---

## ⚙️ Configuration

OneClickLM works with **zero configuration**. But if you need it:

```bash
# Custom config directory
ONECLICKLM_DIR=~/.my-config npx oneclicklm

# Debug logging (see what's happening under the hood)
ONECLICKLM_LOG=debug npx oneclicklm

# Custom request timeout (default: 30s, queries may need longer)
ONECLICKLM_TIMEOUT=60000 npx oneclicklm

# Custom Chrome path
CHROME_PATH=/path/to/chrome npx oneclicklm login
```

Config is stored in `~/.oneclicklm/`:
```
~/.oneclicklm/
├── cookies.json    # Google auth cookies (auto-managed)
└── tokens.json     # CSRF + session + build_label (auto-refreshed)
```

---

## 🧠 How It Works (for the curious)

OneClickLM speaks the same language as the NotebookLM web app — Google's internal `batchexecute` RPC protocol.

Here's what happens when you ask a question:

```
You: "What are the key findings?"
 ↓
MCP Client (Cursor/Claude/VS Code) sends tool call
 ↓
OneClickLM checks tokens → auto-refreshes if stale
 ↓
Fetches source IDs from notebook (RPC: rLM1Ne)
 ↓
Sends query via streaming endpoint (GenerateFreeFormStreamed)
 ↓
Parses streaming response → extracts answer
 ↓
Returns grounded, cited answer to your AI
```

**The magic is in the auto-healing auth:**
1. On startup: loads saved cookies + cached tokens
2. If tokens expired (>1 hour): fetches NotebookLM page → extracts fresh `SNlM0e` (CSRF) + `FdrFJe` (session) + `build_label`
3. If cookies expired (~30 days): prompts for re-login
4. If API returns 400/401: auto-refreshes tokens and retries once
5. All requests serialized through a queue → no concurrent crash

> [!NOTE]
> OneClickLM uses Google's internal web protocol, not an official API. This means it works with your existing Google account — no API keys, no billing, no quotas. Google AI Pro subscribers get full NotebookLM access.

---

## 🔧 Troubleshooting

<details>
<summary><strong>Login window doesn't appear</strong></summary>

Make sure Chrome/Chromium is installed. OneClickLM detects it automatically on macOS, Windows, and Linux.

```bash
# If using a non-standard Chrome location:
CHROME_PATH=/path/to/chrome npx oneclicklm login
```

</details>

<details>
<summary><strong>Getting 400/401 errors</strong></summary>

OneClickLM auto-refreshes tokens, but if it persists:

```bash
# Force token refresh
npx oneclicklm refresh

# Nuclear option: re-login
npx oneclicklm login
```

</details>

<details>
<summary><strong>Queries are slow (~15-30 seconds)</strong></summary>

This is **normal**. NotebookLM processes your query against all uploaded sources in real-time (this is the Gemini model working). The NotebookLM web app has similar response times. For faster results, use notebooks with fewer sources.

</details>

<details>
<summary><strong>Check if everything is working</strong></summary>

```bash
npx oneclicklm status
```

This verifies cookies, extracts fresh tokens, and tells you if anything is wrong.

</details>

---

## 🤝 Contributing

Contributions welcome! Bug reports, feature requests, and PRs are all appreciated.

```bash
git clone https://github.com/CRtheHILLS/OneClickLM.git
cd OneClickLM
npm install
npm run build
node dist/src/index.js  # Run locally
```

---

## ⭐ Star History

If OneClickLM saved you from NotebookLM auth hell, consider starring the repo!

<p align="center">
  <a href="https://star-history.com/#CRtheHILLS/OneClickLM&Date">
    <img src="https://api.star-history.com/svg?repos=CRtheHILLS/OneClickLM&type=Date" width="600" alt="Star History" />
  </a>
</p>

---

## License

MIT © [CRtheHILLS](https://github.com/CRtheHILLS)

---

<p align="center">
  <sub>Built with frustration, fixed with determination. 🔥</sub><br>
  <sub>Born from <a href="https://github.com/CRtheHILLS/beyond-human">BEYOND HUMAN</a> — a 6-domain AI chatbot platform powered by NotebookLM.</sub>
</p>

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing, getting, querying, creating notebooks, and adding/listening to sources. No overlapping functionality.

Naming Consistency5/5

All tool names follow a consistent noun_verb pattern (e.g., notebook_list, source_add), with snake_case throughout.

Tool Count5/5

6 tools is well-scoped for managing NotebookLM notebooks, covering creation, querying, and source management without being excessive or insufficient.

Completeness4/5

Covers core workflows well but lacks delete or update operations for notebooks and sources, which may be needed for full lifecycle management.

Maintenance

ActivityInactive
ResponsivenessNo issues