@m4ykeldev/notebooklm-mcp 0.1.19 → 0.1.20

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
@@ -25,10 +25,18 @@ notebooklm-mcp serve
25
25
  npx @m4ykeldev/notebooklm-mcp auth
26
26
  ```
27
27
 
28
- This opens NotebookLM in your default browser (where you're already logged into Google), then guides you to copy your session cookies from DevTools and paste them in the terminal.
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.
29
29
 
30
30
  Tokens are cached at `~/.notebooklm-mcp/auth.json`.
31
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
+
32
40
  **Alternative: environment variables**
33
41
 
34
42
  ```bash
@@ -169,9 +177,12 @@ npx @m4ykeldev/notebooklm-mcp auth --show-tokens
169
177
  notebooklm-mcp serve
170
178
  notebooklm-mcp serve --query-timeout 60000
171
179
 
172
- # Authenticate interactively
180
+ # Authenticate interactively (automated Chrome integration)
173
181
  notebooklm-mcp auth
174
182
 
183
+ # Authenticate manually (copy-paste cookies)
184
+ notebooklm-mcp auth --manual
185
+
175
186
  # Import cookies from a file
176
187
  notebooklm-mcp auth --file cookies.txt
177
188
 
package/dist/cli.js CHANGED
@@ -1874,16 +1874,146 @@ function createServer(queryTimeout) {
1874
1874
  return server;
1875
1875
  }
1876
1876
 
1877
+ // src/browser-auth.ts
1878
+ import { execSync as execSync2, spawn } from "child_process";
1879
+ import { mkdirSync as mkdirSync2 } from "fs";
1880
+ import { join as join2 } from "path";
1881
+ import { homedir as homedir2 } from "os";
1882
+ import WebSocket from "ws";
1883
+ var CDP_PORT = 9229;
1884
+ function findChrome() {
1885
+ const candidates = [];
1886
+ if (process.platform === "darwin") {
1887
+ candidates.push(
1888
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
1889
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
1890
+ "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"
1891
+ );
1892
+ } else if (process.platform === "linux") {
1893
+ candidates.push(
1894
+ "google-chrome",
1895
+ "google-chrome-stable",
1896
+ "chromium",
1897
+ "chromium-browser",
1898
+ "/usr/bin/google-chrome",
1899
+ "/usr/bin/chromium",
1900
+ "/usr/bin/chromium-browser"
1901
+ );
1902
+ } else if (process.platform === "win32") {
1903
+ candidates.push(
1904
+ "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
1905
+ "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
1906
+ `${process.env.LOCALAPPDATA}\\Google\\Chrome\\Application\\chrome.exe`,
1907
+ `${process.env.LOCALAPPDATA}\\Chromium\\Application\\chrome.exe`
1908
+ );
1909
+ }
1910
+ for (const candidate of candidates) {
1911
+ try {
1912
+ const cmd = process.platform === "win32" ? `"${candidate}" --version` : `"${candidate}" --version`;
1913
+ execSync2(cmd, { stdio: "ignore" });
1914
+ return candidate;
1915
+ } catch {
1916
+ }
1917
+ }
1918
+ return null;
1919
+ }
1920
+ async function getDebuggerUrl(port) {
1921
+ const maxRetries = 20;
1922
+ for (let i = 0; i < maxRetries; i++) {
1923
+ try {
1924
+ const response = await fetch(`http://localhost:${port}/json/version`);
1925
+ if (response.ok) {
1926
+ const data = await response.json();
1927
+ return data.webSocketDebuggerUrl;
1928
+ }
1929
+ } catch {
1930
+ }
1931
+ await new Promise((r) => setTimeout(r, 500));
1932
+ }
1933
+ throw new Error("Could not connect to Chrome remote debugging port.");
1934
+ }
1935
+ async function runBrowserAuthFlow() {
1936
+ const chromePath = findChrome();
1937
+ if (!chromePath) {
1938
+ throw new Error("Could not find Google Chrome or Chromium. Please use manual auth.");
1939
+ }
1940
+ const userDataDir = join2(homedir2(), ".notebooklm-mcp", "chrome-profile");
1941
+ mkdirSync2(userDataDir, { recursive: true });
1942
+ console.log("\u{1F680} Launching Chrome for Smart Authentication...");
1943
+ console.log(" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)");
1944
+ const chromeProcess = spawn(chromePath, [
1945
+ `--remote-debugging-port=${CDP_PORT}`,
1946
+ `--user-data-dir=${userDataDir}`,
1947
+ "--no-first-run",
1948
+ "--no-default-browser-check",
1949
+ BASE_URL
1950
+ ], { detached: true, stdio: "ignore" });
1951
+ chromeProcess.unref();
1952
+ try {
1953
+ const wsUrl = await getDebuggerUrl(CDP_PORT);
1954
+ const ws = new WebSocket(wsUrl);
1955
+ return new Promise((resolve, reject) => {
1956
+ let messageId = 0;
1957
+ const send = (method, params = {}) => {
1958
+ ws.send(JSON.stringify({ id: ++messageId, method, params }));
1959
+ };
1960
+ ws.on("open", () => {
1961
+ send("Network.enable");
1962
+ const timer = setInterval(() => {
1963
+ send("Network.getCookies", { urls: [BASE_URL, "https://google.com"] });
1964
+ }, 2e3);
1965
+ ws.on("close", () => {
1966
+ clearInterval(timer);
1967
+ reject(new Error("Browser connection closed before authentication was complete."));
1968
+ });
1969
+ });
1970
+ ws.on("message", (data) => {
1971
+ const response = JSON.parse(data.toString());
1972
+ if (response.result && response.result.cookies) {
1973
+ const cookies = {};
1974
+ for (const c of response.result.cookies) {
1975
+ cookies[c.name] = c.value;
1976
+ }
1977
+ if (validateCookies(cookies)) {
1978
+ const tokens = {
1979
+ cookies,
1980
+ csrf_token: "",
1981
+ session_id: "",
1982
+ extracted_at: Date.now() / 1e3
1983
+ };
1984
+ saveTokens(tokens);
1985
+ console.log("\n\u2705 Smart Authentication successful!");
1986
+ console.log(" Cookies extracted automatically.");
1987
+ ws.close();
1988
+ resolve(tokens);
1989
+ } else {
1990
+ process.stdout.write(".");
1991
+ }
1992
+ }
1993
+ });
1994
+ console.log("\nWaiting for you to log in to NotebookLM...");
1995
+ console.log("If you are already logged in, extraction will happen automatically.");
1996
+ console.log("If not, please complete the login process in the browser window.\n");
1997
+ });
1998
+ } catch (error) {
1999
+ if (error instanceof Error) {
2000
+ throw new Error(`Smart Auth failed: ${error.message}
2001
+ Try manual auth instead.`);
2002
+ }
2003
+ throw error;
2004
+ }
2005
+ }
2006
+
1877
2007
  // src/cli.ts
1878
2008
  var program = new Command();
1879
- program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.17");
2009
+ program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.20");
1880
2010
  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) => {
1881
2011
  const queryTimeout = parseInt(opts.queryTimeout, 10);
1882
2012
  const server = createServer(queryTimeout);
1883
2013
  const transport = new StdioServerTransport();
1884
2014
  await server.connect(transport);
1885
2015
  });
1886
- program.command("auth").description("Authenticate with NotebookLM (opens browser, you paste cookies)").option("--file <path>", "Import cookies from a file instead").option("--show-tokens", "Show cached token info (no secrets)").action(async (opts) => {
2016
+ program.command("auth").description("Authenticate with NotebookLM (automated Chrome integration)").option("--manual", "Use manual cookie copy-paste instead").option("--file <path>", "Import cookies from a file instead").option("--show-tokens", "Show cached token info (no secrets)").action(async (opts) => {
1887
2017
  if (opts.showTokens) {
1888
2018
  showTokens();
1889
2019
  return;
@@ -1892,7 +2022,18 @@ program.command("auth").description("Authenticate with NotebookLM (opens browser
1892
2022
  await runFileImport(opts.file);
1893
2023
  return;
1894
2024
  }
1895
- await runAuthFlow();
2025
+ if (opts.manual) {
2026
+ await runAuthFlow();
2027
+ return;
2028
+ }
2029
+ try {
2030
+ await runBrowserAuthFlow();
2031
+ } catch (error) {
2032
+ console.log(`
2033
+ \u26A0\uFE0F Smart Authentication failed: ${error.message}`);
2034
+ console.log("Falling back to manual authentication flow...\n");
2035
+ await runAuthFlow();
2036
+ }
1896
2037
  });
1897
2038
  if (process.argv.length <= 2) {
1898
2039
  process.argv.push("serve");
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/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\";\n\nconst program = new Command();\n\nprogram\n .name(\"notebooklm-mcp\")\n .description(\"MCP server for Google NotebookLM\")\n .version(\"0.1.17\");\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 (opens browser, you paste cookies)\")\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 await runAuthFlow();\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 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\";\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 // Try to refresh auth tokens\n await this.refreshAuthTokens();\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\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 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 // 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":["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/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","../src/browser-auth.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.20\");\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 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\";\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 // Try to refresh auth tokens\n await this.refreshAuthTokens();\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\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 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 // 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","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 runBrowserAuthFlow(): Promise<AuthTokens> {\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 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 = spawn(chromePath, [\n `--remote-debugging-port=${CDP_PORT}`,\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n BASE_URL,\n ], { detached: true, stdio: \"ignore\" });\n\n chromeProcess.unref();\n\n try {\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 const send = (method: string, params: any = {}) => {\n ws.send(JSON.stringify({ id: ++messageId, method, params }));\n };\n\n ws.on(\"open\", () => {\n send(\"Network.enable\");\n // Poll every 2 seconds\n const timer = setInterval(() => {\n send(\"Network.getCookies\", { urls: [BASE_URL, \"https://google.com\"] });\n }, 2000);\n\n ws.on(\"close\", () => {\n clearInterval(timer);\n reject(new Error(\"Browser connection closed before authentication was complete.\"));\n });\n });\n\n ws.on(\"message\", (data) => {\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 console.log(\"\\nāœ… Smart Authentication successful!\");\n console.log(\" Cookies extracted automatically.\");\n ws.close();\n resolve(tokens);\n } else {\n process.stdout.write(\".\"); // Progress indicator\n }\n }\n });\n\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 } 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 }\n}\n"],"mappings":"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","names":["getClient","client","z","z","client","z","z","client","z","z","client","z","z","client","z","z","client","execSync","mkdirSync","join","homedir","execSync","join","homedir","mkdirSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m4ykeldev/notebooklm-mcp",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
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": {