@m4ykeldev/notebooklm-mcp 0.1.1 → 0.1.17
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/LICENSE +1 -1
- package/README.md +37 -3
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +24 -8
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -35,10 +35,14 @@ Tokens are cached at `~/.notebooklm-mcp/auth.json`.
|
|
|
35
35
|
export NOTEBOOKLM_COOKIES="SID=xxx; HSID=xxx; SSID=xxx; APISID=xxx; SAPISID=xxx"
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
## Usage Examples
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Integrate NotebookLM directly into your AI development workflow.
|
|
41
41
|
|
|
42
|
+
### 🤖 AI Editors & IDEs
|
|
43
|
+
|
|
44
|
+
#### **Claude Desktop / Claude Code**
|
|
45
|
+
Add this to your `claude_desktop_config.json` or MCP configuration:
|
|
42
46
|
```json
|
|
43
47
|
{
|
|
44
48
|
"mcpServers": {
|
|
@@ -50,7 +54,37 @@ export NOTEBOOKLM_COOKIES="SID=xxx; HSID=xxx; SSID=xxx; APISID=xxx; SAPISID=xxx"
|
|
|
50
54
|
}
|
|
51
55
|
```
|
|
52
56
|
|
|
53
|
-
**Cursor
|
|
57
|
+
#### **Cursor**
|
|
58
|
+
1. Go to **Settings** > **Features** > **MCP**.
|
|
59
|
+
2. Click **+ Add New MCP Server**.
|
|
60
|
+
3. **Name**: `NotebookLM`
|
|
61
|
+
4. **Type**: `command`
|
|
62
|
+
5. **Command**: `npx -y @m4ykeldev/notebooklm-mcp serve`
|
|
63
|
+
|
|
64
|
+
#### **VS Code (MCP Client)**
|
|
65
|
+
If you use the [MCP Client](https://marketplace.visualstudio.com/items?itemName=mcp-client.mcp-client) extension:
|
|
66
|
+
1. Open your `settings.json`.
|
|
67
|
+
2. Add the server configuration:
|
|
68
|
+
```json
|
|
69
|
+
"mcp.servers": {
|
|
70
|
+
"notebooklm": {
|
|
71
|
+
"command": "npx",
|
|
72
|
+
"args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 💻 Command Line Interface
|
|
78
|
+
|
|
79
|
+
Once authenticated, you can use the CLI for quick operations:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Start the server with a custom timeout
|
|
83
|
+
npx @m4ykeldev/notebooklm-mcp serve --query-timeout 60000
|
|
84
|
+
|
|
85
|
+
# Manage authentication
|
|
86
|
+
npx @m4ykeldev/notebooklm-mcp auth --show-tokens
|
|
87
|
+
```
|
|
54
88
|
|
|
55
89
|
## Tools (32)
|
|
56
90
|
|
package/dist/cli.js
CHANGED
|
@@ -1941,7 +1941,7 @@ function createServer(queryTimeout) {
|
|
|
1941
1941
|
|
|
1942
1942
|
// src/cli.ts
|
|
1943
1943
|
var program = new Command();
|
|
1944
|
-
program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.
|
|
1944
|
+
program.name("notebooklm-mcp").description("MCP server for Google NotebookLM").version("0.1.17");
|
|
1945
1945
|
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) => {
|
|
1946
1946
|
const queryTimeout = parseInt(opts.queryTimeout, 10);
|
|
1947
1947
|
const server = createServer(queryTimeout);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/client.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.1\");\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 {\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 RESEARCH_SOURCES,\n RESEARCH_MODES,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n REPORT_FORMATS,\n} from \"./constants.js\";\n\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\nfunction ok(data: Record<string, unknown>): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ status: \"success\", ...data }, null, 2) }],\n };\n}\n\nfunction err(error: unknown): { content: { type: \"text\"; text: string }[]; isError: true } {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ status: \"error\", error: String(error) }, null, 2),\n },\n ],\n isError: true,\n };\n}\n\nfunction pendingConfirmation(message: string): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ status: \"pending_confirmation\", message }, null, 2),\n },\n ],\n };\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // ─── Notebook Tools (6) ──────────────────────────────\n\n server.tool(\n \"notebook_list\",\n \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n { max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\") },\n async ({ max_results }) => {\n try {\n const notebooks = await getClient(queryTimeout).listNotebooks(max_results);\n return ok({ notebooks, count: notebooks.length });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_create\",\n \"Create a new NotebookLM notebook\",\n { title: z.string().describe(\"Title for the new notebook\") },\n async ({ title }) => {\n try {\n const notebook = await getClient(queryTimeout).createNotebook(title);\n return ok({ notebook });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_get\",\n \"Get details of a specific notebook including its sources\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const notebook = await getClient(queryTimeout).getNotebook(notebook_id);\n return ok({ notebook });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_describe\",\n \"Get an AI-generated summary of the notebook content\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const summary = await getClient(queryTimeout).describeNotebook(notebook_id);\n return ok({ summary });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_rename\",\n \"Rename a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n async ({ notebook_id, new_title }) => {\n try {\n await getClient(queryTimeout).renameNotebook(notebook_id, new_title);\n return ok({ message: `Notebook renamed to \"${new_title}\"` });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_delete\",\n \"Delete a notebook (requires confirm=true)\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n async ({ notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n try {\n await getClient(queryTimeout).deleteNotebook(notebook_id);\n return ok({ message: \"Notebook deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Source Tools (8) ────────────────────────────────\n\n server.tool(\n \"source_describe\",\n \"Get an AI-generated summary and keywords for a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n async ({ notebook_id, source_id }) => {\n try {\n const guide = await getClient(queryTimeout).getSourceGuide(source_id, notebook_id);\n return ok({ summary: guide.summary, keywords: guide.keywords });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_get_content\",\n \"Get the raw text content of a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n async ({ notebook_id, source_id }) => {\n try {\n const source = await getClient(queryTimeout).getSource(source_id, notebook_id);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_url\",\n \"Add a URL or YouTube video as a source to a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"URL to add (website or YouTube)\"),\n },\n async ({ notebook_id, url }) => {\n try {\n const source = await getClient(queryTimeout).addUrlSource(notebook_id, url);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_text\",\n \"Add pasted text as a source to a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n text: z.string().describe(\"Text content to add\"),\n title: z.string().describe(\"Title for the text source\"),\n },\n async ({ notebook_id, text, title }) => {\n try {\n const source = await getClient(queryTimeout).addTextSource(notebook_id, text, title);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_drive\",\n \"Add a Google Drive document as a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n document_id: z.string().describe(\"Google Drive document 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 async ({ notebook_id, document_id, title, doc_type }) => {\n try {\n const source = await getClient(queryTimeout).addDriveSource(notebook_id, document_id, title, doc_type);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_list_drive\",\n \"List sources in a notebook with Drive freshness status\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const notebook = await getClient(queryTimeout).getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await getClient(queryTimeout).checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return ok({ sources: results });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_sync_drive\",\n \"Sync stale Google Drive sources (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n try {\n await getClient(queryTimeout).syncDrive(source_ids, notebook_id);\n return ok({ message: `Synced ${source_ids.length} sources` });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_delete\",\n \"Delete a source from a notebook (requires confirm=true)\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n async ({ notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source.\");\n try {\n await getClient(queryTimeout).deleteSource(source_id, notebook_id);\n return ok({ message: \"Source deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Query Tools (2) ────────────────────────────────\n\n server.tool(\n \"notebook_query\",\n \"Ask a question about the sources in a notebook\",\n {\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 async ({ notebook_id, query, source_ids, conversation_id }) => {\n try {\n const response = await getClient(queryTimeout).query(notebook_id, query, source_ids, conversation_id);\n return ok({ answer: response.answer, conversation_id: response.conversation_id });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"chat_configure\",\n \"Configure chat behavior (goal and response length)\",\n {\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 async ({ notebook_id, goal, custom_prompt, response_length }) => {\n try {\n await getClient(queryTimeout).chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return ok({ message: \"Chat configured\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Research Tools (3) ──────────────────────────────\n\n server.tool(\n \"research_start\",\n \"Start a web or Drive research task\",\n {\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 async ({ notebook_id, query, source, mode }) => {\n try {\n const result = await getClient(queryTimeout).startResearch(notebook_id, query, source, mode);\n return ok({ task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"research_status\",\n \"Check the status of research tasks\",\n {\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 async ({ notebook_id, task_id }) => {\n try {\n const results = await getClient(queryTimeout).pollResearch(notebook_id, task_id);\n return ok({ results });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"research_import\",\n \"Import discovered sources from a research task into the notebook\",\n {\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 async ({ notebook_id, task_id, source_indices }) => {\n try {\n await getClient(queryTimeout).importResearch(notebook_id, task_id, source_indices);\n return ok({ message: \"Research sources imported\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Studio Creation Tools (10) ─────────────────────\n\n server.tool(\n \"audio_overview_create\",\n \"Generate an audio podcast overview (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"video_overview_create\",\n \"Generate a video overview (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"infographic_create\",\n \"Generate an infographic (requires confirm=true)\",\n {\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(`Detail: ${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 async ({ notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"slide_deck_create\",\n \"Generate a slide deck presentation (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"report_create\",\n \"Generate a report (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return ok({ artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"flashcards_create\",\n \"Generate flashcards for study (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createFlashcards(notebook_id, ids, difficulty);\n return ok({ artifact_id: artifactId, message: \"Flashcard generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"quiz_create\",\n \"Generate a quiz (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createQuiz(notebook_id, ids, question_count, difficulty);\n return ok({ artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"data_table_create\",\n \"Generate a data table (requires confirm=true)\",\n {\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 async ({ notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createDataTable(notebook_id, ids, description, language);\n return ok({ artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"mind_map_create\",\n \"Generate and save a mind map (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createMindMap(notebook_id, ids, title);\n return ok({ artifact_id: artifactId, message: \"Mind map generated and saved.\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Studio Management (2) ──────────────────────────\n\n server.tool(\n \"studio_status\",\n \"Check the status of studio artifact generation and get download URLs\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const artifacts = await getClient(queryTimeout).pollStudio(notebook_id);\n return ok({ artifacts });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"studio_delete\",\n \"Delete a studio artifact (requires confirm=true)\",\n {\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 async ({ notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n try {\n await getClient(queryTimeout).deleteStudio(notebook_id, artifact_id);\n return ok({ message: \"Artifact deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Auth Tools (2) ─────────────────────────────────\n\n server.tool(\n \"refresh_auth\",\n \"Reload authentication tokens (re-extract CSRF and session from page)\",\n {},\n async () => {\n try {\n await getClient(queryTimeout).refreshAuth();\n return ok({ message: \"Authentication tokens refreshed\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"save_auth_tokens\",\n \"Manually save authentication cookies (fallback method — prefer using CLI auth)\",\n {\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 async ({ cookies: cookieStr, csrf_token, session_id }) => {\n try {\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.slice(0, eq).trim()] = part.slice(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 // Reset client to use new tokens\n client = null;\n return ok({ message: \"Tokens saved. Client will use new tokens on next request.\" });\n } catch (e) { return err(e); }\n },\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 `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 `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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/client.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 {\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 RESEARCH_SOURCES,\n RESEARCH_MODES,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n REPORT_FORMATS,\n} from \"./constants.js\";\n\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\nfunction ok(data: Record<string, unknown>): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ status: \"success\", ...data }, null, 2) }],\n };\n}\n\nfunction err(error: unknown): { content: { type: \"text\"; text: string }[]; isError: true } {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ status: \"error\", error: String(error) }, null, 2),\n },\n ],\n isError: true,\n };\n}\n\nfunction pendingConfirmation(message: string): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ status: \"pending_confirmation\", message }, null, 2),\n },\n ],\n };\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // ─── Notebook Tools (6) ──────────────────────────────\n\n server.tool(\n \"notebook_list\",\n \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n { max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\") },\n async ({ max_results }) => {\n try {\n const notebooks = await getClient(queryTimeout).listNotebooks(max_results);\n return ok({ notebooks, count: notebooks.length });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_create\",\n \"Create a new NotebookLM notebook\",\n { title: z.string().describe(\"Title for the new notebook\") },\n async ({ title }) => {\n try {\n const notebook = await getClient(queryTimeout).createNotebook(title);\n return ok({ notebook });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_get\",\n \"Get details of a specific notebook including its sources\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const notebook = await getClient(queryTimeout).getNotebook(notebook_id);\n return ok({ notebook });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_describe\",\n \"Get an AI-generated summary of the notebook content\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const summary = await getClient(queryTimeout).describeNotebook(notebook_id);\n return ok({ summary });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_rename\",\n \"Rename a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n async ({ notebook_id, new_title }) => {\n try {\n await getClient(queryTimeout).renameNotebook(notebook_id, new_title);\n return ok({ message: `Notebook renamed to \"${new_title}\"` });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_delete\",\n \"Delete a notebook (requires confirm=true)\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n async ({ notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n try {\n await getClient(queryTimeout).deleteNotebook(notebook_id);\n return ok({ message: \"Notebook deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Source Tools (8) ────────────────────────────────\n\n server.tool(\n \"source_describe\",\n \"Get an AI-generated summary and keywords for a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n async ({ notebook_id, source_id }) => {\n try {\n const guide = await getClient(queryTimeout).getSourceGuide(source_id, notebook_id);\n return ok({ summary: guide.summary, keywords: guide.keywords });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_get_content\",\n \"Get the raw text content of a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n async ({ notebook_id, source_id }) => {\n try {\n const source = await getClient(queryTimeout).getSource(source_id, notebook_id);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_url\",\n \"Add a URL or YouTube video as a source to a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"URL to add (website or YouTube)\"),\n },\n async ({ notebook_id, url }) => {\n try {\n const source = await getClient(queryTimeout).addUrlSource(notebook_id, url);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_text\",\n \"Add pasted text as a source to a notebook\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n text: z.string().describe(\"Text content to add\"),\n title: z.string().describe(\"Title for the text source\"),\n },\n async ({ notebook_id, text, title }) => {\n try {\n const source = await getClient(queryTimeout).addTextSource(notebook_id, text, title);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"notebook_add_drive\",\n \"Add a Google Drive document as a source\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n document_id: z.string().describe(\"Google Drive document 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 async ({ notebook_id, document_id, title, doc_type }) => {\n try {\n const source = await getClient(queryTimeout).addDriveSource(notebook_id, document_id, title, doc_type);\n return ok({ source });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_list_drive\",\n \"List sources in a notebook with Drive freshness status\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const notebook = await getClient(queryTimeout).getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await getClient(queryTimeout).checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return ok({ sources: results });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_sync_drive\",\n \"Sync stale Google Drive sources (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n try {\n await getClient(queryTimeout).syncDrive(source_ids, notebook_id);\n return ok({ message: `Synced ${source_ids.length} sources` });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"source_delete\",\n \"Delete a source from a notebook (requires confirm=true)\",\n {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n async ({ notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source.\");\n try {\n await getClient(queryTimeout).deleteSource(source_id, notebook_id);\n return ok({ message: \"Source deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Query Tools (2) ────────────────────────────────\n\n server.tool(\n \"notebook_query\",\n \"Ask a question about the sources in a notebook\",\n {\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 async ({ notebook_id, query, source_ids, conversation_id }) => {\n try {\n const response = await getClient(queryTimeout).query(notebook_id, query, source_ids, conversation_id);\n return ok({ answer: response.answer, conversation_id: response.conversation_id });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"chat_configure\",\n \"Configure chat behavior (goal and response length)\",\n {\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 async ({ notebook_id, goal, custom_prompt, response_length }) => {\n try {\n await getClient(queryTimeout).chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return ok({ message: \"Chat configured\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Research Tools (3) ──────────────────────────────\n\n server.tool(\n \"research_start\",\n \"Start a web or Drive research task\",\n {\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 async ({ notebook_id, query, source, mode }) => {\n try {\n const result = await getClient(queryTimeout).startResearch(notebook_id, query, source, mode);\n return ok({ task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"research_status\",\n \"Check the status of research tasks\",\n {\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 async ({ notebook_id, task_id }) => {\n try {\n const results = await getClient(queryTimeout).pollResearch(notebook_id, task_id);\n return ok({ results });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"research_import\",\n \"Import discovered sources from a research task into the notebook\",\n {\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 async ({ notebook_id, task_id, source_indices }) => {\n try {\n await getClient(queryTimeout).importResearch(notebook_id, task_id, source_indices);\n return ok({ message: \"Research sources imported\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Studio Creation Tools (10) ─────────────────────\n\n server.tool(\n \"audio_overview_create\",\n \"Generate an audio podcast overview (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"video_overview_create\",\n \"Generate a video overview (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"infographic_create\",\n \"Generate an infographic (requires confirm=true)\",\n {\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(`Detail: ${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 async ({ notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"slide_deck_create\",\n \"Generate a slide deck presentation (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return ok({ artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"report_create\",\n \"Generate a report (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return ok({ artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"flashcards_create\",\n \"Generate flashcards for study (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createFlashcards(notebook_id, ids, difficulty);\n return ok({ artifact_id: artifactId, message: \"Flashcard generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"quiz_create\",\n \"Generate a quiz (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createQuiz(notebook_id, ids, question_count, difficulty);\n return ok({ artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"data_table_create\",\n \"Generate a data table (requires confirm=true)\",\n {\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 async ({ notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createDataTable(notebook_id, ids, description, language);\n return ok({ artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"mind_map_create\",\n \"Generate and save a mind map (requires confirm=true)\",\n {\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 async ({ notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n try {\n const ids = source_ids || (await getClient(queryTimeout).getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await getClient(queryTimeout).createMindMap(notebook_id, ids, title);\n return ok({ artifact_id: artifactId, message: \"Mind map generated and saved.\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Studio Management (2) ──────────────────────────\n\n server.tool(\n \"studio_status\",\n \"Check the status of studio artifact generation and get download URLs\",\n { notebook_id: z.string().describe(\"The notebook ID\") },\n async ({ notebook_id }) => {\n try {\n const artifacts = await getClient(queryTimeout).pollStudio(notebook_id);\n return ok({ artifacts });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"studio_delete\",\n \"Delete a studio artifact (requires confirm=true)\",\n {\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 async ({ notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n try {\n await getClient(queryTimeout).deleteStudio(notebook_id, artifact_id);\n return ok({ message: \"Artifact deleted\" });\n } catch (e) { return err(e); }\n },\n );\n\n // ─── Auth Tools (2) ─────────────────────────────────\n\n server.tool(\n \"refresh_auth\",\n \"Reload authentication tokens (re-extract CSRF and session from page)\",\n {},\n async () => {\n try {\n await getClient(queryTimeout).refreshAuth();\n return ok({ message: \"Authentication tokens refreshed\" });\n } catch (e) { return err(e); }\n },\n );\n\n server.tool(\n \"save_auth_tokens\",\n \"Manually save authentication cookies (fallback method — prefer using CLI auth)\",\n {\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 async ({ cookies: cookieStr, csrf_token, session_id }) => {\n try {\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.slice(0, eq).trim()] = part.slice(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 // Reset client to use new tokens\n client = null;\n return ok({ message: \"Tokens saved. Client will use new tokens on next request.\" });\n } catch (e) { return err(e); }\n },\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 `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 `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"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,27 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m4ykeldev/notebooklm-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
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": {
|
|
7
|
-
"notebooklm-mcp": "
|
|
7
|
+
"notebooklm-mcp": "dist/cli.js"
|
|
8
8
|
},
|
|
9
|
-
"files": [
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
10
12
|
"scripts": {
|
|
11
13
|
"build": "tsup",
|
|
12
14
|
"dev": "tsup --watch",
|
|
13
15
|
"prepublishOnly": "npm run build"
|
|
14
16
|
},
|
|
15
|
-
"engines": {
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"notebooklm",
|
|
23
|
+
"google",
|
|
24
|
+
"ai",
|
|
25
|
+
"model-context-protocol"
|
|
26
|
+
],
|
|
27
|
+
"author": "m4yk3ldev",
|
|
18
28
|
"license": "MIT",
|
|
19
29
|
"repository": {
|
|
20
30
|
"type": "git",
|
|
21
|
-
"url": "https://github.com/
|
|
31
|
+
"url": "git+https://github.com/m4yk3ldev/notebooklm-mcp.git"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/m4yk3ldev/notebooklm-mcp#readme",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/m4yk3ldev/notebooklm-mcp/issues"
|
|
22
36
|
},
|
|
23
37
|
"publishConfig": {
|
|
24
|
-
"access": "public"
|
|
38
|
+
"access": "public",
|
|
39
|
+
"registry": "https://registry.npmjs.org",
|
|
40
|
+
"provenance": true
|
|
25
41
|
},
|
|
26
42
|
"dependencies": {
|
|
27
43
|
"@modelcontextprotocol/sdk": "^1.0.0",
|