@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 CHANGED
@@ -1,10 +1,28 @@
1
- # NotebookLM MCP Server
1
+ # 🧠 NotebookLM MCP Server
2
2
 
3
- MCP server for [Google NotebookLM](https://notebooklm.google.com) β€” 32 tools for notebooks, sources, research, and studio content generation.
3
+ ### Unlock the Power of Google NotebookLM Directly in Your AI Workflow
4
4
 
5
- Built with the [Model Context Protocol](https://modelcontextprotocol.io) SDK for TypeScript.
5
+ [![NPM Version](https://img.shields.io/npm/v/@m4ykeldev/notebooklm-mcp)](https://www.npmjs.com/package/@m4ykeldev/notebooklm-mcp)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
7
 
7
- ## Quick Start
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. Authenticate
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
- Tokens are cached at `~/.notebooklm-mcp/auth.json`.
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
- export NOTEBOOKLM_COOKIES="SID=xxx; HSID=xxx; SSID=xxx; APISID=xxx; SAPISID=xxx"
45
+ notebooklm-mcp auth
44
46
  ```
45
47
 
46
- ## Usage Examples
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
- Integrate NotebookLM directly into your AI development workflow.
53
+ *Prefer the old way? Use `notebooklm-mcp auth --manual` for traditional copy-paste extraction.*
49
54
 
50
- ### πŸ€– AI Editors & IDEs
55
+ ---
51
56
 
52
- #### **Claude Desktop / Claude Code**
57
+ ## πŸ€– Integrate with Your Favorite Tools
53
58
 
54
- Add this to your `claude_desktop_config.json` or MCP configuration:
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
- #### **Cursor**
68
-
69
- 1. Go to **Settings** > **Features** > **MCP**.
70
- 2. Click **+ Add New MCP Server**.
71
- 3. **Name**: `NotebookLM`
72
- 4. **Type**: `command`
73
- 5. **Command**: `npx -y @m4ykeldev/notebooklm-mcp serve`
74
-
75
- #### **VS Code (MCP Client)**
76
-
77
- If you use the [MCP Client](https://marketplace.visualstudio.com/items?itemName=mcp-client.mcp-client) extension:
78
-
79
- 1. Open your `settings.json`.
80
- 2. Add the server configuration:
81
-
82
- ```json
83
- "mcp.servers": {
84
- "notebooklm": {
85
- "command": "npx",
86
- "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
87
- }
88
- }
89
- ```
90
-
91
- ### πŸ’» Command Line Interface
92
-
93
- Once authenticated, you can use the CLI for quick operations:
94
-
95
- ```bash
96
- # Start the server with a custom timeout
97
- npx @m4ykeldev/notebooklm-mcp serve --query-timeout 60000
98
-
99
- # Manage authentication
100
- npx @m4ykeldev/notebooklm-mcp auth --show-tokens
101
- ```
102
-
103
- ## Tools (32)
104
-
105
- ### Notebooks
106
-
107
- | Tool | Description |
108
- | ------------------- | ----------------------------------------- |
109
- | `notebook_list` | List all notebooks with metadata |
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
- # Start the MCP server (default command)
177
- notebooklm-mcp serve
118
+ # Set a custom query timeout
178
119
  notebooklm-mcp serve --query-timeout 60000
179
120
 
180
- # Authenticate interactively (automated Chrome integration)
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
- ## How It Works
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
- - Node.js >= 18
202
- - A Google account with access to [NotebookLM](https://notebooklm.google.com)
127
+ ## πŸ›‘ Disclaimer & Security
203
128
 
204
- ## Disclaimer
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
- This project is not affiliated with, endorsed by, or sponsored by Google. It uses NotebookLM's internal web API, which is undocumented and may change without notice. Use at your own risk.
132
+ ## πŸ“„ License
207
133
 
208
- ## License
134
+ Distributed under the [MIT License](LICENSE).
209
135
 
210
- [MIT](LICENSE)
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/version`);
462
+ const response = await fetch(`http://localhost:${port}/json/list`);
463
463
  if (response.ok) {
464
464
  const data = await response.json();
465
- return data.webSocketDebuggerUrl;
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("Could not find Google Chrome or Chromium. Please use manual auth.");
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, { detached: true, stdio: "ignore" });
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(new Error(`Authentication timed out after ${timeoutMs / 1e3}s.`));
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(new Error("Browser connection closed before authentication was complete."));
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("\u{1F680} Launching Chrome for Smart Authentication...");
571
- console.log(" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)");
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("\nWaiting for you to log in to NotebookLM...");
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 Smart Authentication successful!");
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(`Smart Auth failed: ${error.message}
583
- Try manual auth instead.`);
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("\u26A0\uFE0F Authentication expired. Attempting background refresh...");
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 Background refresh failed. Opening visible authentication window...");
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("\u26A0\uFE0F Authentication expired during query. Attempting background refresh...");
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 Background refresh failed. Opening visible authentication window...");
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.21");
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.21",
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"