@m4ykeldev/notebooklm-mcp 0.1.21 β 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -160
- package/dist/cli.js +48 -19
- package/dist/cli.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
# NotebookLM MCP Server
|
|
1
|
+
# π§ NotebookLM MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
### Unlock the Power of Google NotebookLM Directly in Your AI Workflow
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@m4ykeldev/notebooklm-mcp)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Stop switching tabs. Stop manual copy-pasting. **NotebookLM MCP** brings the full potential of [Google NotebookLM](https://notebooklm.google.com) to your terminal, IDE, and AI assistants (Claude, Cursor, VS Code).
|
|
9
|
+
|
|
10
|
+
With **32+ specialized tools**, you can now automate notebook management, source ingestion, deep research, and studio-quality content generationβall without leaving your development environment.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## β¨ Features that Empower You
|
|
15
|
+
|
|
16
|
+
- π **Smart Authentication**: Zero-friction login with automated cookie extraction.
|
|
17
|
+
- π **Invisible Refresh**: Background session restoration keeps you connected without interruptions.
|
|
18
|
+
- π **Total Notebook Control**: Create, list, rename, and analyze notebooks programmatically.
|
|
19
|
+
- π **Seamless Ingestion**: Add URLs, YouTube videos, Google Drive docs, or raw text as sources.
|
|
20
|
+
- π¬ **Automated Research**: Trigger Deep Research tasks and import discovered insights instantly.
|
|
21
|
+
- π¨ **Studio Content**: Generate Audio Overviews, infographics, slide decks, and briefing docs on the fly.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## β‘ Quick Start
|
|
8
26
|
|
|
9
27
|
### 1. Install & Run
|
|
10
28
|
|
|
@@ -19,39 +37,27 @@ npm install -g @m4ykeldev/notebooklm-mcp
|
|
|
19
37
|
notebooklm-mcp serve
|
|
20
38
|
```
|
|
21
39
|
|
|
22
|
-
### 2.
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx @m4ykeldev/notebooklm-mcp auth
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
This opens a dedicated Google Chrome instance (managed by the MCP server). If you're already logged in there, the server will **automatically** grab your session cookies. If not, simply log in once and it will handle the rest.
|
|
40
|
+
### 2. Smart Authentication (Zero Friction)
|
|
29
41
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
**Manual Authentication**
|
|
33
|
-
|
|
34
|
-
If you don't use Chrome or the automated flow fails:
|
|
35
|
-
```bash
|
|
36
|
-
npx @m4ykeldev/notebooklm-mcp auth --manual
|
|
37
|
-
```
|
|
38
|
-
This flow guides you through copying cookies from your own browser's DevTools.
|
|
39
|
-
|
|
40
|
-
**Alternative: environment variables**
|
|
42
|
+
Authenticating is now a "magical" experience. No more manual cookie hunting.
|
|
41
43
|
|
|
42
44
|
```bash
|
|
43
|
-
|
|
45
|
+
notebooklm-mcp auth
|
|
44
46
|
```
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
- **How it works**: A dedicated, secure Chrome profile opens.
|
|
49
|
+
- **Persistence**: Log in once, and the session is saved.
|
|
50
|
+
- **Automation**: The server automatically detects your session and synchronizes cookies.
|
|
51
|
+
- **Reliability**: If your session expires, the server **effortlessly restores it** in the background.
|
|
47
52
|
|
|
48
|
-
|
|
53
|
+
*Prefer the old way? Use `notebooklm-mcp auth --manual` for traditional copy-paste extraction.*
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
---
|
|
51
56
|
|
|
52
|
-
|
|
57
|
+
## π€ Integrate with Your Favorite Tools
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
### Claude Desktop / Claude Code
|
|
60
|
+
Add this to your `mcpServers` configuration:
|
|
55
61
|
|
|
56
62
|
```json
|
|
57
63
|
{
|
|
@@ -64,147 +70,68 @@ Add this to your `claude_desktop_config.json` or MCP configuration:
|
|
|
64
70
|
}
|
|
65
71
|
```
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
| `notebook_create` | Create a new notebook |
|
|
111
|
-
| `notebook_get` | Get details of a specific notebook |
|
|
112
|
-
| `notebook_describe` | AI-generated summary of notebook contents |
|
|
113
|
-
| `notebook_rename` | Rename a notebook |
|
|
114
|
-
| `notebook_delete` | Delete a notebook (requires confirmation) |
|
|
115
|
-
|
|
116
|
-
### Sources
|
|
117
|
-
|
|
118
|
-
| Tool | Description |
|
|
119
|
-
| -------------------- | ------------------------------------------------ |
|
|
120
|
-
| `notebook_add_url` | Add a URL or YouTube video as a source |
|
|
121
|
-
| `notebook_add_text` | Add pasted text as a source |
|
|
122
|
-
| `notebook_add_drive` | Add a Google Drive document as a source |
|
|
123
|
-
| `source_describe` | AI summary and keywords for a source |
|
|
124
|
-
| `source_get_content` | Raw text content of a source |
|
|
125
|
-
| `source_list_drive` | List sources with Drive freshness status |
|
|
126
|
-
| `source_sync_drive` | Sync stale Drive sources (requires confirmation) |
|
|
127
|
-
| `source_delete` | Delete a source (requires confirmation) |
|
|
128
|
-
|
|
129
|
-
### Query & Chat
|
|
130
|
-
|
|
131
|
-
| Tool | Description |
|
|
132
|
-
| ---------------- | ------------------------------------ |
|
|
133
|
-
| `notebook_query` | Ask questions about notebook sources |
|
|
134
|
-
| `chat_configure` | Set chat goal and response length |
|
|
135
|
-
|
|
136
|
-
### Research
|
|
137
|
-
|
|
138
|
-
| Tool | Description |
|
|
139
|
-
| ----------------- | --------------------------------------- |
|
|
140
|
-
| `research_start` | Start a web or Drive research task |
|
|
141
|
-
| `research_status` | Check research task progress |
|
|
142
|
-
| `research_import` | Import discovered sources from research |
|
|
143
|
-
|
|
144
|
-
### Studio β Content Generation
|
|
145
|
-
|
|
146
|
-
| Tool | Description |
|
|
147
|
-
| ----------------------- | ---------------------------------------------------- |
|
|
148
|
-
| `audio_overview_create` | Generate an audio podcast |
|
|
149
|
-
| `video_overview_create` | Generate a video summary |
|
|
150
|
-
| `infographic_create` | Generate an infographic |
|
|
151
|
-
| `slide_deck_create` | Generate a slide presentation |
|
|
152
|
-
| `report_create` | Generate a report (briefing, study guide, blog post) |
|
|
153
|
-
| `flashcards_create` | Generate study flashcards |
|
|
154
|
-
| `quiz_create` | Generate a quiz |
|
|
155
|
-
| `data_table_create` | Generate a data table |
|
|
156
|
-
| `mind_map_create` | Generate and save a mind map |
|
|
157
|
-
| `studio_status` | Check generation status and download URLs |
|
|
158
|
-
| `studio_delete` | Delete a studio artifact (requires confirmation) |
|
|
159
|
-
|
|
160
|
-
### Authentication
|
|
161
|
-
|
|
162
|
-
| Tool | Description |
|
|
163
|
-
| -------------- | -------------------------------------------------- |
|
|
164
|
-
| `refresh_auth` | Reload authentication tokens equires confirmation) |
|
|
165
|
-
|
|
166
|
-
### Authentication
|
|
167
|
-
|
|
168
|
-
| Tool | Description |
|
|
169
|
-
| ------------------ | ------------------------------------ |
|
|
170
|
-
| `refresh_auth` | Reload authentication tokens |
|
|
171
|
-
| `save_auth_tokens` | Manually save authentication cookies |
|
|
172
|
-
|
|
173
|
-
## CLI Reference
|
|
73
|
+
### Cursor / VS Code
|
|
74
|
+
1. Open **MCP Settings**.
|
|
75
|
+
2. Add a new server named `NotebookLM`.
|
|
76
|
+
3. Set type to `command` and use: `npx -y @m4ykeldev/notebooklm-mcp serve`.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## π Available Tools (32)
|
|
81
|
+
|
|
82
|
+
### π Notebooks
|
|
83
|
+
| Tool | Description |
|
|
84
|
+
| :--- | :--- |
|
|
85
|
+
| `notebook_list` | Overview of all your notebooks. |
|
|
86
|
+
| `notebook_create` | Start a new project instantly. |
|
|
87
|
+
| `notebook_get` | Dive deep into a specific notebook's metadata. |
|
|
88
|
+
| `notebook_describe` | Get an AI-generated summary of your entire notebook. |
|
|
89
|
+
|
|
90
|
+
### π Sources
|
|
91
|
+
| Tool | Description |
|
|
92
|
+
| :--- | :--- |
|
|
93
|
+
| `notebook_add_url` | Ingest web pages or YouTube transcripts. |
|
|
94
|
+
| `notebook_add_drive` | Connect your Google Drive documents. |
|
|
95
|
+
| `source_describe` | Instant AI analysis and keywords for any source. |
|
|
96
|
+
| `source_get_content` | Extract raw text for downstream processing. |
|
|
97
|
+
|
|
98
|
+
### π§ͺ Research & Query
|
|
99
|
+
| Tool | Description |
|
|
100
|
+
| :--- | :--- |
|
|
101
|
+
| `research_start` | Launch Web or Drive research tasks (Fast or Deep). |
|
|
102
|
+
| `notebook_query` | Ask complex questions grounded in your sources. |
|
|
103
|
+
| `research_import` | Bring research findings directly into your notebook. |
|
|
104
|
+
|
|
105
|
+
### π¬ Studio (Content Generation)
|
|
106
|
+
| Tool | Description |
|
|
107
|
+
| :--- | :--- |
|
|
108
|
+
| `audio_overview_create` | Turn sources into a professional podcast. |
|
|
109
|
+
| `report_create` | Generate Briefing Docs, Study Guides, or Blog Posts. |
|
|
110
|
+
| `slide_deck_create` | Create presenter-ready slides from your data. |
|
|
111
|
+
| `infographic_create` | Visualize information automatically. |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## βοΈ Advanced Usage
|
|
174
116
|
|
|
175
117
|
```bash
|
|
176
|
-
#
|
|
177
|
-
notebooklm-mcp serve
|
|
118
|
+
# Set a custom query timeout
|
|
178
119
|
notebooklm-mcp serve --query-timeout 60000
|
|
179
120
|
|
|
180
|
-
#
|
|
181
|
-
notebooklm-mcp auth
|
|
182
|
-
|
|
183
|
-
# Authenticate manually (copy-paste cookies)
|
|
184
|
-
notebooklm-mcp auth --manual
|
|
185
|
-
|
|
186
|
-
# Import cookies from a file
|
|
187
|
-
notebooklm-mcp auth --file cookies.txt
|
|
188
|
-
|
|
189
|
-
# Show cached token info
|
|
121
|
+
# Manage authentication tokens
|
|
190
122
|
notebooklm-mcp auth --show-tokens
|
|
191
123
|
```
|
|
192
124
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
This server communicates with NotebookLM through Google's internal `batchexecute` RPC endpoint. It uses the same API that the NotebookLM web app uses in your browser.
|
|
196
|
-
|
|
197
|
-
Authentication is cookie-based β the server needs your Google session cookies to make requests on your behalf. Cookies are extracted once and cached locally. CSRF tokens are auto-refreshed when they expire.
|
|
198
|
-
|
|
199
|
-
## Requirements
|
|
125
|
+
---
|
|
200
126
|
|
|
201
|
-
|
|
202
|
-
- A Google account with access to [NotebookLM](https://notebooklm.google.com)
|
|
127
|
+
## π‘ Disclaimer & Security
|
|
203
128
|
|
|
204
|
-
|
|
129
|
+
- **Security First**: Your cookies are stored locally at `~/.notebooklm-mcp/auth.json` and never shared.
|
|
130
|
+
- **Unofficial**: This project is not affiliated with Google. It utilizes internal RPC endpoints (`batchexecute`) and is subject to changes in NotebookLM's web API.
|
|
205
131
|
|
|
206
|
-
|
|
132
|
+
## π License
|
|
207
133
|
|
|
208
|
-
|
|
134
|
+
Distributed under the [MIT License](LICENSE).
|
|
209
135
|
|
|
210
|
-
|
|
136
|
+
---
|
|
137
|
+
Built with β€οΈ for the AI developer community using the [Model Context Protocol](https://modelcontextprotocol.io).
|
package/dist/cli.js
CHANGED
|
@@ -459,10 +459,19 @@ async function getDebuggerUrl(port) {
|
|
|
459
459
|
const maxRetries = 20;
|
|
460
460
|
for (let i = 0; i < maxRetries; i++) {
|
|
461
461
|
try {
|
|
462
|
-
const response = await fetch(`http://localhost:${port}/json/
|
|
462
|
+
const response = await fetch(`http://localhost:${port}/json/list`);
|
|
463
463
|
if (response.ok) {
|
|
464
464
|
const data = await response.json();
|
|
465
|
-
|
|
465
|
+
if (Array.isArray(data)) {
|
|
466
|
+
const notebookTab = data.find(
|
|
467
|
+
(target) => target?.type === "page" && typeof target?.url === "string" && target.url.startsWith(BASE_URL) && typeof target?.webSocketDebuggerUrl === "string"
|
|
468
|
+
);
|
|
469
|
+
if (notebookTab) return notebookTab.webSocketDebuggerUrl;
|
|
470
|
+
const firstPage = data.find(
|
|
471
|
+
(target) => target?.type === "page" && typeof target?.webSocketDebuggerUrl === "string"
|
|
472
|
+
);
|
|
473
|
+
if (firstPage) return firstPage.webSocketDebuggerUrl;
|
|
474
|
+
}
|
|
466
475
|
}
|
|
467
476
|
} catch {
|
|
468
477
|
}
|
|
@@ -473,7 +482,9 @@ async function getDebuggerUrl(port) {
|
|
|
473
482
|
async function launchChrome(headless) {
|
|
474
483
|
const chromePath = findChrome();
|
|
475
484
|
if (!chromePath) {
|
|
476
|
-
throw new Error(
|
|
485
|
+
throw new Error(
|
|
486
|
+
"Could not find Google Chrome or Chromium. Please use manual auth."
|
|
487
|
+
);
|
|
477
488
|
}
|
|
478
489
|
const userDataDir = join2(homedir2(), ".notebooklm-mcp", "chrome-profile");
|
|
479
490
|
mkdirSync2(userDataDir, { recursive: true });
|
|
@@ -487,7 +498,10 @@ async function launchChrome(headless) {
|
|
|
487
498
|
if (headless) {
|
|
488
499
|
args.push("--headless=new");
|
|
489
500
|
}
|
|
490
|
-
const chromeProcess = spawn(chromePath, args, {
|
|
501
|
+
const chromeProcess = spawn(chromePath, args, {
|
|
502
|
+
detached: true,
|
|
503
|
+
stdio: "ignore"
|
|
504
|
+
});
|
|
491
505
|
chromeProcess.unref();
|
|
492
506
|
return chromeProcess;
|
|
493
507
|
}
|
|
@@ -498,6 +512,7 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
498
512
|
let messageId = 0;
|
|
499
513
|
let timer;
|
|
500
514
|
let globalTimeout;
|
|
515
|
+
let lastCdpError = null;
|
|
501
516
|
const cleanup = () => {
|
|
502
517
|
clearInterval(timer);
|
|
503
518
|
clearTimeout(globalTimeout);
|
|
@@ -510,7 +525,11 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
510
525
|
};
|
|
511
526
|
globalTimeout = setTimeout(() => {
|
|
512
527
|
cleanup();
|
|
513
|
-
reject(
|
|
528
|
+
reject(
|
|
529
|
+
new Error(
|
|
530
|
+
lastCdpError ? `Authentication timed out after ${timeoutMs / 1e3}s (CDP error: ${lastCdpError}).` : `Authentication timed out after ${timeoutMs / 1e3}s.`
|
|
531
|
+
)
|
|
532
|
+
);
|
|
514
533
|
}, timeoutMs);
|
|
515
534
|
ws.on("open", () => {
|
|
516
535
|
send("Network.enable");
|
|
@@ -520,7 +539,11 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
520
539
|
});
|
|
521
540
|
ws.on("close", () => {
|
|
522
541
|
cleanup();
|
|
523
|
-
reject(
|
|
542
|
+
reject(
|
|
543
|
+
new Error(
|
|
544
|
+
"Browser connection closed before authentication was complete."
|
|
545
|
+
)
|
|
546
|
+
);
|
|
524
547
|
});
|
|
525
548
|
ws.on("error", (err) => {
|
|
526
549
|
cleanup();
|
|
@@ -529,6 +552,10 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
529
552
|
ws.on("message", (data) => {
|
|
530
553
|
try {
|
|
531
554
|
const response = JSON.parse(data.toString());
|
|
555
|
+
if (response.error) {
|
|
556
|
+
lastCdpError = response.error.message || JSON.stringify(response.error);
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
532
559
|
if (response.result && response.result.cookies) {
|
|
533
560
|
const cookies = {};
|
|
534
561
|
for (const c of response.result.cookies) {
|
|
@@ -567,20 +594,22 @@ async function refreshCookiesHeadless() {
|
|
|
567
594
|
}
|
|
568
595
|
}
|
|
569
596
|
async function runBrowserAuthFlow() {
|
|
570
|
-
console.log("\
|
|
571
|
-
console.log(
|
|
597
|
+
console.log("\u2728 Initializing Smart Authentication... (Setting up a secure session)");
|
|
598
|
+
console.log(
|
|
599
|
+
" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)"
|
|
600
|
+
);
|
|
572
601
|
const chromeProcess = await launchChrome(false);
|
|
573
602
|
try {
|
|
574
|
-
console.log("\
|
|
575
|
-
console.log("If you are already logged in, extraction will happen automatically.");
|
|
576
|
-
console.log("If not, please complete the login process in the browser window.\n");
|
|
603
|
+
console.log("\n\u{1F513} Ready for login! If you're already signed into Google, we'll handle the rest automatically.\n");
|
|
577
604
|
const tokens = await extractCookiesViaCDP(12e4, true);
|
|
578
|
-
console.log("\n\u2705
|
|
605
|
+
console.log("\n\u2705 Connection secured! Your NotebookLM session is now synchronized.");
|
|
579
606
|
return tokens;
|
|
580
607
|
} catch (error) {
|
|
581
608
|
if (error instanceof Error) {
|
|
582
|
-
throw new Error(
|
|
583
|
-
|
|
609
|
+
throw new Error(
|
|
610
|
+
`Smart Auth failed: ${error.message}
|
|
611
|
+
Try manual auth instead.`
|
|
612
|
+
);
|
|
584
613
|
}
|
|
585
614
|
throw error;
|
|
586
615
|
} finally {
|
|
@@ -730,13 +759,13 @@ var NotebookLMClient = class {
|
|
|
730
759
|
return this.extractRpcResult(parsed, rpcId);
|
|
731
760
|
} catch (e) {
|
|
732
761
|
if (e instanceof AuthenticationError) {
|
|
733
|
-
console.log("\
|
|
762
|
+
console.log("\u{1F504} Session expired. Effortlessly restoring your connection in the background...");
|
|
734
763
|
try {
|
|
735
764
|
let newTokens;
|
|
736
765
|
try {
|
|
737
766
|
newTokens = await refreshCookiesHeadless();
|
|
738
767
|
} catch (refreshError) {
|
|
739
|
-
console.log("\u26A0\uFE0F
|
|
768
|
+
console.log("\u26A0\uFE0F Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.");
|
|
740
769
|
newTokens = await runBrowserAuthFlow();
|
|
741
770
|
}
|
|
742
771
|
this.tokens = newTokens;
|
|
@@ -1081,12 +1110,12 @@ var NotebookLMClient = class {
|
|
|
1081
1110
|
if (Array.isArray(chunk)) {
|
|
1082
1111
|
for (const item of chunk) {
|
|
1083
1112
|
if (Array.isArray(item) && item[0] === "wrb.fr" && Array.isArray(item[5]) && item[5].includes(16)) {
|
|
1084
|
-
console.log("\
|
|
1113
|
+
console.log("\u{1F504} Session expired during query. Effortlessly restoring your connection in the background...");
|
|
1085
1114
|
let newTokens;
|
|
1086
1115
|
try {
|
|
1087
1116
|
newTokens = await refreshCookiesHeadless();
|
|
1088
1117
|
} catch (refreshError) {
|
|
1089
|
-
console.log("\u26A0\uFE0F
|
|
1118
|
+
console.log("\u26A0\uFE0F Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.");
|
|
1090
1119
|
newTokens = await runBrowserAuthFlow();
|
|
1091
1120
|
}
|
|
1092
1121
|
this.tokens = newTokens;
|
|
@@ -2094,7 +2123,7 @@ function createServer(queryTimeout) {
|
|
|
2094
2123
|
|
|
2095
2124
|
// src/cli.ts
|
|
2096
2125
|
var program = new Command();
|
|
2097
|
-
program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.
|
|
2126
|
+
program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.22");
|
|
2098
2127
|
program.command("serve").description("Start the MCP server (stdio transport)").option("--debug", "Enable debug logging").option("--query-timeout <ms>", "Query timeout in milliseconds", "120000").action(async (opts) => {
|
|
2099
2128
|
const queryTimeout = parseInt(opts.queryTimeout, 10);
|
|
2100
2129
|
const server = createServer(queryTimeout);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/browser-auth.ts","../src/client.ts","../src/tools/index.ts","../src/tools/auth.ts","../src/tools/query.ts","../src/tools/research.ts","../src/tools/notebook.ts","../src/tools/source.ts","../src/tools/studio.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runAuthFlow, runFileImport, showTokens } from \"./auth.js\";\nimport { runBrowserAuthFlow } from \"./browser-auth.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"notebooklm-mcp\")\n .description(\"MCP server for Google NotebookLM\")\n .version(\"0.1.21\");\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .option(\"--debug\", \"Enable debug logging\")\n .option(\"--query-timeout <ms>\", \"Query timeout in milliseconds\", \"120000\")\n .action(async (opts) => {\n const queryTimeout = parseInt(opts.queryTimeout, 10);\n const server = createServer(queryTimeout);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n\nprogram\n .command(\"auth\")\n .description(\"Authenticate with NotebookLM (automated Chrome integration)\")\n .option(\"--manual\", \"Use manual cookie copy-paste instead\")\n .option(\"--file <path>\", \"Import cookies from a file instead\")\n .option(\"--show-tokens\", \"Show cached token info (no secrets)\")\n .action(async (opts) => {\n if (opts.showTokens) {\n showTokens();\n return;\n }\n\n if (opts.file) {\n await runFileImport(opts.file);\n return;\n }\n\n if (opts.manual) {\n await runAuthFlow();\n return;\n }\n\n try {\n await runBrowserAuthFlow();\n } catch (error) {\n console.log(`\\nβ οΈ Smart Authentication failed: ${(error as Error).message}`);\n console.log(\"Falling back to manual authentication flow...\\n\");\n await runAuthFlow();\n }\n });\n\n// Default command: serve (for npx compatibility)\nif (process.argv.length <= 2) {\n process.argv.push(\"serve\");\n}\n\nprogram.parse();\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"./client.js\";\nimport { loadTokens, saveTokens } from \"./auth.js\";\nimport type { AuthTokens, ToolResult } from \"./types.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { authTools } from \"./tools/auth.js\";\nimport { queryTools } from \"./tools/query.js\";\nimport { researchTools } from \"./tools/research.js\";\nimport { notebookTools } from \"./tools/notebook.js\";\nimport { sourceTools } from \"./tools/source.js\";\nimport { studioTools } from \"./tools/studio.js\";\nlet client: NotebookLMClient | null = null;\n\nfunction getClient(queryTimeout?: number): NotebookLMClient {\n if (!client) {\n const tokens = loadTokens();\n client = new NotebookLMClient(tokens, queryTimeout);\n }\n return client;\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // βββ Refactored Tool Registration βββββββββββββββββββββ\n \n registerTools(server, [\n ...notebookTools,\n ...sourceTools,\n ...studioTools,\n ...authTools,\n ...queryTools,\n ...researchTools,\n ], getClient, { \n queryTimeout,\n onClientReset: () => { client = null; }\n });\n\n return server;\n}\n","export class CodeMapper {\n private nameToCode: Map<string, number>;\n private codeToName: Map<number, string>;\n private unknownLabel: string;\n private displayNames: string[];\n\n constructor(mapping: Record<string, number>, unknownLabel = \"unknown\") {\n this.nameToCode = new Map(\n Object.entries(mapping).map(([k, v]) => [k.toLowerCase(), v]),\n );\n this.codeToName = new Map(\n Object.entries(mapping).map(([k, v]) => [v, k]),\n );\n this.unknownLabel = unknownLabel;\n this.displayNames = Object.keys(mapping).sort();\n }\n\n getCode(name: string): number {\n const code = this.nameToCode.get(name.toLowerCase());\n if (code === undefined) {\n throw new Error(\n `Invalid value \"${name}\". Valid options: ${this.optionsStr()}`,\n );\n }\n return code;\n }\n\n getName(code: number | null): string {\n if (code === null) return this.unknownLabel;\n return this.codeToName.get(code) ?? this.unknownLabel;\n }\n\n optionsStr(): string {\n return this.displayNames.join(\", \");\n }\n\n names(): string[] {\n return [...this.displayNames];\n }\n}\n\n// RPC IDs\nexport const RPC_IDS = {\n LIST_NOTEBOOKS: \"wXbhsf\",\n GET_NOTEBOOK: \"rLM1Ne\",\n CREATE_NOTEBOOK: \"CCqFvf\",\n RENAME_NOTEBOOK: \"s0tc2d\",\n DELETE_NOTEBOOK: \"WWINqb\",\n ADD_SOURCE: \"izAoDd\",\n GET_SOURCE: \"hizoJc\",\n CHECK_FRESHNESS: \"yR9Yof\",\n SYNC_DRIVE: \"FLmJqe\",\n DELETE_SOURCE: \"tGMBJ\",\n GET_CONVERSATIONS: \"hPTbtc\",\n PREFERENCES: \"hT54vc\",\n SUBSCRIPTION: \"ozz5Z\",\n SETTINGS: \"ZwVcOc\",\n GET_SUMMARY: \"VfAZjd\",\n GET_SOURCE_GUIDE: \"tr032e\",\n START_FAST_RESEARCH: \"Ljjv0c\",\n START_DEEP_RESEARCH: \"QA9ei\",\n POLL_RESEARCH: \"e3bVqc\",\n IMPORT_RESEARCH: \"LBwxtb\",\n CREATE_STUDIO: \"R7cb6c\",\n POLL_STUDIO: \"gArtLc\",\n DELETE_STUDIO: \"V5N4be\",\n GENERATE_MIND_MAP: \"yyryJe\",\n SAVE_MIND_MAP: \"CYK0Xb\",\n LIST_MIND_MAPS: \"cFji9\",\n DELETE_MIND_MAP: \"AH0mwd\",\n} as const;\n\n// Ownership\nexport const OWNERSHIP_MINE = 1;\nexport const OWNERSHIP_SHARED = 2;\n\n// Chat\nexport const CHAT_GOALS = new CodeMapper({\n default: 1,\n custom: 2,\n learning_guide: 3,\n});\n\nexport const CHAT_RESPONSE_LENGTHS = new CodeMapper({\n default: 1,\n longer: 4,\n shorter: 5,\n});\n\n// Research\nexport const RESEARCH_SOURCES = new CodeMapper({ web: 1, drive: 2 });\nexport const RESEARCH_MODES = new CodeMapper({ fast: 1, deep: 5 });\nexport const RESULT_TYPES = new CodeMapper({\n web: 1,\n google_doc: 2,\n google_slides: 3,\n deep_report: 5,\n google_sheets: 8,\n});\n\n// Source Types\nexport const SOURCE_TYPES = new CodeMapper({\n google_docs: 1,\n google_slides_sheets: 2,\n pdf: 3,\n pasted_text: 4,\n web_page: 5,\n generated_text: 8,\n youtube: 9,\n uploaded_file: 11,\n image: 13,\n word_doc: 14,\n});\n\n// Studio Types\nexport const STUDIO_TYPES = new CodeMapper({\n audio: 1,\n report: 2,\n video: 3,\n flashcards: 4,\n infographic: 7,\n slide_deck: 8,\n data_table: 9,\n});\n\n// Audio\nexport const AUDIO_FORMATS = new CodeMapper({\n deep_dive: 1,\n brief: 2,\n critique: 3,\n debate: 4,\n});\n\nexport const AUDIO_LENGTHS = new CodeMapper({\n short: 1,\n default: 2,\n long: 3,\n});\n\n// Video\nexport const VIDEO_FORMATS = new CodeMapper({ explainer: 1, brief: 2 });\n\nexport const VIDEO_STYLES = new CodeMapper({\n auto_select: 1,\n custom: 2,\n classic: 3,\n whiteboard: 4,\n kawaii: 5,\n anime: 6,\n watercolor: 7,\n retro_print: 8,\n heritage: 9,\n paper_craft: 10,\n});\n\n// Infographic\nexport const INFOGRAPHIC_ORIENTATIONS = new CodeMapper({\n landscape: 1,\n portrait: 2,\n square: 3,\n});\n\nexport const INFOGRAPHIC_DETAILS = new CodeMapper({\n concise: 1,\n standard: 2,\n detailed: 3,\n});\n\n// Slide Deck\nexport const SLIDE_DECK_FORMATS = new CodeMapper({\n detailed_deck: 1,\n presenter_slides: 2,\n});\n\nexport const SLIDE_DECK_LENGTHS = new CodeMapper({\n short: 1,\n default: 3,\n});\n\n// Flashcards/Quiz\nexport const FLASHCARD_DIFFICULTIES = new CodeMapper({\n easy: 1,\n medium: 2,\n hard: 3,\n});\n\nexport const FLASHCARD_COUNT_DEFAULT = 2;\n\n// Report Formats\nexport const REPORT_FORMATS: Record<\n string,\n { title: string; description: string; prompt: string }\n> = {\n \"Briefing Doc\": {\n title: \"Briefing Doc\",\n description: \"A comprehensive briefing document\",\n prompt: \"Create a briefing document\",\n },\n \"Study Guide\": {\n title: \"Study Guide\",\n description: \"A study guide for the material\",\n prompt: \"Create a study guide\",\n },\n \"Blog Post\": {\n title: \"Blog Post\",\n description: \"A blog post about the material\",\n prompt: \"Create a blog post\",\n },\n \"Create Your Own\": {\n title: \"Create Your Own\",\n description: \"Custom report format\",\n prompt: \"\",\n },\n};\n\n// Base URL\nexport const BASE_URL = \"https://notebooklm.google.com\";\nexport const BATCHEXECUTE_PATH = \"/_/LabsTailwindUi/data/batchexecute\";\nexport const QUERY_PATH =\n \"/_/LabsTailwindUi/data/google.internal.labs.tailwind.orchestration.v1.LabsTailwindOrchestrationService/GenerateFreeFormStreamed\";\n\nexport const DEFAULT_BL = \"boq_labs-tailwind-frontend_20260108.06_p0\";\n\nexport const REQUIRED_COOKIES = [\n \"SID\",\n \"HSID\",\n \"SSID\",\n \"APISID\",\n \"SAPISID\",\n];\n\nexport const USER_AGENT =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36\";\n\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const EXTENDED_TIMEOUT = 120_000;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AuthTokens } from \"./types.js\";\nimport { REQUIRED_COOKIES, BASE_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".notebooklm-mcp\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nconst CHROME_PROFILE = join(CONFIG_DIR, \"chrome-profile\");\n\nexport function validateCookies(cookies: Record<string, string>): boolean {\n return REQUIRED_COOKIES.every((name) => name in cookies);\n}\n\nexport function buildCookieHeader(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n\nexport function extractCsrfFromPage(html: string): string | null {\n const patterns = [\n /\"SNlM0e\":\"([^\"]+)\"/,\n /at=([^&\"]+)/,\n /\"FdrFJe\":\"([^\"]+)\"/,\n ];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function extractSessionIdFromPage(html: string): string | null {\n const patterns = [/\"FdrFJe\":\"([^\"]+)\"/, /f\\.sid=(\\d+)/];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function saveTokens(tokens: AuthTokens): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(AUTH_FILE, JSON.stringify(tokens, null, 2), \"utf-8\");\n}\n\nexport function loadTokensFromCache(): AuthTokens | null {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = JSON.parse(readFileSync(AUTH_FILE, \"utf-8\"));\n if (data.cookies && validateCookies(data.cookies)) {\n return {\n cookies: data.cookies,\n csrf_token: data.csrf_token || \"\",\n session_id: data.session_id || \"\",\n extracted_at: data.extracted_at || 0,\n };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function loadTokensFromEnv(): AuthTokens | null {\n const cookieStr = process.env.NOTEBOOKLM_COOKIES;\n if (!cookieStr) return null;\n\n const cookies: Record<string, string> = {};\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n\n if (!validateCookies(cookies)) return null;\n\n return {\n cookies,\n csrf_token: process.env.NOTEBOOKLM_CSRF_TOKEN || \"\",\n session_id: process.env.NOTEBOOKLM_SESSION_ID || \"\",\n extracted_at: Date.now() / 1000,\n };\n}\n\nexport function loadTokens(): AuthTokens {\n const fromEnv = loadTokensFromEnv();\n if (fromEnv) return fromEnv;\n\n const fromCache = loadTokensFromCache();\n if (fromCache) return fromCache;\n\n throw new Error(\n \"No authentication tokens found. Run `npx @m4ykeldev/notebooklm-mcp auth` to authenticate, \" +\n \"or set NOTEBOOKLM_COOKIES environment variable.\",\n );\n}\n\nfunction parseCookieString(raw: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n for (const part of trimmed.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n }\n return cookies;\n}\n\nexport async function runFileImport(filePath?: string): Promise<AuthTokens> {\n if (!filePath) {\n console.log(`\nTo authenticate via file:\n1. Open Chrome and navigate to https://notebooklm.google.com\n2. Open DevTools (F12) > Network tab\n3. Type \"batchexecute\" in the filter\n4. Click on any batchexecute request\n5. Find \"cookie:\" in Request Headers\n6. Copy the full cookie VALUE (not the header name)\n7. Save to a file and provide the path\n`);\n throw new Error(\"Provide a cookie file path with --file <path>\");\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const cookies = parseCookieString(raw);\n\n if (!validateCookies(cookies)) {\n throw new Error(\n `Missing required cookies. Need: ${REQUIRED_COOKIES.join(\", \")}`,\n );\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n console.log(\"Authentication tokens saved successfully.\");\n return tokens;\n}\n\nfunction readLineFromStdin(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(prompt, (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction openInBrowser(url: string): void {\n const platform = process.platform;\n try {\n if (platform === \"linux\") {\n execSync(`xdg-open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"darwin\") {\n execSync(`open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"win32\") {\n execSync(`start \"\" \"${url}\"`, { stdio: \"ignore\" });\n }\n } catch {\n console.log(`Could not open browser automatically. Open this URL manually:\\n${url}`);\n }\n}\n\nexport async function runAuthFlow(): Promise<AuthTokens> {\n console.log(\"ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\");\n console.log(\"β NotebookLM MCP β Authentication Setup β\");\n console.log(\"ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\\n\");\n\n console.log(\"Opening NotebookLM in your browser...\\n\");\n openInBrowser(BASE_URL);\n\n console.log(\"Follow these steps:\\n\");\n console.log(\" 1. NotebookLM should open in your browser (you're already logged in)\");\n console.log(\" 2. Press F12 to open DevTools\");\n console.log(\" 3. Go to the Network tab\");\n console.log(\" 4. Type 'batchexecute' in the filter box\");\n console.log(\" 5. Click on any request that appears in the list\");\n console.log(\" 6. In the Headers panel, find 'cookie:' under Request Headers\");\n console.log(\" 7. Right-click the cookie value β Copy value\\n\");\n console.log(\" Tip: If no requests appear, refresh the page (F5) with DevTools open.\\n\");\n\n const cookieStr = await readLineFromStdin(\"Paste the cookie value here: \");\n\n if (!cookieStr) {\n throw new Error(\"No cookie string provided.\");\n }\n\n const cookies = parseCookieString(cookieStr);\n\n if (!validateCookies(cookies)) {\n console.log(\"\\nβ Missing required cookies.\");\n console.log(` Need: ${REQUIRED_COOKIES.join(\", \")}`);\n console.log(` Got: ${Object.keys(cookies).join(\", \")}`);\n throw new Error(\"Invalid cookie string. Make sure you copied the full cookie value.\");\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n\n console.log(`\\nβ
Authentication saved successfully!`);\n console.log(` ${Object.keys(cookies).length} cookies extracted`);\n console.log(` Stored in: ~/.notebooklm-mcp/auth.json`);\n console.log(`\\n CSRF token and session ID will be auto-extracted on first use.`);\n\n return tokens;\n}\n\nexport function showTokens(): void {\n const tokens = loadTokensFromCache();\n if (!tokens) {\n console.log(\"No cached tokens found.\");\n return;\n }\n\n const cookieNames = Object.keys(tokens.cookies);\n const hasRequired = REQUIRED_COOKIES.every((c) => cookieNames.includes(c));\n const age = tokens.extracted_at\n ? Math.round((Date.now() / 1000 - tokens.extracted_at) / 3600)\n : \"unknown\";\n\n console.log(`Cached tokens:`);\n console.log(` Cookies: ${cookieNames.length} (${cookieNames.join(\", \")})`);\n console.log(` Required cookies present: ${hasRequired ? \"yes\" : \"NO\"}`);\n console.log(` CSRF token: ${tokens.csrf_token ? \"present\" : \"missing\"}`);\n console.log(` Session ID: ${tokens.session_id ? \"present\" : \"missing\"}`);\n console.log(` Age: ${age} hours`);\n console.log(` File: ${AUTH_FILE}`);\n}\n","import { execSync, spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { AuthTokens } from \"./types.js\";\nimport {\n BASE_URL,\n REQUIRED_COOKIES,\n} from \"./constants.js\";\nimport {\n validateCookies,\n saveTokens,\n} from \"./auth.js\";\n\nconst CDP_PORT = 9229;\n\nexport function findChrome(): string | null {\n const candidates: string[] = [];\n\n if (process.platform === \"darwin\") {\n candidates.push(\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n );\n } else if (process.platform === \"linux\") {\n candidates.push(\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n );\n } else if (process.platform === \"win32\") {\n candidates.push(\n \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n `${process.env.LOCALAPPDATA}\\\\Chromium\\\\Application\\\\chrome.exe`,\n );\n }\n\n for (const candidate of candidates) {\n try {\n const cmd = process.platform === \"win32\" ? `\"${candidate}\" --version` : `\"${candidate}\" --version`;\n execSync(cmd, { stdio: \"ignore\" });\n return candidate;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\nasync function getDebuggerUrl(port: number): Promise<string> {\n const maxRetries = 20;\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(`http://localhost:${port}/json/version`);\n if (response.ok) {\n const data = await response.json() as any;\n return data.webSocketDebuggerUrl;\n }\n } catch {\n // wait and retry\n }\n await new Promise(r => setTimeout(r, 500));\n }\n throw new Error(\"Could not connect to Chrome remote debugging port.\");\n}\n\nexport async function launchChrome(headless: boolean) {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\"Could not find Google Chrome or Chromium. Please use manual auth.\");\n }\n\n const userDataDir = join(homedir(), \".notebooklm-mcp\", \"chrome-profile\");\n mkdirSync(userDataDir, { recursive: true });\n\n const args = [\n `--remote-debugging-port=${CDP_PORT}`,\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n BASE_URL,\n ];\n\n if (headless) {\n args.push(\"--headless=new\");\n }\n\n const chromeProcess = spawn(chromePath, args, { detached: true, stdio: \"ignore\" });\n chromeProcess.unref();\n return chromeProcess;\n}\n\nasync function extractCookiesViaCDP(timeoutMs: number, showProgress: boolean): Promise<AuthTokens> {\n const wsUrl = await getDebuggerUrl(CDP_PORT);\n const ws = new WebSocket(wsUrl);\n\n return new Promise((resolve, reject) => {\n let messageId = 0;\n let timer: NodeJS.Timeout;\n let globalTimeout: NodeJS.Timeout;\n\n const cleanup = () => {\n clearInterval(timer);\n clearTimeout(globalTimeout);\n ws.close();\n };\n\n const send = (method: string, params: any = {}) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ id: ++messageId, method, params }));\n }\n };\n\n globalTimeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Authentication timed out after ${timeoutMs / 1000}s.`));\n }, timeoutMs);\n\n ws.on(\"open\", () => {\n send(\"Network.enable\");\n timer = setInterval(() => {\n send(\"Network.getCookies\", { urls: [BASE_URL, \"https://google.com\"] });\n }, 2000);\n });\n\n ws.on(\"close\", () => {\n cleanup();\n reject(new Error(\"Browser connection closed before authentication was complete.\"));\n });\n\n ws.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n ws.on(\"message\", (data) => {\n try {\n const response = JSON.parse(data.toString());\n if (response.result && response.result.cookies) {\n const cookies: Record<string, string> = {};\n for (const c of response.result.cookies) {\n cookies[c.name] = c.value;\n }\n\n if (validateCookies(cookies)) {\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n cleanup();\n resolve(tokens);\n } else if (showProgress) {\n process.stdout.write(\".\");\n }\n }\n } catch (e) {\n // ignore parse errors\n }\n });\n });\n}\n\nexport async function refreshCookiesHeadless(): Promise<AuthTokens> {\n console.log(\"π Attempting background session refresh...\");\n const chromeProcess = await launchChrome(true);\n \n try {\n const tokens = await extractCookiesViaCDP(15000, false);\n console.log(\"β
Background refresh successful.\");\n return tokens;\n } catch (error) {\n throw error;\n } finally {\n // Kill the headless process when done\n chromeProcess.kill();\n }\n}\n\nexport async function runBrowserAuthFlow(): Promise<AuthTokens> {\n console.log(\"π Launching Chrome for Smart Authentication...\");\n console.log(\" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)\");\n \n const chromeProcess = await launchChrome(false);\n\n try {\n console.log(\"\\nWaiting for you to log in to NotebookLM...\");\n console.log(\"If you are already logged in, extraction will happen automatically.\");\n console.log(\"If not, please complete the login process in the browser window.\\n\");\n\n const tokens = await extractCookiesViaCDP(120000, true);\n console.log(\"\\nβ
Smart Authentication successful!\");\n return tokens;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Smart Auth failed: ${error.message}\\nTry manual auth instead.`);\n }\n throw error;\n } finally {\n chromeProcess.kill();\n }\n}\n","import type {\n AuthTokens,\n Notebook,\n SourceSummary,\n SourceDetail,\n ResearchResult,\n ResearchSource,\n StudioArtifact,\n QueryResponse,\n} from \"./types.js\";\nimport {\n RPC_IDS,\n BASE_URL,\n BATCHEXECUTE_PATH,\n QUERY_PATH,\n DEFAULT_BL,\n USER_AGENT,\n DEFAULT_TIMEOUT,\n EXTENDED_TIMEOUT,\n OWNERSHIP_MINE,\n SOURCE_TYPES,\n RESULT_TYPES,\n RESEARCH_SOURCES,\n RESEARCH_MODES,\n STUDIO_TYPES,\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n} from \"./constants.js\";\nimport {\n buildCookieHeader,\n extractCsrfFromPage,\n extractSessionIdFromPage,\n saveTokens,\n} from \"./auth.js\";\nimport { refreshCookiesHeadless, runBrowserAuthFlow } from \"./browser-auth.js\";\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotebookLMClient {\n private tokens: AuthTokens;\n private csrfToken: string;\n private sessionId: string;\n private conversationHistory: Map<string, unknown[]> = new Map();\n private queryTimeout: number;\n private reqId = 0;\n\n constructor(tokens: AuthTokens, queryTimeout?: number) {\n this.tokens = tokens;\n this.csrfToken = tokens.csrf_token;\n this.sessionId = tokens.session_id;\n this.queryTimeout = queryTimeout ?? EXTENDED_TIMEOUT;\n }\n\n // βββ Core HTTP/RPC βββββββββββββββββββββββββββββββββββ\n\n private buildRequestBody(rpcId: string, params: unknown): string {\n const paramsJson = JSON.stringify(params);\n const fReq = JSON.stringify([[[rpcId, paramsJson, null, \"generic\"]]]);\n const parts = [`f.req=${encodeURIComponent(fReq)}`];\n if (this.csrfToken) {\n parts.push(`at=${encodeURIComponent(this.csrfToken)}`);\n }\n return parts.join(\"&\") + \"&\";\n }\n\n private buildUrl(rpcId: string, sourcePath = \"/\"): string {\n const params: Record<string, string> = {\n rpcids: rpcId,\n \"source-path\": sourcePath,\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${BATCHEXECUTE_PATH}?${query}`;\n }\n\n private buildQueryUrl(sourcePath = \"/\"): string {\n this.reqId++;\n const params: Record<string, string> = {\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n _reqid: String(this.reqId),\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${QUERY_PATH}?${query}`;\n }\n\n private parseResponse(responseText: string): unknown[] {\n let text = responseText;\n if (text.startsWith(\")]}'\")) {\n text = text.slice(4);\n }\n\n const lines = text.trim().split(\"\\n\");\n const results: unknown[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i].trim();\n if (!line) {\n i++;\n continue;\n }\n\n const maybeByteCount = parseInt(line, 10);\n if (!isNaN(maybeByteCount) && String(maybeByteCount) === line) {\n i++;\n if (i < lines.length) {\n try {\n results.push(JSON.parse(lines[i]));\n } catch {\n // skip unparseable\n }\n i++;\n }\n } else {\n try {\n results.push(JSON.parse(line));\n } catch {\n // skip\n }\n i++;\n }\n }\n\n return results;\n }\n\n private extractRpcResult(parsed: unknown[], rpcId: string): unknown {\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\" && item[1] === rpcId) {\n // Check for auth error (code 16)\n if (\n item.length > 6 &&\n item[6] === \"generic\" &&\n Array.isArray(item[5]) &&\n item[5].includes(16)\n ) {\n throw new AuthenticationError(\n \"Authentication expired. Run `npx @m4ykeldev/notebooklm-mcp auth` to re-authenticate.\",\n );\n }\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n return JSON.parse(resultStr);\n } catch {\n return resultStr;\n }\n }\n return resultStr;\n }\n }\n }\n return null;\n }\n\n private async execute(\n rpcId: string,\n params: unknown,\n sourcePath = \"/\",\n timeout = DEFAULT_TIMEOUT,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n try {\n return this.extractRpcResult(parsed, rpcId);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n console.log(\"β οΈ Authentication expired. Attempting background refresh...\");\n try {\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"β οΈ Background refresh failed. Opening visible authentication window...\");\n newTokens = await runBrowserAuthFlow();\n }\n\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n\n // Re-extract CSRF/SID from the page using the new cookies\n await this.refreshAuthTokens();\n\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\n } catch (finalError) {\n console.error(\"β Authentication failed:\", (finalError as Error).message);\n throw e; // Propagate original AuthenticationError\n }\n }\n throw e;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async executeOnce(\n rpcId: string,\n params: unknown,\n sourcePath: string,\n timeout: number,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n return this.extractRpcResult(parsed, rpcId);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthTokens(): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n try {\n const response = await fetch(BASE_URL, {\n headers: {\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"User-Agent\": USER_AGENT,\n Accept: \"text/html\",\n },\n signal: controller.signal,\n });\n\n const html = await response.text();\n const csrf = extractCsrfFromPage(html);\n const sid = extractSessionIdFromPage(html);\n\n if (csrf) this.csrfToken = csrf;\n if (sid) this.sessionId = sid;\n\n this.tokens.csrf_token = this.csrfToken;\n this.tokens.session_id = this.sessionId;\n saveTokens(this.tokens);\n } finally {\n clearTimeout(timer);\n }\n }\n\n // βββ Notebook Methods ββββββββββββββββββββββββββββββββ\n\n private parseTimestamp(ts: unknown): string | null {\n if (Array.isArray(ts) && ts.length >= 1 && typeof ts[0] === \"number\") {\n return new Date(ts[0] * 1000).toISOString();\n }\n return null;\n }\n\n private parseNotebook(data: unknown): Notebook {\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid notebook data received from Google. This usually happens if the notebook ID is incorrect, it was deleted, or you don't have permission to access it.\",\n );\n }\n const d = data as any[];\n const sources: SourceSummary[] = [];\n if (Array.isArray(d[1])) {\n for (const s of d[1]) {\n if (Array.isArray(s) && s[0]) {\n sources.push({\n id: Array.isArray(s[0]) ? s[0][0] : String(s[0]),\n title: s[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n const meta = d[5] as any[] | undefined;\n return {\n id: d[2] || \"\",\n title: d[0] || \"Untitled\",\n emoji: d[3] || null,\n sources,\n is_shared: meta?.[1] === true,\n ownership: meta?.[0] === OWNERSHIP_MINE ? \"mine\" : \"shared\",\n created_at: meta ? this.parseTimestamp(meta[8]) : null,\n modified_at: meta ? this.parseTimestamp(meta[5]) : null,\n };\n }\n\n async listNotebooks(maxResults = 100): Promise<Notebook[]> {\n const result = await this.execute(\n RPC_IDS.LIST_NOTEBOOKS,\n [null, 1, null, [2]],\n );\n if (!Array.isArray(result) || !Array.isArray(result[0])) return [];\n\n const notebooks: Notebook[] = [];\n for (const item of result[0]) {\n if (Array.isArray(item)) {\n notebooks.push(this.parseNotebook(item));\n }\n }\n return notebooks.slice(0, maxResults);\n }\n\n async getNotebook(notebookId: string): Promise<Notebook> {\n const result = await this.execute(\n RPC_IDS.GET_NOTEBOOK,\n [notebookId, null, [2], null, 0],\n `/notebook/${notebookId}`,\n );\n return this.parseNotebook(result);\n }\n\n async createNotebook(title: string): Promise<Notebook> {\n const result = await this.execute(RPC_IDS.CREATE_NOTEBOOK, [\n title,\n null,\n null,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ]);\n return this.parseNotebook(result);\n }\n\n async renameNotebook(notebookId: string, newTitle: string): Promise<void> {\n await this.execute(\n RPC_IDS.RENAME_NOTEBOOK,\n [notebookId, [[null, null, null, [null, newTitle]]]],\n `/notebook/${notebookId}`,\n );\n }\n\n async deleteNotebook(notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_NOTEBOOK,\n [notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n async describeNotebook(notebookId: string): Promise<string> {\n const result = await this.execute(\n RPC_IDS.GET_SUMMARY,\n [notebookId, null, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n // βββ Source Methods ββββββββββββββββββββββββββββββββββ\n\n async addUrlSource(\n notebookId: string,\n url: string,\n ): Promise<SourceSummary> {\n const isYouTube =\n url.toLowerCase().includes(\"youtube.com\") ||\n url.toLowerCase().includes(\"youtu.be\");\n\n const sourceData = isYouTube\n ? [null, null, null, null, null, null, null, [url], null, null, 1]\n : [null, null, [url], null, null, null, null, null, null, null, 1];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || url,\n type: isYouTube ? \"youtube\" : \"web_page\",\n };\n }\n\n async addTextSource(\n notebookId: string,\n text: string,\n title: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n null,\n [title, text],\n null,\n 2,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"pasted_text\",\n };\n }\n\n async addDriveSource(\n notebookId: string,\n documentId: string,\n title: string,\n mimeType: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n [documentId, mimeType, 1, title],\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"google_docs\",\n };\n }\n\n async getSource(\n sourceId: string,\n notebookId: string,\n ): Promise<SourceDetail> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n id: sourceId,\n title: data?.[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(data?.[3] ?? null),\n content: data?.[4] || null,\n summary: null,\n keywords: [],\n };\n }\n\n async getSourceGuide(\n sourceId: string,\n notebookId: string,\n ): Promise<{ summary: string; keywords: string[] }> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE_GUIDE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n summary: data?.[0] || \"\",\n keywords: Array.isArray(data?.[1]) ? data[1] : [],\n };\n }\n\n async checkFreshness(\n sourceId: string,\n notebookId: string,\n ): Promise<boolean | null> {\n try {\n const result = await this.execute(\n RPC_IDS.CHECK_FRESHNESS,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] === true;\n } catch {\n return null;\n }\n }\n\n async syncDrive(sourceIds: string[], notebookId: string): Promise<void> {\n for (const sourceId of sourceIds) {\n await this.execute(\n RPC_IDS.SYNC_DRIVE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n }\n\n async deleteSource(sourceId: string, notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_SOURCE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Query Method ββββββββββββββββββββββββββββββββββββ\n\n async query(\n notebookId: string,\n queryText: string,\n sourceIds?: string[],\n conversationId?: string,\n ): Promise<QueryResponse> {\n const sourcesNested = sourceIds\n ? sourceIds.map((sid) => [[sid]])\n : [];\n\n const history = conversationId\n ? this.conversationHistory.get(conversationId) || null\n : null;\n\n const params = [\n sourcesNested,\n queryText,\n history,\n [2, null, [1]],\n conversationId || null,\n ];\n\n const fReq = JSON.stringify([null, JSON.stringify(params)]);\n const body = `f.req=${encodeURIComponent(fReq)}&`;\n\n const url = this.buildQueryUrl(`/notebook/${notebookId}`);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.queryTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n // Check for auth error in the response stream\n for (const chunk of parsed) {\n if (Array.isArray(chunk)) {\n for (const item of chunk) {\n if (Array.isArray(item) && item[0] === \"wrb.fr\" && Array.isArray(item[5]) && item[5].includes(16)) {\n console.log(\"β οΈ Authentication expired during query. Attempting background refresh...\");\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"β οΈ Background refresh failed. Opening visible authentication window...\");\n newTokens = await runBrowserAuthFlow();\n }\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n await this.refreshAuthTokens();\n // Retry once\n return this.query(notebookId, queryText, sourceIds, conversationId);\n }\n }\n }\n }\n\n // Find the longest Type 1 answer chunk\n let bestAnswer = \"\";\n let convId: string | null = conversationId || null;\n\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\") {\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n const data = JSON.parse(resultStr);\n if (Array.isArray(data)) {\n const answer = data[0];\n const type = data[2];\n if (type === 1 && typeof answer === \"string\" && answer.length > bestAnswer.length) {\n bestAnswer = answer;\n }\n if (data[4]) convId = data[4];\n }\n } catch {\n // skip\n }\n }\n }\n }\n }\n\n // Store conversation history for follow-ups\n if (convId) {\n const existing = this.conversationHistory.get(convId) || [];\n existing.push([queryText, null, 1]);\n existing.push([bestAnswer, null, 2]);\n this.conversationHistory.set(convId, existing);\n }\n\n return {\n answer: bestAnswer,\n conversation_id: convId,\n sources_used: sourceIds || [],\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n // βββ Research Methods ββββββββββββββββββββββββββββββββ\n\n async startResearch(\n notebookId: string,\n queryText: string,\n source = \"web\",\n mode = \"fast\",\n ): Promise<{ taskId: string }> {\n const sourceCode = RESEARCH_SOURCES.getCode(source);\n const modeCode = RESEARCH_MODES.getCode(mode);\n\n let result: unknown;\n if (modeCode === 5) {\n // Deep research\n result = await this.execute(\n RPC_IDS.START_DEEP_RESEARCH,\n [null, [1], [queryText, sourceCode], 5, notebookId],\n `/notebook/${notebookId}`,\n );\n } else {\n // Fast research\n result = await this.execute(\n RPC_IDS.START_FAST_RESEARCH,\n [[queryText, sourceCode], null, 1, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n const data = result as any[];\n return { taskId: data?.[0] || \"\" };\n }\n\n async pollResearch(\n notebookId: string,\n taskId?: string,\n ): Promise<ResearchResult[]> {\n const result = await this.execute(\n RPC_IDS.POLL_RESEARCH,\n [null, null, notebookId],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data?.[0])) return [];\n\n const results: ResearchResult[] = [];\n for (const task of data[0]) {\n if (!Array.isArray(task)) continue;\n const tid = task[0];\n if (taskId && tid !== taskId) continue;\n\n const taskInfo = task[1] as any[];\n const statusCode = taskInfo?.[4];\n const statusMap: Record<number, ResearchResult[\"status\"]> = {\n 1: \"in_progress\",\n 2: \"completed\",\n 6: \"imported\",\n };\n\n const sources: ResearchSource[] = [];\n const sourcesArray = taskInfo?.[3]?.[0];\n if (Array.isArray(sourcesArray)) {\n for (const s of sourcesArray) {\n if (Array.isArray(s)) {\n sources.push({\n url: s[0] || null,\n title: s[1] || \"\",\n description: s[2] || null,\n type: RESULT_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n results.push({\n task_id: tid,\n status: statusMap[statusCode] || \"in_progress\",\n query: taskInfo?.[1]?.[0] || \"\",\n sources,\n summary: taskInfo?.[3]?.[1] || null,\n });\n }\n\n return results;\n }\n\n async importResearch(\n notebookId: string,\n taskId: string,\n sourceIndices?: number[],\n ): Promise<void> {\n const indices = sourceIndices || null;\n await this.execute(\n RPC_IDS.IMPORT_RESEARCH,\n [notebookId, taskId, indices],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n\n // βββ Studio Methods ββββββββββββββββββββββββββββββββββ\n\n private formatSourcesNested(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [[sid]]);\n }\n\n private formatSourcesSimple(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [sid]);\n }\n\n async createAudioOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = AUDIO_FORMATS.getCode(options.format || \"deep_dive\");\n const lengthCode = AUDIO_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const audioOptions = [\n null,\n [\n options.focus_prompt || null,\n lengthCode,\n null,\n sourcesSimple,\n options.language || null,\n null,\n formatCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"audio\"),\n sourcesNested,\n null,\n null,\n audioOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createVideoOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n visual_style?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = VIDEO_FORMATS.getCode(options.format || \"explainer\");\n const styleCode = VIDEO_STYLES.getCode(\n options.visual_style || \"auto_select\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const videoOptions = [\n null,\n null,\n [\n sourcesSimple,\n options.language || null,\n options.focus_prompt || null,\n null,\n formatCode,\n styleCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"video\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n videoOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createInfographic(\n notebookId: string,\n sourceIds: string[],\n options: {\n orientation?: string;\n detail_level?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const orientationCode = INFOGRAPHIC_ORIENTATIONS.getCode(\n options.orientation || \"landscape\",\n );\n const detailCode = INFOGRAPHIC_DETAILS.getCode(\n options.detail_level || \"standard\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const infographicOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n null,\n orientationCode,\n detailCode,\n ],\n ];\n\n // positions 4-13 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"infographic\"),\n sourcesNested,\n ];\n for (let i = 0; i < 10; i++) content.push(null);\n content.push(infographicOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createSlideDeck(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = SLIDE_DECK_FORMATS.getCode(\n options.format || \"detailed_deck\",\n );\n const lengthCode = SLIDE_DECK_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const slideDeckOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n formatCode,\n lengthCode,\n ],\n ];\n\n // positions 4-15 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"slide_deck\"),\n sourcesNested,\n ];\n for (let i = 0; i < 12; i++) content.push(null);\n content.push(slideDeckOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createReport(\n notebookId: string,\n sourceIds: string[],\n options: {\n report_format?: string;\n custom_prompt?: string;\n language?: string;\n } = {},\n ): Promise<string> {\n const formatName = options.report_format || \"Briefing Doc\";\n const fmt = REPORT_FORMATS[formatName] || REPORT_FORMATS[\"Briefing Doc\"];\n const prompt =\n formatName === \"Create Your Own\"\n ? options.custom_prompt || \"\"\n : fmt.prompt;\n\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const reportOptions = [\n null,\n [\n fmt.title,\n fmt.description,\n null,\n sourcesSimple,\n options.language || null,\n prompt,\n null,\n true,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"report\"),\n sourcesNested,\n null,\n null,\n null,\n reportOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createFlashcards(\n notebookId: string,\n sourceIds: string[],\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const flashcardOptions = [\n null,\n [1, null, null, null, null, null, [difficultyCode, FLASHCARD_COUNT_DEFAULT]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n flashcardOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createQuiz(\n notebookId: string,\n sourceIds: string[],\n questionCount = 5,\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const quizOptions = [\n null,\n [2, null, null, null, null, null, null, [questionCount, difficultyCode]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"), // shared type with flashcards\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n quizOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createDataTable(\n notebookId: string,\n sourceIds: string[],\n description: string,\n language?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"data_table\"),\n sourcesNested,\n ];\n // Fill nulls up to position where data_table options go\n for (let i = 0; i < 14; i++) content.push(null);\n content.push([[description, language || null]]);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createMindMap(\n notebookId: string,\n sourceIds: string[],\n title?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n // Step 1: Generate mind map\n const genResult = await this.execute(\n RPC_IDS.GENERATE_MIND_MAP,\n [notebookId, sourcesNested, title || null],\n `/notebook/${notebookId}`,\n );\n\n const genData = genResult as any[];\n const mindMapData = genData?.[0];\n\n // Step 2: Save mind map\n const saveResult = await this.execute(\n RPC_IDS.SAVE_MIND_MAP,\n [notebookId, mindMapData, title || null],\n `/notebook/${notebookId}`,\n );\n\n const saveData = saveResult as any[];\n return saveData?.[0] || \"\";\n }\n\n async pollStudio(notebookId: string): Promise<StudioArtifact[]> {\n const result = await this.execute(\n RPC_IDS.POLL_STUDIO,\n [notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data)) return [];\n\n const artifacts: StudioArtifact[] = [];\n const items = Array.isArray(data[0]) ? data[0] : data;\n\n for (const item of items) {\n if (!Array.isArray(item)) continue;\n const statusMap: Record<number, StudioArtifact[\"status\"]> = {\n 1: \"pending\",\n 2: \"generating\",\n 3: \"completed\",\n 4: \"failed\",\n };\n\n artifacts.push({\n id: item[0] || \"\",\n type: STUDIO_TYPES.getName(item[2] ?? null),\n status: statusMap[item[3]] || \"pending\",\n download_url: item[4] || null,\n });\n }\n\n return artifacts;\n }\n\n async deleteStudio(\n notebookId: string,\n artifactId: string,\n ): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_STUDIO,\n [notebookId, artifactId],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Chat Configure βββββββββββββββββββββββββββββββββ\n\n async chatConfigure(\n notebookId: string,\n goal?: string,\n customPrompt?: string,\n responseLength?: string,\n ): Promise<void> {\n const goalCode = goal ? CHAT_GOALS.getCode(goal) : 1;\n const lengthCode = responseLength\n ? CHAT_RESPONSE_LENGTHS.getCode(responseLength)\n : 1;\n\n await this.execute(\n RPC_IDS.PREFERENCES,\n [notebookId, goalCode, customPrompt || null, lengthCode],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Auth Refresh (tool) βββββββββββββββββββββββββββββ\n\n async refreshAuth(): Promise<void> {\n await this.refreshAuthTokens();\n }\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"../client.js\";\n\nexport interface McpTool<T extends z.ZodRawShape = z.ZodRawShape> {\n name: string;\n description: string;\n schema?: T; \n execute: (\n client: NotebookLMClient,\n args: z.infer<z.ZodObject<T>>,\n opts: { queryTimeout?: number }\n ) => Promise<any>;\n}\n\nexport function registerTools(\n server: McpServer, \n tools: McpTool<any>[], \n getClient: (timeout?: number) => NotebookLMClient, \n opts?: { queryTimeout?: number, onClientReset?: () => void }\n) {\n for (const tool of tools) {\n const config: any = { description: tool.description };\n if (tool.schema) {\n config.inputSchema = tool.schema;\n }\n server.registerTool(tool.name, config, async (args: any) => {\n try {\n const result = await tool.execute(getClient(opts?.queryTimeout), args, { queryTimeout: opts?.queryTimeout });\n if (result && result._client_action === \"reset\" && opts?.onClientReset) {\n opts.onClientReset();\n delete result._client_action;\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"success\", ...result }, null, 2) }] };\n } catch (e) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"error\", error: String(e) }, null, 2) }], isError: true };\n }\n });\n }\n}\n\n// Re-usable helper for tools that require confirmation\nexport function pendingConfirmation(message: string) {\n return { status: \"pending_confirmation\", message };\n}\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { saveTokens } from \"../auth.js\";\nimport type { AuthTokens } from \"../types.js\";\n\n// We use a special return flag so server.ts knows to reset the client\nexport const authTools: McpTool<any>[] = [\n {\n name: \"refresh_auth\",\n description: \"Reload authentication tokens (re-extract CSRF and session from page)\",\n execute: async (client) => {\n await client.refreshAuth();\n return { message: \"Authentication tokens refreshed\" };\n },\n },\n {\n name: \"save_auth_tokens\",\n description: \"Manually save authentication cookies (fallback method β prefer using CLI auth)\",\n schema: {\n cookies: z.string().optional().describe(\"Cookie header string (SID=xxx; HSID=yyy; ...)\"),\n csrf_token: z.string().optional().describe(\"CSRF token\"),\n session_id: z.string().optional().describe(\"Session ID\"),\n },\n execute: async (client, { cookies: cookieStr, csrf_token, session_id }) => {\n const cookieMap: Record<string, string> = {};\n if (cookieStr) {\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookieMap[part.substring(0, eq).trim()] = part.substring(eq + 1).trim();\n }\n }\n }\n const tokens: AuthTokens = {\n cookies: cookieMap,\n csrf_token: csrf_token || \"\",\n session_id: session_id || \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n \n // We return this special flag so the registerTools wrapper or server.ts can catch it\n return { \n message: \"Tokens saved. Client will use new tokens on next request.\",\n _client_action: \"reset\" \n };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { CHAT_GOALS, CHAT_RESPONSE_LENGTHS } from \"../constants.js\";\n\nexport const queryTools: McpTool<any>[] = [\n {\n name: \"notebook_query\",\n description: \"Ask a question about the sources in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Question to ask\"),\n source_ids: z.array(z.string()).optional().describe(\"Specific source IDs to query (omit for all)\"),\n conversation_id: z.string().optional().describe(\"Conversation ID for follow-up questions\"),\n },\n execute: async (client, { notebook_id, query, source_ids, conversation_id }) => {\n const response = await client.query(notebook_id, query, source_ids, conversation_id);\n return { answer: response.answer, conversation_id: response.conversation_id };\n },\n },\n {\n name: \"chat_configure\",\n description: \"Configure chat behavior (goal and response length)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n goal: z.string().optional().describe(`Chat goal: ${CHAT_GOALS.optionsStr()}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when goal=custom)\"),\n response_length: z.string().optional().describe(`Response length: ${CHAT_RESPONSE_LENGTHS.optionsStr()}`),\n },\n execute: async (client, { notebook_id, goal, custom_prompt, response_length }) => {\n await client.chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return { message: \"Chat configured\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { RESEARCH_SOURCES, RESEARCH_MODES } from \"../constants.js\";\n\nexport const researchTools: McpTool<any>[] = [\n {\n name: \"research_start\",\n description: \"Start a web or Drive research task\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Research query\"),\n source: z.string().optional().describe(`Source: ${RESEARCH_SOURCES.optionsStr()} (default: web)`),\n mode: z.string().optional().describe(`Mode: ${RESEARCH_MODES.optionsStr()} (default: fast)`),\n },\n execute: async (client, { notebook_id, query, source, mode }) => {\n const result = await client.startResearch(notebook_id, query, source, mode);\n return { task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" };\n },\n },\n {\n name: \"research_status\",\n description: \"Check the status of research tasks\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().optional().describe(\"Specific task ID to check (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id }) => {\n const results = await client.pollResearch(notebook_id, task_id);\n return { results };\n },\n },\n {\n name: \"research_import\",\n description: \"Import discovered sources from a research task into the notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().describe(\"Research task ID\"),\n source_indices: z.array(z.number()).optional().describe(\"Specific source indices to import (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id, source_indices }) => {\n await client.importResearch(notebook_id, task_id, source_indices);\n return { message: \"Research sources imported\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\n\nexport const notebookTools: McpTool<any>[] = [\n {\n name: \"notebook_list\",\n description: \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n schema: {\n max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\"),\n },\n execute: async (client, { max_results }) => {\n const notebooks = await client.listNotebooks(max_results);\n return { notebooks, count: notebooks.length };\n },\n },\n {\n name: \"notebook_create\",\n description: \"Create a new NotebookLM notebook\",\n schema: {\n title: z.string().describe(\"Title for the new notebook\"),\n },\n execute: async (client, { title }) => {\n const notebook = await client.createNotebook(title);\n return { notebook };\n },\n },\n {\n name: \"notebook_get\",\n description: \"Get details of a specific notebook including its sources\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n return { notebook };\n },\n },\n {\n name: \"notebook_describe\",\n description: \"Get an AI-generated summary of the notebook content\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const summary = await client.describeNotebook(notebook_id);\n return { summary };\n },\n },\n {\n name: \"notebook_rename\",\n description: \"Rename a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n execute: async (client, { notebook_id, new_title }) => {\n await client.renameNotebook(notebook_id, new_title);\n return { message: `Notebook renamed to \"${new_title}\"` };\n },\n },\n {\n name: \"notebook_delete\",\n description: \"Delete a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n await client.deleteNotebook(notebook_id);\n return { message: \"Notebook deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport * as fs from \"fs\";\n\nexport const sourceTools: McpTool<any>[] = [\n {\n name: \"source_describe\",\n description: \"Get metadata for a specific source in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(notebook_id, source_id);\n return { source };\n },\n },\n {\n name: \"source_get_content\",\n description: \"Get the underlying text content of a source (used by grounding tool)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The document ID to retrieve\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(source_id, notebook_id);\n return { text: source.content };\n },\n },\n {\n name: \"notebook_add_url\",\n description: \"Add a website URL source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"The URL to add\"),\n },\n execute: async (client, { notebook_id, url }) => {\n await client.addUrlSource(notebook_id, url);\n return { message: \"URL source added\" };\n },\n },\n {\n name: \"notebook_add_text\",\n description: \"Add a text document source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n content: z.string().optional().describe(\"The text content to add\"),\n file_path: z.string().optional().describe(\"Path to local file to read content from\"),\n title: z.string().describe(\"Title for the new source\"),\n },\n execute: async (client, { notebook_id, content, file_path, title }) => {\n let documentContent = content;\n if (!documentContent && file_path) {\n documentContent = fs.readFileSync(file_path, \"utf8\");\n }\n if (!documentContent) {\n throw new Error(\"Must provide either content or file_path\");\n }\n await client.addTextSource(notebook_id, documentContent, title);\n return { message: \"Text source added\" };\n },\n },\n {\n name: \"notebook_add_drive\",\n description: \"Add a Google Drive file source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n file_id: z.string().describe(\"Google Drive file ID\"),\n title: z.string().describe(\"Document title\"),\n doc_type: z.string().describe(\"MIME type (e.g. application/vnd.google-apps.document)\"),\n },\n execute: async (client, { notebook_id, file_id, title, doc_type }) => {\n await client.addDriveSource(notebook_id, file_id, title, doc_type);\n return { message: \"Drive source added\" };\n },\n },\n {\n name: \"source_list_drive\",\n description: \"List sources in a notebook with Drive freshness status\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await client.checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return { sources: results };\n },\n },\n {\n name: \"source_sync_drive\",\n description: \"Sync all Drive sources in a notebook to pull latest changes\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).describe(\"Source IDs to sync\"),\n confirm: z.boolean().describe(\"Must be true to confirm sync\"),\n },\n execute: async (client, { notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n await client.syncDrive(source_ids, notebook_id);\n return { message: `Synced ${source_ids.length} sources` };\n },\n },\n {\n name: \"source_delete\",\n description: \"Delete a source from a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source. This cannot be undone.\");\n await client.deleteSource(notebook_id, source_id);\n return { message: \"Source deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport {\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n} from \"../constants.js\";\n\nexport const studioTools: McpTool<any>[] = [\n {\n name: \"audio_overview_create\",\n description: \"Generate an audio podcast overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${AUDIO_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${AUDIO_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code (e.g. en, es)\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt for the audio\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"video_overview_create\",\n description: \"Generate a video overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${VIDEO_FORMATS.optionsStr()}`),\n visual_style: z.string().optional().describe(`Style: ${VIDEO_STYLES.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"infographic_create\",\n description: \"Generate an infographic (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n orientation: z.string().optional().describe(`Orientation: ${INFOGRAPHIC_ORIENTATIONS.optionsStr()}`),\n detail_level: z.string().optional().describe(`Details: ${INFOGRAPHIC_DETAILS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"slide_deck_create\",\n description: \"Generate a slide deck (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${SLIDE_DECK_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${SLIDE_DECK_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"report_create\",\n description: \"Generate a text report (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n report_format: z.string().optional().describe(`Format: ${Object.keys(REPORT_FORMATS).join(\", \")}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when format='Create Your Own')\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return { artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"flashcards_create\",\n description: \"Generate flashcards (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createFlashcards(notebook_id, ids, difficulty);\n return { artifact_id: artifactId, message: \"Flashcards generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"quiz_create\",\n description: \"Generate a quiz (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n question_count: z.number().optional().describe(\"Number of questions (default 5)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createQuiz(notebook_id, ids, question_count, difficulty);\n return { artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"data_table_create\",\n description: \"Generate a data table (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n description: z.string().describe(\"Description of the table to generate\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createDataTable(notebook_id, ids, description, language);\n return { artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"mind_map_create\",\n description: \"Generate a mind map (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n title: z.string().optional().describe(\"Custom title for the mind map\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createMindMap(notebook_id, ids, title);\n return { artifact_id: artifactId, message: \"Mind map generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"studio_status\",\n description: \"Check the status of generated Studio artifacts\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const artifacts = await client.pollStudio(notebook_id);\n return { artifacts };\n },\n },\n {\n name: \"studio_delete\",\n description: \"Delete a Studio artifact (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n artifact_id: z.string().describe(\"The artifact ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n await client.deleteStudio(notebook_id, artifact_id);\n return { message: \"Artifact deleted\" };\n },\n },\n];\n"],"mappings":"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","names":["execSync","mkdirSync","join","homedir","execSync","join","homedir","mkdirSync","getClient","client","z","z","client","z","z","client","z","z","client","z","z","client","z","z","client"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/browser-auth.ts","../src/client.ts","../src/tools/index.ts","../src/tools/auth.ts","../src/tools/query.ts","../src/tools/research.ts","../src/tools/notebook.ts","../src/tools/source.ts","../src/tools/studio.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runAuthFlow, runFileImport, showTokens } from \"./auth.js\";\nimport { runBrowserAuthFlow } from \"./browser-auth.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"notebooklm-mcp\")\n .description(\"MCP server for Google NotebookLM\")\n .version(\"0.1.22\");\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .option(\"--debug\", \"Enable debug logging\")\n .option(\"--query-timeout <ms>\", \"Query timeout in milliseconds\", \"120000\")\n .action(async (opts) => {\n const queryTimeout = parseInt(opts.queryTimeout, 10);\n const server = createServer(queryTimeout);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n\nprogram\n .command(\"auth\")\n .description(\"Authenticate with NotebookLM (automated Chrome integration)\")\n .option(\"--manual\", \"Use manual cookie copy-paste instead\")\n .option(\"--file <path>\", \"Import cookies from a file instead\")\n .option(\"--show-tokens\", \"Show cached token info (no secrets)\")\n .action(async (opts) => {\n if (opts.showTokens) {\n showTokens();\n return;\n }\n\n if (opts.file) {\n await runFileImport(opts.file);\n return;\n }\n\n if (opts.manual) {\n await runAuthFlow();\n return;\n }\n\n try {\n await runBrowserAuthFlow();\n } catch (error) {\n console.log(`\\nβ οΈ Smart Authentication failed: ${(error as Error).message}`);\n console.log(\"Falling back to manual authentication flow...\\n\");\n await runAuthFlow();\n }\n });\n\n// Default command: serve (for npx compatibility)\nif (process.argv.length <= 2) {\n process.argv.push(\"serve\");\n}\n\nprogram.parse();\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"./client.js\";\nimport { loadTokens, saveTokens } from \"./auth.js\";\nimport type { AuthTokens, ToolResult } from \"./types.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { authTools } from \"./tools/auth.js\";\nimport { queryTools } from \"./tools/query.js\";\nimport { researchTools } from \"./tools/research.js\";\nimport { notebookTools } from \"./tools/notebook.js\";\nimport { sourceTools } from \"./tools/source.js\";\nimport { studioTools } from \"./tools/studio.js\";\nlet client: NotebookLMClient | null = null;\n\nfunction getClient(queryTimeout?: number): NotebookLMClient {\n if (!client) {\n const tokens = loadTokens();\n client = new NotebookLMClient(tokens, queryTimeout);\n }\n return client;\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // βββ Refactored Tool Registration βββββββββββββββββββββ\n \n registerTools(server, [\n ...notebookTools,\n ...sourceTools,\n ...studioTools,\n ...authTools,\n ...queryTools,\n ...researchTools,\n ], getClient, { \n queryTimeout,\n onClientReset: () => { client = null; }\n });\n\n return server;\n}\n","export class CodeMapper {\n private nameToCode: Map<string, number>;\n private codeToName: Map<number, string>;\n private unknownLabel: string;\n private displayNames: string[];\n\n constructor(mapping: Record<string, number>, unknownLabel = \"unknown\") {\n this.nameToCode = new Map(\n Object.entries(mapping).map(([k, v]) => [k.toLowerCase(), v]),\n );\n this.codeToName = new Map(\n Object.entries(mapping).map(([k, v]) => [v, k]),\n );\n this.unknownLabel = unknownLabel;\n this.displayNames = Object.keys(mapping).sort();\n }\n\n getCode(name: string): number {\n const code = this.nameToCode.get(name.toLowerCase());\n if (code === undefined) {\n throw new Error(\n `Invalid value \"${name}\". Valid options: ${this.optionsStr()}`,\n );\n }\n return code;\n }\n\n getName(code: number | null): string {\n if (code === null) return this.unknownLabel;\n return this.codeToName.get(code) ?? this.unknownLabel;\n }\n\n optionsStr(): string {\n return this.displayNames.join(\", \");\n }\n\n names(): string[] {\n return [...this.displayNames];\n }\n}\n\n// RPC IDs\nexport const RPC_IDS = {\n LIST_NOTEBOOKS: \"wXbhsf\",\n GET_NOTEBOOK: \"rLM1Ne\",\n CREATE_NOTEBOOK: \"CCqFvf\",\n RENAME_NOTEBOOK: \"s0tc2d\",\n DELETE_NOTEBOOK: \"WWINqb\",\n ADD_SOURCE: \"izAoDd\",\n GET_SOURCE: \"hizoJc\",\n CHECK_FRESHNESS: \"yR9Yof\",\n SYNC_DRIVE: \"FLmJqe\",\n DELETE_SOURCE: \"tGMBJ\",\n GET_CONVERSATIONS: \"hPTbtc\",\n PREFERENCES: \"hT54vc\",\n SUBSCRIPTION: \"ozz5Z\",\n SETTINGS: \"ZwVcOc\",\n GET_SUMMARY: \"VfAZjd\",\n GET_SOURCE_GUIDE: \"tr032e\",\n START_FAST_RESEARCH: \"Ljjv0c\",\n START_DEEP_RESEARCH: \"QA9ei\",\n POLL_RESEARCH: \"e3bVqc\",\n IMPORT_RESEARCH: \"LBwxtb\",\n CREATE_STUDIO: \"R7cb6c\",\n POLL_STUDIO: \"gArtLc\",\n DELETE_STUDIO: \"V5N4be\",\n GENERATE_MIND_MAP: \"yyryJe\",\n SAVE_MIND_MAP: \"CYK0Xb\",\n LIST_MIND_MAPS: \"cFji9\",\n DELETE_MIND_MAP: \"AH0mwd\",\n} as const;\n\n// Ownership\nexport const OWNERSHIP_MINE = 1;\nexport const OWNERSHIP_SHARED = 2;\n\n// Chat\nexport const CHAT_GOALS = new CodeMapper({\n default: 1,\n custom: 2,\n learning_guide: 3,\n});\n\nexport const CHAT_RESPONSE_LENGTHS = new CodeMapper({\n default: 1,\n longer: 4,\n shorter: 5,\n});\n\n// Research\nexport const RESEARCH_SOURCES = new CodeMapper({ web: 1, drive: 2 });\nexport const RESEARCH_MODES = new CodeMapper({ fast: 1, deep: 5 });\nexport const RESULT_TYPES = new CodeMapper({\n web: 1,\n google_doc: 2,\n google_slides: 3,\n deep_report: 5,\n google_sheets: 8,\n});\n\n// Source Types\nexport const SOURCE_TYPES = new CodeMapper({\n google_docs: 1,\n google_slides_sheets: 2,\n pdf: 3,\n pasted_text: 4,\n web_page: 5,\n generated_text: 8,\n youtube: 9,\n uploaded_file: 11,\n image: 13,\n word_doc: 14,\n});\n\n// Studio Types\nexport const STUDIO_TYPES = new CodeMapper({\n audio: 1,\n report: 2,\n video: 3,\n flashcards: 4,\n infographic: 7,\n slide_deck: 8,\n data_table: 9,\n});\n\n// Audio\nexport const AUDIO_FORMATS = new CodeMapper({\n deep_dive: 1,\n brief: 2,\n critique: 3,\n debate: 4,\n});\n\nexport const AUDIO_LENGTHS = new CodeMapper({\n short: 1,\n default: 2,\n long: 3,\n});\n\n// Video\nexport const VIDEO_FORMATS = new CodeMapper({ explainer: 1, brief: 2 });\n\nexport const VIDEO_STYLES = new CodeMapper({\n auto_select: 1,\n custom: 2,\n classic: 3,\n whiteboard: 4,\n kawaii: 5,\n anime: 6,\n watercolor: 7,\n retro_print: 8,\n heritage: 9,\n paper_craft: 10,\n});\n\n// Infographic\nexport const INFOGRAPHIC_ORIENTATIONS = new CodeMapper({\n landscape: 1,\n portrait: 2,\n square: 3,\n});\n\nexport const INFOGRAPHIC_DETAILS = new CodeMapper({\n concise: 1,\n standard: 2,\n detailed: 3,\n});\n\n// Slide Deck\nexport const SLIDE_DECK_FORMATS = new CodeMapper({\n detailed_deck: 1,\n presenter_slides: 2,\n});\n\nexport const SLIDE_DECK_LENGTHS = new CodeMapper({\n short: 1,\n default: 3,\n});\n\n// Flashcards/Quiz\nexport const FLASHCARD_DIFFICULTIES = new CodeMapper({\n easy: 1,\n medium: 2,\n hard: 3,\n});\n\nexport const FLASHCARD_COUNT_DEFAULT = 2;\n\n// Report Formats\nexport const REPORT_FORMATS: Record<\n string,\n { title: string; description: string; prompt: string }\n> = {\n \"Briefing Doc\": {\n title: \"Briefing Doc\",\n description: \"A comprehensive briefing document\",\n prompt: \"Create a briefing document\",\n },\n \"Study Guide\": {\n title: \"Study Guide\",\n description: \"A study guide for the material\",\n prompt: \"Create a study guide\",\n },\n \"Blog Post\": {\n title: \"Blog Post\",\n description: \"A blog post about the material\",\n prompt: \"Create a blog post\",\n },\n \"Create Your Own\": {\n title: \"Create Your Own\",\n description: \"Custom report format\",\n prompt: \"\",\n },\n};\n\n// Base URL\nexport const BASE_URL = \"https://notebooklm.google.com\";\nexport const BATCHEXECUTE_PATH = \"/_/LabsTailwindUi/data/batchexecute\";\nexport const QUERY_PATH =\n \"/_/LabsTailwindUi/data/google.internal.labs.tailwind.orchestration.v1.LabsTailwindOrchestrationService/GenerateFreeFormStreamed\";\n\nexport const DEFAULT_BL = \"boq_labs-tailwind-frontend_20260108.06_p0\";\n\nexport const REQUIRED_COOKIES = [\n \"SID\",\n \"HSID\",\n \"SSID\",\n \"APISID\",\n \"SAPISID\",\n];\n\nexport const USER_AGENT =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36\";\n\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const EXTENDED_TIMEOUT = 120_000;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AuthTokens } from \"./types.js\";\nimport { REQUIRED_COOKIES, BASE_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".notebooklm-mcp\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nconst CHROME_PROFILE = join(CONFIG_DIR, \"chrome-profile\");\n\nexport function validateCookies(cookies: Record<string, string>): boolean {\n return REQUIRED_COOKIES.every((name) => name in cookies);\n}\n\nexport function buildCookieHeader(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n\nexport function extractCsrfFromPage(html: string): string | null {\n const patterns = [\n /\"SNlM0e\":\"([^\"]+)\"/,\n /at=([^&\"]+)/,\n /\"FdrFJe\":\"([^\"]+)\"/,\n ];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function extractSessionIdFromPage(html: string): string | null {\n const patterns = [/\"FdrFJe\":\"([^\"]+)\"/, /f\\.sid=(\\d+)/];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function saveTokens(tokens: AuthTokens): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(AUTH_FILE, JSON.stringify(tokens, null, 2), \"utf-8\");\n}\n\nexport function loadTokensFromCache(): AuthTokens | null {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = JSON.parse(readFileSync(AUTH_FILE, \"utf-8\"));\n if (data.cookies && validateCookies(data.cookies)) {\n return {\n cookies: data.cookies,\n csrf_token: data.csrf_token || \"\",\n session_id: data.session_id || \"\",\n extracted_at: data.extracted_at || 0,\n };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function loadTokensFromEnv(): AuthTokens | null {\n const cookieStr = process.env.NOTEBOOKLM_COOKIES;\n if (!cookieStr) return null;\n\n const cookies: Record<string, string> = {};\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n\n if (!validateCookies(cookies)) return null;\n\n return {\n cookies,\n csrf_token: process.env.NOTEBOOKLM_CSRF_TOKEN || \"\",\n session_id: process.env.NOTEBOOKLM_SESSION_ID || \"\",\n extracted_at: Date.now() / 1000,\n };\n}\n\nexport function loadTokens(): AuthTokens {\n const fromEnv = loadTokensFromEnv();\n if (fromEnv) return fromEnv;\n\n const fromCache = loadTokensFromCache();\n if (fromCache) return fromCache;\n\n throw new Error(\n \"No authentication tokens found. Run `npx @m4ykeldev/notebooklm-mcp auth` to authenticate, \" +\n \"or set NOTEBOOKLM_COOKIES environment variable.\",\n );\n}\n\nfunction parseCookieString(raw: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n for (const part of trimmed.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n }\n return cookies;\n}\n\nexport async function runFileImport(filePath?: string): Promise<AuthTokens> {\n if (!filePath) {\n console.log(`\nTo authenticate via file:\n1. Open Chrome and navigate to https://notebooklm.google.com\n2. Open DevTools (F12) > Network tab\n3. Type \"batchexecute\" in the filter\n4. Click on any batchexecute request\n5. Find \"cookie:\" in Request Headers\n6. Copy the full cookie VALUE (not the header name)\n7. Save to a file and provide the path\n`);\n throw new Error(\"Provide a cookie file path with --file <path>\");\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const cookies = parseCookieString(raw);\n\n if (!validateCookies(cookies)) {\n throw new Error(\n `Missing required cookies. Need: ${REQUIRED_COOKIES.join(\", \")}`,\n );\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n console.log(\"Authentication tokens saved successfully.\");\n return tokens;\n}\n\nfunction readLineFromStdin(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(prompt, (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction openInBrowser(url: string): void {\n const platform = process.platform;\n try {\n if (platform === \"linux\") {\n execSync(`xdg-open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"darwin\") {\n execSync(`open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"win32\") {\n execSync(`start \"\" \"${url}\"`, { stdio: \"ignore\" });\n }\n } catch {\n console.log(`Could not open browser automatically. Open this URL manually:\\n${url}`);\n }\n}\n\nexport async function runAuthFlow(): Promise<AuthTokens> {\n console.log(\"ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\");\n console.log(\"β NotebookLM MCP β Authentication Setup β\");\n console.log(\"ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\\n\");\n\n console.log(\"Opening NotebookLM in your browser...\\n\");\n openInBrowser(BASE_URL);\n\n console.log(\"Follow these steps:\\n\");\n console.log(\" 1. NotebookLM should open in your browser (you're already logged in)\");\n console.log(\" 2. Press F12 to open DevTools\");\n console.log(\" 3. Go to the Network tab\");\n console.log(\" 4. Type 'batchexecute' in the filter box\");\n console.log(\" 5. Click on any request that appears in the list\");\n console.log(\" 6. In the Headers panel, find 'cookie:' under Request Headers\");\n console.log(\" 7. Right-click the cookie value β Copy value\\n\");\n console.log(\" Tip: If no requests appear, refresh the page (F5) with DevTools open.\\n\");\n\n const cookieStr = await readLineFromStdin(\"Paste the cookie value here: \");\n\n if (!cookieStr) {\n throw new Error(\"No cookie string provided.\");\n }\n\n const cookies = parseCookieString(cookieStr);\n\n if (!validateCookies(cookies)) {\n console.log(\"\\nβ Missing required cookies.\");\n console.log(` Need: ${REQUIRED_COOKIES.join(\", \")}`);\n console.log(` Got: ${Object.keys(cookies).join(\", \")}`);\n throw new Error(\"Invalid cookie string. Make sure you copied the full cookie value.\");\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n\n console.log(`\\nβ
Authentication saved successfully!`);\n console.log(` ${Object.keys(cookies).length} cookies extracted`);\n console.log(` Stored in: ~/.notebooklm-mcp/auth.json`);\n console.log(`\\n CSRF token and session ID will be auto-extracted on first use.`);\n\n return tokens;\n}\n\nexport function showTokens(): void {\n const tokens = loadTokensFromCache();\n if (!tokens) {\n console.log(\"No cached tokens found.\");\n return;\n }\n\n const cookieNames = Object.keys(tokens.cookies);\n const hasRequired = REQUIRED_COOKIES.every((c) => cookieNames.includes(c));\n const age = tokens.extracted_at\n ? Math.round((Date.now() / 1000 - tokens.extracted_at) / 3600)\n : \"unknown\";\n\n console.log(`Cached tokens:`);\n console.log(` Cookies: ${cookieNames.length} (${cookieNames.join(\", \")})`);\n console.log(` Required cookies present: ${hasRequired ? \"yes\" : \"NO\"}`);\n console.log(` CSRF token: ${tokens.csrf_token ? \"present\" : \"missing\"}`);\n console.log(` Session ID: ${tokens.session_id ? \"present\" : \"missing\"}`);\n console.log(` Age: ${age} hours`);\n console.log(` File: ${AUTH_FILE}`);\n}\n","import { execSync, spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { AuthTokens } from \"./types.js\";\nimport { BASE_URL, REQUIRED_COOKIES } from \"./constants.js\";\nimport { validateCookies, saveTokens } from \"./auth.js\";\n\nconst CDP_PORT = 9229;\n\nexport function findChrome(): string | null {\n const candidates: string[] = [];\n\n if (process.platform === \"darwin\") {\n candidates.push(\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n );\n } else if (process.platform === \"linux\") {\n candidates.push(\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n );\n } else if (process.platform === \"win32\") {\n candidates.push(\n \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n `${process.env.LOCALAPPDATA}\\\\Chromium\\\\Application\\\\chrome.exe`,\n );\n }\n\n for (const candidate of candidates) {\n try {\n const cmd =\n process.platform === \"win32\"\n ? `\"${candidate}\" --version`\n : `\"${candidate}\" --version`;\n execSync(cmd, { stdio: \"ignore\" });\n return candidate;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\nasync function getDebuggerUrl(port: number): Promise<string> {\n const maxRetries = 20;\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(`http://localhost:${port}/json/list`);\n if (response.ok) {\n const data = (await response.json()) as any[];\n if (Array.isArray(data)) {\n const notebookTab = data.find(\n (target) =>\n target?.type === \"page\" &&\n typeof target?.url === \"string\" &&\n target.url.startsWith(BASE_URL) &&\n typeof target?.webSocketDebuggerUrl === \"string\",\n );\n if (notebookTab) return notebookTab.webSocketDebuggerUrl;\n\n const firstPage = data.find(\n (target) =>\n target?.type === \"page\" &&\n typeof target?.webSocketDebuggerUrl === \"string\",\n );\n if (firstPage) return firstPage.webSocketDebuggerUrl;\n }\n }\n } catch {\n // wait and retry\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error(\"Could not connect to Chrome remote debugging port.\");\n}\n\nexport async function launchChrome(headless: boolean) {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\n \"Could not find Google Chrome or Chromium. Please use manual auth.\",\n );\n }\n\n const userDataDir = join(homedir(), \".notebooklm-mcp\", \"chrome-profile\");\n mkdirSync(userDataDir, { recursive: true });\n\n const args = [\n `--remote-debugging-port=${CDP_PORT}`,\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n BASE_URL,\n ];\n\n if (headless) {\n args.push(\"--headless=new\");\n }\n\n const chromeProcess = spawn(chromePath, args, {\n detached: true,\n stdio: \"ignore\",\n });\n chromeProcess.unref();\n return chromeProcess;\n}\n\nasync function extractCookiesViaCDP(\n timeoutMs: number,\n showProgress: boolean,\n): Promise<AuthTokens> {\n const wsUrl = await getDebuggerUrl(CDP_PORT);\n const ws = new WebSocket(wsUrl);\n\n return new Promise((resolve, reject) => {\n let messageId = 0;\n let timer: NodeJS.Timeout;\n let globalTimeout: NodeJS.Timeout;\n let lastCdpError: string | null = null;\n\n const cleanup = () => {\n clearInterval(timer);\n clearTimeout(globalTimeout);\n ws.close();\n };\n\n const send = (method: string, params: any = {}) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ id: ++messageId, method, params }));\n }\n };\n\n globalTimeout = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n lastCdpError\n ? `Authentication timed out after ${timeoutMs / 1000}s (CDP error: ${lastCdpError}).`\n : `Authentication timed out after ${timeoutMs / 1000}s.`,\n ),\n );\n }, timeoutMs);\n\n ws.on(\"open\", () => {\n send(\"Network.enable\");\n timer = setInterval(() => {\n send(\"Network.getCookies\", { urls: [BASE_URL, \"https://google.com\"] });\n }, 2000);\n });\n\n ws.on(\"close\", () => {\n cleanup();\n reject(\n new Error(\n \"Browser connection closed before authentication was complete.\",\n ),\n );\n });\n\n ws.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n ws.on(\"message\", (data) => {\n try {\n const response = JSON.parse(data.toString());\n if (response.error) {\n lastCdpError = response.error.message || JSON.stringify(response.error);\n return;\n }\n if (response.result && response.result.cookies) {\n const cookies: Record<string, string> = {};\n for (const c of response.result.cookies) {\n cookies[c.name] = c.value;\n }\n\n if (validateCookies(cookies)) {\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n cleanup();\n resolve(tokens);\n } else if (showProgress) {\n process.stdout.write(\".\");\n }\n }\n } catch (e) {\n // ignore parse errors\n }\n });\n });\n}\n\nexport async function refreshCookiesHeadless(): Promise<AuthTokens> {\n console.log(\"π Attempting background session refresh...\");\n const chromeProcess = await launchChrome(true);\n\n try {\n const tokens = await extractCookiesViaCDP(15000, false);\n console.log(\"β
Background refresh successful.\");\n return tokens;\n } catch (error) {\n throw error;\n } finally {\n // Kill the headless process when done\n chromeProcess.kill();\n }\n}\n\nexport async function runBrowserAuthFlow(): Promise<AuthTokens> {\n console.log(\"β¨ Initializing Smart Authentication... (Setting up a secure session)\");\n console.log(\n \" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)\",\n );\n\n const chromeProcess = await launchChrome(false);\n\n try {\n console.log(\"\\nπ Ready for login! If you're already signed into Google, we'll handle the rest automatically.\\n\");\n\n const tokens = await extractCookiesViaCDP(120000, true);\n console.log(\"\\nβ
Connection secured! Your NotebookLM session is now synchronized.\");\n return tokens;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Smart Auth failed: ${error.message}\\nTry manual auth instead.`,\n );\n }\n throw error;\n } finally {\n chromeProcess.kill();\n }\n}\n","import type {\n AuthTokens,\n Notebook,\n SourceSummary,\n SourceDetail,\n ResearchResult,\n ResearchSource,\n StudioArtifact,\n QueryResponse,\n} from \"./types.js\";\nimport {\n RPC_IDS,\n BASE_URL,\n BATCHEXECUTE_PATH,\n QUERY_PATH,\n DEFAULT_BL,\n USER_AGENT,\n DEFAULT_TIMEOUT,\n EXTENDED_TIMEOUT,\n OWNERSHIP_MINE,\n SOURCE_TYPES,\n RESULT_TYPES,\n RESEARCH_SOURCES,\n RESEARCH_MODES,\n STUDIO_TYPES,\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n} from \"./constants.js\";\nimport {\n buildCookieHeader,\n extractCsrfFromPage,\n extractSessionIdFromPage,\n saveTokens,\n} from \"./auth.js\";\nimport { refreshCookiesHeadless, runBrowserAuthFlow } from \"./browser-auth.js\";\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotebookLMClient {\n private tokens: AuthTokens;\n private csrfToken: string;\n private sessionId: string;\n private conversationHistory: Map<string, unknown[]> = new Map();\n private queryTimeout: number;\n private reqId = 0;\n\n constructor(tokens: AuthTokens, queryTimeout?: number) {\n this.tokens = tokens;\n this.csrfToken = tokens.csrf_token;\n this.sessionId = tokens.session_id;\n this.queryTimeout = queryTimeout ?? EXTENDED_TIMEOUT;\n }\n\n // βββ Core HTTP/RPC βββββββββββββββββββββββββββββββββββ\n\n private buildRequestBody(rpcId: string, params: unknown): string {\n const paramsJson = JSON.stringify(params);\n const fReq = JSON.stringify([[[rpcId, paramsJson, null, \"generic\"]]]);\n const parts = [`f.req=${encodeURIComponent(fReq)}`];\n if (this.csrfToken) {\n parts.push(`at=${encodeURIComponent(this.csrfToken)}`);\n }\n return parts.join(\"&\") + \"&\";\n }\n\n private buildUrl(rpcId: string, sourcePath = \"/\"): string {\n const params: Record<string, string> = {\n rpcids: rpcId,\n \"source-path\": sourcePath,\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${BATCHEXECUTE_PATH}?${query}`;\n }\n\n private buildQueryUrl(sourcePath = \"/\"): string {\n this.reqId++;\n const params: Record<string, string> = {\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n _reqid: String(this.reqId),\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${QUERY_PATH}?${query}`;\n }\n\n private parseResponse(responseText: string): unknown[] {\n let text = responseText;\n if (text.startsWith(\")]}'\")) {\n text = text.slice(4);\n }\n\n const lines = text.trim().split(\"\\n\");\n const results: unknown[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i].trim();\n if (!line) {\n i++;\n continue;\n }\n\n const maybeByteCount = parseInt(line, 10);\n if (!isNaN(maybeByteCount) && String(maybeByteCount) === line) {\n i++;\n if (i < lines.length) {\n try {\n results.push(JSON.parse(lines[i]));\n } catch {\n // skip unparseable\n }\n i++;\n }\n } else {\n try {\n results.push(JSON.parse(line));\n } catch {\n // skip\n }\n i++;\n }\n }\n\n return results;\n }\n\n private extractRpcResult(parsed: unknown[], rpcId: string): unknown {\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\" && item[1] === rpcId) {\n // Check for auth error (code 16)\n if (\n item.length > 6 &&\n item[6] === \"generic\" &&\n Array.isArray(item[5]) &&\n item[5].includes(16)\n ) {\n throw new AuthenticationError(\n \"Authentication expired. Run `npx @m4ykeldev/notebooklm-mcp auth` to re-authenticate.\",\n );\n }\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n return JSON.parse(resultStr);\n } catch {\n return resultStr;\n }\n }\n return resultStr;\n }\n }\n }\n return null;\n }\n\n private async execute(\n rpcId: string,\n params: unknown,\n sourcePath = \"/\",\n timeout = DEFAULT_TIMEOUT,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n try {\n return this.extractRpcResult(parsed, rpcId);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n console.log(\"π Session expired. Effortlessly restoring your connection in the background...\");\n try {\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"β οΈ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n\n // Re-extract CSRF/SID from the page using the new cookies\n await this.refreshAuthTokens();\n\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\n } catch (finalError) {\n console.error(\"β Authentication failed:\", (finalError as Error).message);\n throw e; // Propagate original AuthenticationError\n }\n }\n throw e;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async executeOnce(\n rpcId: string,\n params: unknown,\n sourcePath: string,\n timeout: number,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n return this.extractRpcResult(parsed, rpcId);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthTokens(): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n try {\n const response = await fetch(BASE_URL, {\n headers: {\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"User-Agent\": USER_AGENT,\n Accept: \"text/html\",\n },\n signal: controller.signal,\n });\n\n const html = await response.text();\n const csrf = extractCsrfFromPage(html);\n const sid = extractSessionIdFromPage(html);\n\n if (csrf) this.csrfToken = csrf;\n if (sid) this.sessionId = sid;\n\n this.tokens.csrf_token = this.csrfToken;\n this.tokens.session_id = this.sessionId;\n saveTokens(this.tokens);\n } finally {\n clearTimeout(timer);\n }\n }\n\n // βββ Notebook Methods ββββββββββββββββββββββββββββββββ\n\n private parseTimestamp(ts: unknown): string | null {\n if (Array.isArray(ts) && ts.length >= 1 && typeof ts[0] === \"number\") {\n return new Date(ts[0] * 1000).toISOString();\n }\n return null;\n }\n\n private parseNotebook(data: unknown): Notebook {\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid notebook data received from Google. This usually happens if the notebook ID is incorrect, it was deleted, or you don't have permission to access it.\",\n );\n }\n const d = data as any[];\n const sources: SourceSummary[] = [];\n if (Array.isArray(d[1])) {\n for (const s of d[1]) {\n if (Array.isArray(s) && s[0]) {\n sources.push({\n id: Array.isArray(s[0]) ? s[0][0] : String(s[0]),\n title: s[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n const meta = d[5] as any[] | undefined;\n return {\n id: d[2] || \"\",\n title: d[0] || \"Untitled\",\n emoji: d[3] || null,\n sources,\n is_shared: meta?.[1] === true,\n ownership: meta?.[0] === OWNERSHIP_MINE ? \"mine\" : \"shared\",\n created_at: meta ? this.parseTimestamp(meta[8]) : null,\n modified_at: meta ? this.parseTimestamp(meta[5]) : null,\n };\n }\n\n async listNotebooks(maxResults = 100): Promise<Notebook[]> {\n const result = await this.execute(\n RPC_IDS.LIST_NOTEBOOKS,\n [null, 1, null, [2]],\n );\n if (!Array.isArray(result) || !Array.isArray(result[0])) return [];\n\n const notebooks: Notebook[] = [];\n for (const item of result[0]) {\n if (Array.isArray(item)) {\n notebooks.push(this.parseNotebook(item));\n }\n }\n return notebooks.slice(0, maxResults);\n }\n\n async getNotebook(notebookId: string): Promise<Notebook> {\n const result = await this.execute(\n RPC_IDS.GET_NOTEBOOK,\n [notebookId, null, [2], null, 0],\n `/notebook/${notebookId}`,\n );\n return this.parseNotebook(result);\n }\n\n async createNotebook(title: string): Promise<Notebook> {\n const result = await this.execute(RPC_IDS.CREATE_NOTEBOOK, [\n title,\n null,\n null,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ]);\n return this.parseNotebook(result);\n }\n\n async renameNotebook(notebookId: string, newTitle: string): Promise<void> {\n await this.execute(\n RPC_IDS.RENAME_NOTEBOOK,\n [notebookId, [[null, null, null, [null, newTitle]]]],\n `/notebook/${notebookId}`,\n );\n }\n\n async deleteNotebook(notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_NOTEBOOK,\n [notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n async describeNotebook(notebookId: string): Promise<string> {\n const result = await this.execute(\n RPC_IDS.GET_SUMMARY,\n [notebookId, null, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n // βββ Source Methods ββββββββββββββββββββββββββββββββββ\n\n async addUrlSource(\n notebookId: string,\n url: string,\n ): Promise<SourceSummary> {\n const isYouTube =\n url.toLowerCase().includes(\"youtube.com\") ||\n url.toLowerCase().includes(\"youtu.be\");\n\n const sourceData = isYouTube\n ? [null, null, null, null, null, null, null, [url], null, null, 1]\n : [null, null, [url], null, null, null, null, null, null, null, 1];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || url,\n type: isYouTube ? \"youtube\" : \"web_page\",\n };\n }\n\n async addTextSource(\n notebookId: string,\n text: string,\n title: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n null,\n [title, text],\n null,\n 2,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"pasted_text\",\n };\n }\n\n async addDriveSource(\n notebookId: string,\n documentId: string,\n title: string,\n mimeType: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n [documentId, mimeType, 1, title],\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"google_docs\",\n };\n }\n\n async getSource(\n sourceId: string,\n notebookId: string,\n ): Promise<SourceDetail> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n id: sourceId,\n title: data?.[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(data?.[3] ?? null),\n content: data?.[4] || null,\n summary: null,\n keywords: [],\n };\n }\n\n async getSourceGuide(\n sourceId: string,\n notebookId: string,\n ): Promise<{ summary: string; keywords: string[] }> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE_GUIDE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n summary: data?.[0] || \"\",\n keywords: Array.isArray(data?.[1]) ? data[1] : [],\n };\n }\n\n async checkFreshness(\n sourceId: string,\n notebookId: string,\n ): Promise<boolean | null> {\n try {\n const result = await this.execute(\n RPC_IDS.CHECK_FRESHNESS,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] === true;\n } catch {\n return null;\n }\n }\n\n async syncDrive(sourceIds: string[], notebookId: string): Promise<void> {\n for (const sourceId of sourceIds) {\n await this.execute(\n RPC_IDS.SYNC_DRIVE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n }\n\n async deleteSource(sourceId: string, notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_SOURCE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Query Method ββββββββββββββββββββββββββββββββββββ\n\n async query(\n notebookId: string,\n queryText: string,\n sourceIds?: string[],\n conversationId?: string,\n ): Promise<QueryResponse> {\n const sourcesNested = sourceIds\n ? sourceIds.map((sid) => [[sid]])\n : [];\n\n const history = conversationId\n ? this.conversationHistory.get(conversationId) || null\n : null;\n\n const params = [\n sourcesNested,\n queryText,\n history,\n [2, null, [1]],\n conversationId || null,\n ];\n\n const fReq = JSON.stringify([null, JSON.stringify(params)]);\n const body = `f.req=${encodeURIComponent(fReq)}&`;\n\n const url = this.buildQueryUrl(`/notebook/${notebookId}`);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.queryTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n // Check for auth error in the response stream\n for (const chunk of parsed) {\n if (Array.isArray(chunk)) {\n for (const item of chunk) {\n if (Array.isArray(item) && item[0] === \"wrb.fr\" && Array.isArray(item[5]) && item[5].includes(16)) {\n console.log(\"π Session expired during query. Effortlessly restoring your connection in the background...\");\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"β οΈ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n await this.refreshAuthTokens();\n // Retry once\n return this.query(notebookId, queryText, sourceIds, conversationId);\n }\n }\n }\n }\n\n // Find the longest Type 1 answer chunk\n let bestAnswer = \"\";\n let convId: string | null = conversationId || null;\n\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\") {\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n const data = JSON.parse(resultStr);\n if (Array.isArray(data)) {\n const answer = data[0];\n const type = data[2];\n if (type === 1 && typeof answer === \"string\" && answer.length > bestAnswer.length) {\n bestAnswer = answer;\n }\n if (data[4]) convId = data[4];\n }\n } catch {\n // skip\n }\n }\n }\n }\n }\n\n // Store conversation history for follow-ups\n if (convId) {\n const existing = this.conversationHistory.get(convId) || [];\n existing.push([queryText, null, 1]);\n existing.push([bestAnswer, null, 2]);\n this.conversationHistory.set(convId, existing);\n }\n\n return {\n answer: bestAnswer,\n conversation_id: convId,\n sources_used: sourceIds || [],\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n // βββ Research Methods ββββββββββββββββββββββββββββββββ\n\n async startResearch(\n notebookId: string,\n queryText: string,\n source = \"web\",\n mode = \"fast\",\n ): Promise<{ taskId: string }> {\n const sourceCode = RESEARCH_SOURCES.getCode(source);\n const modeCode = RESEARCH_MODES.getCode(mode);\n\n let result: unknown;\n if (modeCode === 5) {\n // Deep research\n result = await this.execute(\n RPC_IDS.START_DEEP_RESEARCH,\n [null, [1], [queryText, sourceCode], 5, notebookId],\n `/notebook/${notebookId}`,\n );\n } else {\n // Fast research\n result = await this.execute(\n RPC_IDS.START_FAST_RESEARCH,\n [[queryText, sourceCode], null, 1, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n const data = result as any[];\n return { taskId: data?.[0] || \"\" };\n }\n\n async pollResearch(\n notebookId: string,\n taskId?: string,\n ): Promise<ResearchResult[]> {\n const result = await this.execute(\n RPC_IDS.POLL_RESEARCH,\n [null, null, notebookId],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data?.[0])) return [];\n\n const results: ResearchResult[] = [];\n for (const task of data[0]) {\n if (!Array.isArray(task)) continue;\n const tid = task[0];\n if (taskId && tid !== taskId) continue;\n\n const taskInfo = task[1] as any[];\n const statusCode = taskInfo?.[4];\n const statusMap: Record<number, ResearchResult[\"status\"]> = {\n 1: \"in_progress\",\n 2: \"completed\",\n 6: \"imported\",\n };\n\n const sources: ResearchSource[] = [];\n const sourcesArray = taskInfo?.[3]?.[0];\n if (Array.isArray(sourcesArray)) {\n for (const s of sourcesArray) {\n if (Array.isArray(s)) {\n sources.push({\n url: s[0] || null,\n title: s[1] || \"\",\n description: s[2] || null,\n type: RESULT_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n results.push({\n task_id: tid,\n status: statusMap[statusCode] || \"in_progress\",\n query: taskInfo?.[1]?.[0] || \"\",\n sources,\n summary: taskInfo?.[3]?.[1] || null,\n });\n }\n\n return results;\n }\n\n async importResearch(\n notebookId: string,\n taskId: string,\n sourceIndices?: number[],\n ): Promise<void> {\n const indices = sourceIndices || null;\n await this.execute(\n RPC_IDS.IMPORT_RESEARCH,\n [notebookId, taskId, indices],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n\n // βββ Studio Methods ββββββββββββββββββββββββββββββββββ\n\n private formatSourcesNested(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [[sid]]);\n }\n\n private formatSourcesSimple(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [sid]);\n }\n\n async createAudioOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = AUDIO_FORMATS.getCode(options.format || \"deep_dive\");\n const lengthCode = AUDIO_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const audioOptions = [\n null,\n [\n options.focus_prompt || null,\n lengthCode,\n null,\n sourcesSimple,\n options.language || null,\n null,\n formatCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"audio\"),\n sourcesNested,\n null,\n null,\n audioOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createVideoOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n visual_style?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = VIDEO_FORMATS.getCode(options.format || \"explainer\");\n const styleCode = VIDEO_STYLES.getCode(\n options.visual_style || \"auto_select\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const videoOptions = [\n null,\n null,\n [\n sourcesSimple,\n options.language || null,\n options.focus_prompt || null,\n null,\n formatCode,\n styleCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"video\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n videoOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createInfographic(\n notebookId: string,\n sourceIds: string[],\n options: {\n orientation?: string;\n detail_level?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const orientationCode = INFOGRAPHIC_ORIENTATIONS.getCode(\n options.orientation || \"landscape\",\n );\n const detailCode = INFOGRAPHIC_DETAILS.getCode(\n options.detail_level || \"standard\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const infographicOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n null,\n orientationCode,\n detailCode,\n ],\n ];\n\n // positions 4-13 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"infographic\"),\n sourcesNested,\n ];\n for (let i = 0; i < 10; i++) content.push(null);\n content.push(infographicOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createSlideDeck(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = SLIDE_DECK_FORMATS.getCode(\n options.format || \"detailed_deck\",\n );\n const lengthCode = SLIDE_DECK_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const slideDeckOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n formatCode,\n lengthCode,\n ],\n ];\n\n // positions 4-15 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"slide_deck\"),\n sourcesNested,\n ];\n for (let i = 0; i < 12; i++) content.push(null);\n content.push(slideDeckOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createReport(\n notebookId: string,\n sourceIds: string[],\n options: {\n report_format?: string;\n custom_prompt?: string;\n language?: string;\n } = {},\n ): Promise<string> {\n const formatName = options.report_format || \"Briefing Doc\";\n const fmt = REPORT_FORMATS[formatName] || REPORT_FORMATS[\"Briefing Doc\"];\n const prompt =\n formatName === \"Create Your Own\"\n ? options.custom_prompt || \"\"\n : fmt.prompt;\n\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const reportOptions = [\n null,\n [\n fmt.title,\n fmt.description,\n null,\n sourcesSimple,\n options.language || null,\n prompt,\n null,\n true,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"report\"),\n sourcesNested,\n null,\n null,\n null,\n reportOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createFlashcards(\n notebookId: string,\n sourceIds: string[],\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const flashcardOptions = [\n null,\n [1, null, null, null, null, null, [difficultyCode, FLASHCARD_COUNT_DEFAULT]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n flashcardOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createQuiz(\n notebookId: string,\n sourceIds: string[],\n questionCount = 5,\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const quizOptions = [\n null,\n [2, null, null, null, null, null, null, [questionCount, difficultyCode]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"), // shared type with flashcards\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n quizOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createDataTable(\n notebookId: string,\n sourceIds: string[],\n description: string,\n language?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"data_table\"),\n sourcesNested,\n ];\n // Fill nulls up to position where data_table options go\n for (let i = 0; i < 14; i++) content.push(null);\n content.push([[description, language || null]]);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createMindMap(\n notebookId: string,\n sourceIds: string[],\n title?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n // Step 1: Generate mind map\n const genResult = await this.execute(\n RPC_IDS.GENERATE_MIND_MAP,\n [notebookId, sourcesNested, title || null],\n `/notebook/${notebookId}`,\n );\n\n const genData = genResult as any[];\n const mindMapData = genData?.[0];\n\n // Step 2: Save mind map\n const saveResult = await this.execute(\n RPC_IDS.SAVE_MIND_MAP,\n [notebookId, mindMapData, title || null],\n `/notebook/${notebookId}`,\n );\n\n const saveData = saveResult as any[];\n return saveData?.[0] || \"\";\n }\n\n async pollStudio(notebookId: string): Promise<StudioArtifact[]> {\n const result = await this.execute(\n RPC_IDS.POLL_STUDIO,\n [notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data)) return [];\n\n const artifacts: StudioArtifact[] = [];\n const items = Array.isArray(data[0]) ? data[0] : data;\n\n for (const item of items) {\n if (!Array.isArray(item)) continue;\n const statusMap: Record<number, StudioArtifact[\"status\"]> = {\n 1: \"pending\",\n 2: \"generating\",\n 3: \"completed\",\n 4: \"failed\",\n };\n\n artifacts.push({\n id: item[0] || \"\",\n type: STUDIO_TYPES.getName(item[2] ?? null),\n status: statusMap[item[3]] || \"pending\",\n download_url: item[4] || null,\n });\n }\n\n return artifacts;\n }\n\n async deleteStudio(\n notebookId: string,\n artifactId: string,\n ): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_STUDIO,\n [notebookId, artifactId],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Chat Configure βββββββββββββββββββββββββββββββββ\n\n async chatConfigure(\n notebookId: string,\n goal?: string,\n customPrompt?: string,\n responseLength?: string,\n ): Promise<void> {\n const goalCode = goal ? CHAT_GOALS.getCode(goal) : 1;\n const lengthCode = responseLength\n ? CHAT_RESPONSE_LENGTHS.getCode(responseLength)\n : 1;\n\n await this.execute(\n RPC_IDS.PREFERENCES,\n [notebookId, goalCode, customPrompt || null, lengthCode],\n `/notebook/${notebookId}`,\n );\n }\n\n // βββ Auth Refresh (tool) βββββββββββββββββββββββββββββ\n\n async refreshAuth(): Promise<void> {\n await this.refreshAuthTokens();\n }\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"../client.js\";\n\nexport interface McpTool<T extends z.ZodRawShape = z.ZodRawShape> {\n name: string;\n description: string;\n schema?: T; \n execute: (\n client: NotebookLMClient,\n args: z.infer<z.ZodObject<T>>,\n opts: { queryTimeout?: number }\n ) => Promise<any>;\n}\n\nexport function registerTools(\n server: McpServer, \n tools: McpTool<any>[], \n getClient: (timeout?: number) => NotebookLMClient, \n opts?: { queryTimeout?: number, onClientReset?: () => void }\n) {\n for (const tool of tools) {\n const config: any = { description: tool.description };\n if (tool.schema) {\n config.inputSchema = tool.schema;\n }\n server.registerTool(tool.name, config, async (args: any) => {\n try {\n const result = await tool.execute(getClient(opts?.queryTimeout), args, { queryTimeout: opts?.queryTimeout });\n if (result && result._client_action === \"reset\" && opts?.onClientReset) {\n opts.onClientReset();\n delete result._client_action;\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"success\", ...result }, null, 2) }] };\n } catch (e) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"error\", error: String(e) }, null, 2) }], isError: true };\n }\n });\n }\n}\n\n// Re-usable helper for tools that require confirmation\nexport function pendingConfirmation(message: string) {\n return { status: \"pending_confirmation\", message };\n}\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { saveTokens } from \"../auth.js\";\nimport type { AuthTokens } from \"../types.js\";\n\n// We use a special return flag so server.ts knows to reset the client\nexport const authTools: McpTool<any>[] = [\n {\n name: \"refresh_auth\",\n description: \"Reload authentication tokens (re-extract CSRF and session from page)\",\n execute: async (client) => {\n await client.refreshAuth();\n return { message: \"Authentication tokens refreshed\" };\n },\n },\n {\n name: \"save_auth_tokens\",\n description: \"Manually save authentication cookies (fallback method β prefer using CLI auth)\",\n schema: {\n cookies: z.string().optional().describe(\"Cookie header string (SID=xxx; HSID=yyy; ...)\"),\n csrf_token: z.string().optional().describe(\"CSRF token\"),\n session_id: z.string().optional().describe(\"Session ID\"),\n },\n execute: async (client, { cookies: cookieStr, csrf_token, session_id }) => {\n const cookieMap: Record<string, string> = {};\n if (cookieStr) {\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookieMap[part.substring(0, eq).trim()] = part.substring(eq + 1).trim();\n }\n }\n }\n const tokens: AuthTokens = {\n cookies: cookieMap,\n csrf_token: csrf_token || \"\",\n session_id: session_id || \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n \n // We return this special flag so the registerTools wrapper or server.ts can catch it\n return { \n message: \"Tokens saved. Client will use new tokens on next request.\",\n _client_action: \"reset\" \n };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { CHAT_GOALS, CHAT_RESPONSE_LENGTHS } from \"../constants.js\";\n\nexport const queryTools: McpTool<any>[] = [\n {\n name: \"notebook_query\",\n description: \"Ask a question about the sources in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Question to ask\"),\n source_ids: z.array(z.string()).optional().describe(\"Specific source IDs to query (omit for all)\"),\n conversation_id: z.string().optional().describe(\"Conversation ID for follow-up questions\"),\n },\n execute: async (client, { notebook_id, query, source_ids, conversation_id }) => {\n const response = await client.query(notebook_id, query, source_ids, conversation_id);\n return { answer: response.answer, conversation_id: response.conversation_id };\n },\n },\n {\n name: \"chat_configure\",\n description: \"Configure chat behavior (goal and response length)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n goal: z.string().optional().describe(`Chat goal: ${CHAT_GOALS.optionsStr()}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when goal=custom)\"),\n response_length: z.string().optional().describe(`Response length: ${CHAT_RESPONSE_LENGTHS.optionsStr()}`),\n },\n execute: async (client, { notebook_id, goal, custom_prompt, response_length }) => {\n await client.chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return { message: \"Chat configured\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { RESEARCH_SOURCES, RESEARCH_MODES } from \"../constants.js\";\n\nexport const researchTools: McpTool<any>[] = [\n {\n name: \"research_start\",\n description: \"Start a web or Drive research task\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Research query\"),\n source: z.string().optional().describe(`Source: ${RESEARCH_SOURCES.optionsStr()} (default: web)`),\n mode: z.string().optional().describe(`Mode: ${RESEARCH_MODES.optionsStr()} (default: fast)`),\n },\n execute: async (client, { notebook_id, query, source, mode }) => {\n const result = await client.startResearch(notebook_id, query, source, mode);\n return { task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" };\n },\n },\n {\n name: \"research_status\",\n description: \"Check the status of research tasks\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().optional().describe(\"Specific task ID to check (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id }) => {\n const results = await client.pollResearch(notebook_id, task_id);\n return { results };\n },\n },\n {\n name: \"research_import\",\n description: \"Import discovered sources from a research task into the notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().describe(\"Research task ID\"),\n source_indices: z.array(z.number()).optional().describe(\"Specific source indices to import (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id, source_indices }) => {\n await client.importResearch(notebook_id, task_id, source_indices);\n return { message: \"Research sources imported\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\n\nexport const notebookTools: McpTool<any>[] = [\n {\n name: \"notebook_list\",\n description: \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n schema: {\n max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\"),\n },\n execute: async (client, { max_results }) => {\n const notebooks = await client.listNotebooks(max_results);\n return { notebooks, count: notebooks.length };\n },\n },\n {\n name: \"notebook_create\",\n description: \"Create a new NotebookLM notebook\",\n schema: {\n title: z.string().describe(\"Title for the new notebook\"),\n },\n execute: async (client, { title }) => {\n const notebook = await client.createNotebook(title);\n return { notebook };\n },\n },\n {\n name: \"notebook_get\",\n description: \"Get details of a specific notebook including its sources\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n return { notebook };\n },\n },\n {\n name: \"notebook_describe\",\n description: \"Get an AI-generated summary of the notebook content\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const summary = await client.describeNotebook(notebook_id);\n return { summary };\n },\n },\n {\n name: \"notebook_rename\",\n description: \"Rename a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n execute: async (client, { notebook_id, new_title }) => {\n await client.renameNotebook(notebook_id, new_title);\n return { message: `Notebook renamed to \"${new_title}\"` };\n },\n },\n {\n name: \"notebook_delete\",\n description: \"Delete a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n await client.deleteNotebook(notebook_id);\n return { message: \"Notebook deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport * as fs from \"fs\";\n\nexport const sourceTools: McpTool<any>[] = [\n {\n name: \"source_describe\",\n description: \"Get metadata for a specific source in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(notebook_id, source_id);\n return { source };\n },\n },\n {\n name: \"source_get_content\",\n description: \"Get the underlying text content of a source (used by grounding tool)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The document ID to retrieve\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(source_id, notebook_id);\n return { text: source.content };\n },\n },\n {\n name: \"notebook_add_url\",\n description: \"Add a website URL source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"The URL to add\"),\n },\n execute: async (client, { notebook_id, url }) => {\n await client.addUrlSource(notebook_id, url);\n return { message: \"URL source added\" };\n },\n },\n {\n name: \"notebook_add_text\",\n description: \"Add a text document source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n content: z.string().optional().describe(\"The text content to add\"),\n file_path: z.string().optional().describe(\"Path to local file to read content from\"),\n title: z.string().describe(\"Title for the new source\"),\n },\n execute: async (client, { notebook_id, content, file_path, title }) => {\n let documentContent = content;\n if (!documentContent && file_path) {\n documentContent = fs.readFileSync(file_path, \"utf8\");\n }\n if (!documentContent) {\n throw new Error(\"Must provide either content or file_path\");\n }\n await client.addTextSource(notebook_id, documentContent, title);\n return { message: \"Text source added\" };\n },\n },\n {\n name: \"notebook_add_drive\",\n description: \"Add a Google Drive file source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n file_id: z.string().describe(\"Google Drive file ID\"),\n title: z.string().describe(\"Document title\"),\n doc_type: z.string().describe(\"MIME type (e.g. application/vnd.google-apps.document)\"),\n },\n execute: async (client, { notebook_id, file_id, title, doc_type }) => {\n await client.addDriveSource(notebook_id, file_id, title, doc_type);\n return { message: \"Drive source added\" };\n },\n },\n {\n name: \"source_list_drive\",\n description: \"List sources in a notebook with Drive freshness status\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await client.checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return { sources: results };\n },\n },\n {\n name: \"source_sync_drive\",\n description: \"Sync all Drive sources in a notebook to pull latest changes\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).describe(\"Source IDs to sync\"),\n confirm: z.boolean().describe(\"Must be true to confirm sync\"),\n },\n execute: async (client, { notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n await client.syncDrive(source_ids, notebook_id);\n return { message: `Synced ${source_ids.length} sources` };\n },\n },\n {\n name: \"source_delete\",\n description: \"Delete a source from a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source. This cannot be undone.\");\n await client.deleteSource(notebook_id, source_id);\n return { message: \"Source deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport {\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n} from \"../constants.js\";\n\nexport const studioTools: McpTool<any>[] = [\n {\n name: \"audio_overview_create\",\n description: \"Generate an audio podcast overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${AUDIO_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${AUDIO_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code (e.g. en, es)\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt for the audio\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"video_overview_create\",\n description: \"Generate a video overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${VIDEO_FORMATS.optionsStr()}`),\n visual_style: z.string().optional().describe(`Style: ${VIDEO_STYLES.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"infographic_create\",\n description: \"Generate an infographic (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n orientation: z.string().optional().describe(`Orientation: ${INFOGRAPHIC_ORIENTATIONS.optionsStr()}`),\n detail_level: z.string().optional().describe(`Details: ${INFOGRAPHIC_DETAILS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"slide_deck_create\",\n description: \"Generate a slide deck (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${SLIDE_DECK_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${SLIDE_DECK_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"report_create\",\n description: \"Generate a text report (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n report_format: z.string().optional().describe(`Format: ${Object.keys(REPORT_FORMATS).join(\", \")}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when format='Create Your Own')\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return { artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"flashcards_create\",\n description: \"Generate flashcards (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createFlashcards(notebook_id, ids, difficulty);\n return { artifact_id: artifactId, message: \"Flashcards generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"quiz_create\",\n description: \"Generate a quiz (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n question_count: z.number().optional().describe(\"Number of questions (default 5)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createQuiz(notebook_id, ids, question_count, difficulty);\n return { artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"data_table_create\",\n description: \"Generate a data table (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n description: z.string().describe(\"Description of the table to generate\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createDataTable(notebook_id, ids, description, language);\n return { artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"mind_map_create\",\n description: \"Generate a mind map (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n title: z.string().optional().describe(\"Custom title for the mind map\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createMindMap(notebook_id, ids, title);\n return { artifact_id: artifactId, message: \"Mind map generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"studio_status\",\n description: \"Check the status of generated Studio artifacts\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const artifacts = await client.pollStudio(notebook_id);\n return { artifacts };\n },\n },\n {\n name: \"studio_delete\",\n description: \"Delete a Studio artifact (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n artifact_id: z.string().describe(\"The artifact ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n await client.deleteStudio(notebook_id, artifact_id);\n return { message: \"Artifact deleted\" };\n },\n },\n];\n"],"mappings":"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","names":["execSync","mkdirSync","join","homedir","execSync","join","homedir","mkdirSync","getClient","client","z","z","client","z","z","client","z","z","client","z","z","client","z","z","client"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m4ykeldev/notebooklm-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"description": "MCP server for Google NotebookLM β 32 tools for notebooks, sources, research, and studio content generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsup",
|
|
14
14
|
"dev": "tsup --watch",
|
|
15
|
-
"prepublishOnly": "npm run build"
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"auth": "node dist/cli.js auth",
|
|
17
|
+
"serve": "node dist/cli.js serve"
|
|
16
18
|
},
|
|
17
19
|
"engines": {
|
|
18
20
|
"node": ">=18"
|