@roomi-fields/notebooklm-mcp 1.1.2
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 +22 -0
- package/README.md +548 -0
- package/dist/auth/auth-manager.d.ts +139 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +981 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/config.d.ts +89 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +216 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/http-wrapper.d.ts +8 -0
- package/dist/http-wrapper.d.ts.map +1 -0
- package/dist/http-wrapper.js +221 -0
- package/dist/http-wrapper.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +499 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +81 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +362 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/session/browser-session.d.ts +108 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +630 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +76 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +273 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/tools/index.d.ts +225 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1396 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +422 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +398 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/package.json +71 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* NotebookLM MCP Server
|
|
4
|
+
*
|
|
5
|
+
* MCP Server for Google NotebookLM - Chat with Gemini 2.5 through NotebookLM
|
|
6
|
+
* with session support and human-like behavior!
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Session-based contextual conversations
|
|
10
|
+
* - Auto re-login on session expiry
|
|
11
|
+
* - Human-like typing and mouse movements
|
|
12
|
+
* - Persistent browser fingerprint
|
|
13
|
+
* - Stealth mode with Patchright
|
|
14
|
+
* - Claude Code integration via npx
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* npx notebooklm-mcp
|
|
18
|
+
* node dist/index.js
|
|
19
|
+
*
|
|
20
|
+
* Environment Variables:
|
|
21
|
+
* NOTEBOOK_URL - Default NotebookLM notebook URL
|
|
22
|
+
* AUTO_LOGIN_ENABLED - Enable automatic login (true/false)
|
|
23
|
+
* LOGIN_EMAIL - Google email for auto-login
|
|
24
|
+
* LOGIN_PASSWORD - Google password for auto-login
|
|
25
|
+
* HEADLESS - Run browser in headless mode (true/false)
|
|
26
|
+
* MAX_SESSIONS - Maximum concurrent sessions (default: 10)
|
|
27
|
+
* SESSION_TIMEOUT - Session timeout in seconds (default: 900)
|
|
28
|
+
*
|
|
29
|
+
* Based on the Python NotebookLM API implementation
|
|
30
|
+
*/
|
|
31
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
32
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
33
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, CompleteRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
34
|
+
import { AuthManager } from "./auth/auth-manager.js";
|
|
35
|
+
import { SessionManager } from "./session/session-manager.js";
|
|
36
|
+
import { NotebookLibrary } from "./library/notebook-library.js";
|
|
37
|
+
import { ToolHandlers, buildToolDefinitions } from "./tools/index.js";
|
|
38
|
+
import { CONFIG } from "./config.js";
|
|
39
|
+
import { log } from "./utils/logger.js";
|
|
40
|
+
/**
|
|
41
|
+
* Main MCP Server Class
|
|
42
|
+
*/
|
|
43
|
+
class NotebookLMMCPServer {
|
|
44
|
+
server;
|
|
45
|
+
authManager;
|
|
46
|
+
sessionManager;
|
|
47
|
+
library;
|
|
48
|
+
toolHandlers;
|
|
49
|
+
toolDefinitions;
|
|
50
|
+
constructor() {
|
|
51
|
+
// Initialize MCP Server
|
|
52
|
+
this.server = new Server({
|
|
53
|
+
name: "notebooklm-mcp",
|
|
54
|
+
version: "1.1.2",
|
|
55
|
+
}, {
|
|
56
|
+
capabilities: {
|
|
57
|
+
tools: {},
|
|
58
|
+
resources: {},
|
|
59
|
+
resourceTemplates: {},
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
// Initialize managers
|
|
63
|
+
this.authManager = new AuthManager();
|
|
64
|
+
this.sessionManager = new SessionManager(this.authManager);
|
|
65
|
+
this.library = new NotebookLibrary();
|
|
66
|
+
this.toolHandlers = new ToolHandlers(this.sessionManager, this.authManager, this.library);
|
|
67
|
+
// Build tool definitions with library context
|
|
68
|
+
this.toolDefinitions = buildToolDefinitions(this.library);
|
|
69
|
+
// Setup handlers
|
|
70
|
+
this.setupHandlers();
|
|
71
|
+
this.setupShutdownHandlers();
|
|
72
|
+
log.info("🚀 NotebookLM MCP Server initialized");
|
|
73
|
+
log.info(` Version: 1.1.2`);
|
|
74
|
+
log.info(` Node: ${process.version}`);
|
|
75
|
+
log.info(` Platform: ${process.platform}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Return notebook IDs matching the provided input (case-insensitive contains)
|
|
79
|
+
*/
|
|
80
|
+
completeNotebookIds(input) {
|
|
81
|
+
const query = String(input ?? "").toLowerCase();
|
|
82
|
+
return this.library
|
|
83
|
+
.listNotebooks()
|
|
84
|
+
.map((nb) => nb.id)
|
|
85
|
+
.filter((id) => id.toLowerCase().includes(query))
|
|
86
|
+
.slice(0, 50);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build a completion payload for MCP responses
|
|
90
|
+
*/
|
|
91
|
+
buildCompletion(values) {
|
|
92
|
+
return {
|
|
93
|
+
completion: {
|
|
94
|
+
values,
|
|
95
|
+
total: values.length,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Setup MCP request handlers
|
|
101
|
+
*/
|
|
102
|
+
setupHandlers() {
|
|
103
|
+
// List available tools
|
|
104
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
105
|
+
log.info("📋 [MCP] list_tools request received");
|
|
106
|
+
return {
|
|
107
|
+
tools: this.toolDefinitions,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
// List available resources
|
|
111
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
112
|
+
log.info("📚 [MCP] list_resources request received");
|
|
113
|
+
const notebooks = this.library.listNotebooks();
|
|
114
|
+
const resources = [
|
|
115
|
+
{
|
|
116
|
+
uri: "notebooklm://library",
|
|
117
|
+
name: "Notebook Library",
|
|
118
|
+
description: "Complete notebook library with all available knowledge sources. " +
|
|
119
|
+
"Read this to discover what notebooks are available. " +
|
|
120
|
+
"⚠️ If you think a notebook might help with the user's task, " +
|
|
121
|
+
"ASK THE USER FOR PERMISSION before consulting it: " +
|
|
122
|
+
"'Should I consult the [notebook] for this task?'",
|
|
123
|
+
mimeType: "application/json",
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
// Add individual notebook resources
|
|
127
|
+
for (const notebook of notebooks) {
|
|
128
|
+
resources.push({
|
|
129
|
+
uri: `notebooklm://library/${notebook.id}`,
|
|
130
|
+
name: notebook.name,
|
|
131
|
+
description: `${notebook.description} | Topics: ${notebook.topics.join(", ")} | ` +
|
|
132
|
+
`💡 Use ask_question to query this notebook (ask user permission first if task isn't explicitly about these topics)`,
|
|
133
|
+
mimeType: "application/json",
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Add legacy metadata resource for backwards compatibility
|
|
137
|
+
const active = this.library.getActiveNotebook();
|
|
138
|
+
if (active) {
|
|
139
|
+
resources.push({
|
|
140
|
+
uri: "notebooklm://metadata",
|
|
141
|
+
name: "Active Notebook Metadata (Legacy)",
|
|
142
|
+
description: "Information about the currently active notebook. " +
|
|
143
|
+
"DEPRECATED: Use notebooklm://library instead for multi-notebook support. " +
|
|
144
|
+
"⚠️ Always ask user permission before using notebooks for tasks they didn't explicitly mention.",
|
|
145
|
+
mimeType: "application/json",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return { resources };
|
|
149
|
+
});
|
|
150
|
+
// List resource templates
|
|
151
|
+
this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
|
|
152
|
+
log.info("📑 [MCP] list_resource_templates request received");
|
|
153
|
+
return {
|
|
154
|
+
resourceTemplates: [
|
|
155
|
+
{
|
|
156
|
+
uriTemplate: "notebooklm://library/{id}",
|
|
157
|
+
name: "Notebook by ID",
|
|
158
|
+
description: "Access a specific notebook from your library by ID. " +
|
|
159
|
+
"Provides detailed metadata about the notebook including topics, use cases, and usage statistics. " +
|
|
160
|
+
"💡 Use the 'id' parameter from list_notebooks to access specific notebooks.",
|
|
161
|
+
mimeType: "application/json",
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
// Read resource content
|
|
167
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
168
|
+
const { uri } = request.params;
|
|
169
|
+
log.info(`📖 [MCP] read_resource request: ${uri}`);
|
|
170
|
+
// Handle library resource
|
|
171
|
+
if (uri === "notebooklm://library") {
|
|
172
|
+
const notebooks = this.library.listNotebooks();
|
|
173
|
+
const stats = this.library.getStats();
|
|
174
|
+
const active = this.library.getActiveNotebook();
|
|
175
|
+
const libraryData = {
|
|
176
|
+
active_notebook: active ? {
|
|
177
|
+
id: active.id,
|
|
178
|
+
name: active.name,
|
|
179
|
+
description: active.description,
|
|
180
|
+
topics: active.topics,
|
|
181
|
+
} : null,
|
|
182
|
+
notebooks: notebooks.map(nb => ({
|
|
183
|
+
id: nb.id,
|
|
184
|
+
name: nb.name,
|
|
185
|
+
description: nb.description,
|
|
186
|
+
topics: nb.topics,
|
|
187
|
+
content_types: nb.content_types,
|
|
188
|
+
use_cases: nb.use_cases,
|
|
189
|
+
url: nb.url,
|
|
190
|
+
use_count: nb.use_count,
|
|
191
|
+
last_used: nb.last_used,
|
|
192
|
+
tags: nb.tags,
|
|
193
|
+
})),
|
|
194
|
+
stats,
|
|
195
|
+
};
|
|
196
|
+
return {
|
|
197
|
+
contents: [
|
|
198
|
+
{
|
|
199
|
+
uri,
|
|
200
|
+
mimeType: "application/json",
|
|
201
|
+
text: JSON.stringify(libraryData, null, 2),
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// Handle individual notebook resource
|
|
207
|
+
if (uri.startsWith("notebooklm://library/")) {
|
|
208
|
+
const prefix = "notebooklm://library/";
|
|
209
|
+
const encodedId = uri.slice(prefix.length);
|
|
210
|
+
if (!encodedId) {
|
|
211
|
+
throw new Error("Notebook resource requires an ID (e.g. notebooklm://library/{id})");
|
|
212
|
+
}
|
|
213
|
+
let id;
|
|
214
|
+
try {
|
|
215
|
+
id = decodeURIComponent(encodedId);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
throw new Error(`Invalid notebook identifier encoding: ${encodedId}`);
|
|
219
|
+
}
|
|
220
|
+
if (!/^[a-z0-9][a-z0-9-]{0,62}$/i.test(id)) {
|
|
221
|
+
throw new Error(`Invalid notebook identifier: ${encodedId}. Notebook IDs may only contain letters, numbers, and hyphens.`);
|
|
222
|
+
}
|
|
223
|
+
const notebook = this.library.getNotebook(id);
|
|
224
|
+
if (!notebook) {
|
|
225
|
+
throw new Error(`Notebook not found: ${id}`);
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
contents: [
|
|
229
|
+
{
|
|
230
|
+
uri,
|
|
231
|
+
mimeType: "application/json",
|
|
232
|
+
text: JSON.stringify(notebook, null, 2),
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Legacy metadata resource (backwards compatibility)
|
|
238
|
+
if (uri === "notebooklm://metadata") {
|
|
239
|
+
const active = this.library.getActiveNotebook();
|
|
240
|
+
if (!active) {
|
|
241
|
+
throw new Error("No active notebook. Use notebooklm://library to see all notebooks.");
|
|
242
|
+
}
|
|
243
|
+
const metadata = {
|
|
244
|
+
description: active.description,
|
|
245
|
+
topics: active.topics,
|
|
246
|
+
content_types: active.content_types,
|
|
247
|
+
use_cases: active.use_cases,
|
|
248
|
+
notebook_url: active.url,
|
|
249
|
+
notebook_id: active.id,
|
|
250
|
+
last_used: active.last_used,
|
|
251
|
+
use_count: active.use_count,
|
|
252
|
+
note: "DEPRECATED: Use notebooklm://library or notebooklm://library/{id} instead",
|
|
253
|
+
};
|
|
254
|
+
return {
|
|
255
|
+
contents: [
|
|
256
|
+
{
|
|
257
|
+
uri,
|
|
258
|
+
mimeType: "application/json",
|
|
259
|
+
text: JSON.stringify(metadata, null, 2),
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
265
|
+
});
|
|
266
|
+
// Argument completions (for prompt arguments)
|
|
267
|
+
this.server.setRequestHandler(CompleteRequestSchema, async (request) => {
|
|
268
|
+
const { ref, argument } = request.params;
|
|
269
|
+
try {
|
|
270
|
+
if (ref?.type === "ref/resource") {
|
|
271
|
+
// Complete variables for resource templates
|
|
272
|
+
const uri = String(ref.uri || "");
|
|
273
|
+
// Notebook by ID template
|
|
274
|
+
if (uri === "notebooklm://library/{id}" && argument?.name === "id") {
|
|
275
|
+
const values = this.completeNotebookIds(argument?.value);
|
|
276
|
+
return this.buildCompletion(values);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
log.warning(`⚠️ [MCP] completion error: ${e}`);
|
|
282
|
+
}
|
|
283
|
+
return { completion: { values: [], total: 0 } };
|
|
284
|
+
});
|
|
285
|
+
// Handle tool calls
|
|
286
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
287
|
+
const { name, arguments: args } = request.params;
|
|
288
|
+
const progressToken = args?._meta?.progressToken;
|
|
289
|
+
log.info(`🔧 [MCP] Tool call: ${name}`);
|
|
290
|
+
if (progressToken) {
|
|
291
|
+
log.info(` 📊 Progress token: ${progressToken}`);
|
|
292
|
+
}
|
|
293
|
+
// Create progress callback function
|
|
294
|
+
const sendProgress = async (message, progress, total) => {
|
|
295
|
+
if (progressToken) {
|
|
296
|
+
await this.server.notification({
|
|
297
|
+
method: "notifications/progress",
|
|
298
|
+
params: {
|
|
299
|
+
progressToken,
|
|
300
|
+
message,
|
|
301
|
+
...(progress !== undefined && { progress }),
|
|
302
|
+
...(total !== undefined && { total }),
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
log.dim(` 📊 Progress: ${message}`);
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
let result;
|
|
310
|
+
switch (name) {
|
|
311
|
+
case "ask_question":
|
|
312
|
+
result = await this.toolHandlers.handleAskQuestion(args, sendProgress);
|
|
313
|
+
break;
|
|
314
|
+
case "add_notebook":
|
|
315
|
+
result = await this.toolHandlers.handleAddNotebook(args);
|
|
316
|
+
break;
|
|
317
|
+
case "list_notebooks":
|
|
318
|
+
result = await this.toolHandlers.handleListNotebooks();
|
|
319
|
+
break;
|
|
320
|
+
case "get_notebook":
|
|
321
|
+
result = await this.toolHandlers.handleGetNotebook(args);
|
|
322
|
+
break;
|
|
323
|
+
case "select_notebook":
|
|
324
|
+
result = await this.toolHandlers.handleSelectNotebook(args);
|
|
325
|
+
break;
|
|
326
|
+
case "update_notebook":
|
|
327
|
+
result = await this.toolHandlers.handleUpdateNotebook(args);
|
|
328
|
+
break;
|
|
329
|
+
case "remove_notebook":
|
|
330
|
+
result = await this.toolHandlers.handleRemoveNotebook(args);
|
|
331
|
+
break;
|
|
332
|
+
case "search_notebooks":
|
|
333
|
+
result = await this.toolHandlers.handleSearchNotebooks(args);
|
|
334
|
+
break;
|
|
335
|
+
case "get_library_stats":
|
|
336
|
+
result = await this.toolHandlers.handleGetLibraryStats();
|
|
337
|
+
break;
|
|
338
|
+
case "list_sessions":
|
|
339
|
+
result = await this.toolHandlers.handleListSessions();
|
|
340
|
+
break;
|
|
341
|
+
case "close_session":
|
|
342
|
+
result = await this.toolHandlers.handleCloseSession(args);
|
|
343
|
+
break;
|
|
344
|
+
case "reset_session":
|
|
345
|
+
result = await this.toolHandlers.handleResetSession(args);
|
|
346
|
+
break;
|
|
347
|
+
case "get_health":
|
|
348
|
+
result = await this.toolHandlers.handleGetHealth();
|
|
349
|
+
break;
|
|
350
|
+
case "setup_auth":
|
|
351
|
+
result = await this.toolHandlers.handleSetupAuth(args, sendProgress);
|
|
352
|
+
break;
|
|
353
|
+
case "re_auth":
|
|
354
|
+
result = await this.toolHandlers.handleReAuth(args, sendProgress);
|
|
355
|
+
break;
|
|
356
|
+
case "cleanup_data":
|
|
357
|
+
result = await this.toolHandlers.handleCleanupData(args);
|
|
358
|
+
break;
|
|
359
|
+
default:
|
|
360
|
+
log.error(`❌ [MCP] Unknown tool: ${name}`);
|
|
361
|
+
return {
|
|
362
|
+
content: [
|
|
363
|
+
{
|
|
364
|
+
type: "text",
|
|
365
|
+
text: JSON.stringify({
|
|
366
|
+
success: false,
|
|
367
|
+
error: `Unknown tool: ${name}`,
|
|
368
|
+
}, null, 2),
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
// Return result
|
|
374
|
+
return {
|
|
375
|
+
content: [
|
|
376
|
+
{
|
|
377
|
+
type: "text",
|
|
378
|
+
text: JSON.stringify(result, null, 2),
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
385
|
+
log.error(`❌ [MCP] Tool execution error: ${errorMessage}`);
|
|
386
|
+
return {
|
|
387
|
+
content: [
|
|
388
|
+
{
|
|
389
|
+
type: "text",
|
|
390
|
+
text: JSON.stringify({
|
|
391
|
+
success: false,
|
|
392
|
+
error: errorMessage,
|
|
393
|
+
}, null, 2),
|
|
394
|
+
},
|
|
395
|
+
],
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Setup graceful shutdown handlers
|
|
402
|
+
*/
|
|
403
|
+
setupShutdownHandlers() {
|
|
404
|
+
let shuttingDown = false;
|
|
405
|
+
const shutdown = async (signal) => {
|
|
406
|
+
if (shuttingDown) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
shuttingDown = true;
|
|
410
|
+
log.info(`\n🛑 Received ${signal}, shutting down gracefully...`);
|
|
411
|
+
try {
|
|
412
|
+
// Cleanup tool handlers (closes all sessions)
|
|
413
|
+
await this.toolHandlers.cleanup();
|
|
414
|
+
// Close server
|
|
415
|
+
await this.server.close();
|
|
416
|
+
log.success("✅ Shutdown complete");
|
|
417
|
+
process.exit(0);
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
log.error(`❌ Error during shutdown: ${error}`);
|
|
421
|
+
process.exit(1);
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
const requestShutdown = (signal) => {
|
|
425
|
+
void shutdown(signal);
|
|
426
|
+
};
|
|
427
|
+
process.on("SIGINT", () => requestShutdown("SIGINT"));
|
|
428
|
+
process.on("SIGTERM", () => requestShutdown("SIGTERM"));
|
|
429
|
+
process.on("uncaughtException", (error) => {
|
|
430
|
+
log.error(`💥 Uncaught exception: ${error}`);
|
|
431
|
+
log.error(error.stack || "");
|
|
432
|
+
requestShutdown("uncaughtException");
|
|
433
|
+
});
|
|
434
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
435
|
+
log.error(`💥 Unhandled rejection at: ${promise}`);
|
|
436
|
+
log.error(`Reason: ${reason}`);
|
|
437
|
+
requestShutdown("unhandledRejection");
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Start the MCP server
|
|
442
|
+
*/
|
|
443
|
+
async start() {
|
|
444
|
+
log.info("🎯 Starting NotebookLM MCP Server...");
|
|
445
|
+
log.info("");
|
|
446
|
+
log.info("📝 Configuration:");
|
|
447
|
+
log.info(` Config Dir: ${CONFIG.configDir}`);
|
|
448
|
+
log.info(` Data Dir: ${CONFIG.dataDir}`);
|
|
449
|
+
log.info(` Headless: ${CONFIG.headless}`);
|
|
450
|
+
log.info(` Max Sessions: ${CONFIG.maxSessions}`);
|
|
451
|
+
log.info(` Session Timeout: ${CONFIG.sessionTimeout}s`);
|
|
452
|
+
log.info(` Stealth: ${CONFIG.stealthEnabled}`);
|
|
453
|
+
log.info("");
|
|
454
|
+
// Create stdio transport
|
|
455
|
+
const transport = new StdioServerTransport();
|
|
456
|
+
// Connect server to transport
|
|
457
|
+
await this.server.connect(transport);
|
|
458
|
+
log.success("✅ MCP Server connected via stdio");
|
|
459
|
+
log.success("🎉 Ready to receive requests from Claude Code!");
|
|
460
|
+
log.info("");
|
|
461
|
+
log.info("💡 Available tools:");
|
|
462
|
+
for (const tool of this.toolDefinitions) {
|
|
463
|
+
const desc = tool.description ? tool.description.split('\n')[0] : 'No description'; // First line only
|
|
464
|
+
log.info(` - ${tool.name}: ${desc.substring(0, 80)}...`);
|
|
465
|
+
}
|
|
466
|
+
log.info("");
|
|
467
|
+
log.info("📖 For documentation, see: README.md");
|
|
468
|
+
log.info("📖 For MCP details, see: MCP_INFOS.md");
|
|
469
|
+
log.info("");
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Main entry point
|
|
474
|
+
*/
|
|
475
|
+
async function main() {
|
|
476
|
+
// Print banner
|
|
477
|
+
console.error("╔══════════════════════════════════════════════════════════╗");
|
|
478
|
+
console.error("║ ║");
|
|
479
|
+
console.error("║ NotebookLM MCP Server v1.1.2 ║");
|
|
480
|
+
console.error("║ ║");
|
|
481
|
+
console.error("║ Chat with Gemini 2.5 through NotebookLM via MCP ║");
|
|
482
|
+
console.error("║ ║");
|
|
483
|
+
console.error("╚══════════════════════════════════════════════════════════╝");
|
|
484
|
+
console.error("");
|
|
485
|
+
try {
|
|
486
|
+
const server = new NotebookLMMCPServer();
|
|
487
|
+
await server.start();
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
log.error(`💥 Fatal error starting server: ${error}`);
|
|
491
|
+
if (error instanceof Error) {
|
|
492
|
+
log.error(error.stack || "");
|
|
493
|
+
}
|
|
494
|
+
process.exit(1);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Run the server
|
|
498
|
+
main();
|
|
499
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotebookLM Library Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages a persistent library of NotebookLM notebooks.
|
|
5
|
+
* Allows Claude to autonomously add, remove, and switch between
|
|
6
|
+
* multiple notebooks based on the task at hand.
|
|
7
|
+
*/
|
|
8
|
+
import type { NotebookEntry, AddNotebookInput, UpdateNotebookInput, LibraryStats } from "./types.js";
|
|
9
|
+
import type { SessionManager } from "../session/session-manager.js";
|
|
10
|
+
export declare class NotebookLibrary {
|
|
11
|
+
private libraryPath;
|
|
12
|
+
private library;
|
|
13
|
+
private sessionManager?;
|
|
14
|
+
constructor(sessionManager?: SessionManager);
|
|
15
|
+
/**
|
|
16
|
+
* Load library from disk, or create default if not exists
|
|
17
|
+
*/
|
|
18
|
+
private loadLibrary;
|
|
19
|
+
/**
|
|
20
|
+
* Create default library from current CONFIG
|
|
21
|
+
*/
|
|
22
|
+
private createDefaultLibrary;
|
|
23
|
+
/**
|
|
24
|
+
* Save library to disk
|
|
25
|
+
*/
|
|
26
|
+
private saveLibrary;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a unique ID from a string (slug format)
|
|
29
|
+
*/
|
|
30
|
+
private generateId;
|
|
31
|
+
/**
|
|
32
|
+
* Add a new notebook to the library
|
|
33
|
+
*/
|
|
34
|
+
addNotebook(input: AddNotebookInput): Promise<NotebookEntry>;
|
|
35
|
+
/**
|
|
36
|
+
* Validate NotebookLM URL format
|
|
37
|
+
*/
|
|
38
|
+
private isValidNotebookUrl;
|
|
39
|
+
/**
|
|
40
|
+
* Validate that the notebook exists and is accessible
|
|
41
|
+
* Opens the notebook briefly to check if it loads correctly
|
|
42
|
+
*/
|
|
43
|
+
validateNotebookExists(url: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* List all notebooks in library
|
|
46
|
+
*/
|
|
47
|
+
listNotebooks(): NotebookEntry[];
|
|
48
|
+
/**
|
|
49
|
+
* Get a specific notebook by ID
|
|
50
|
+
*/
|
|
51
|
+
getNotebook(id: string): NotebookEntry | null;
|
|
52
|
+
/**
|
|
53
|
+
* Get the currently active notebook
|
|
54
|
+
*/
|
|
55
|
+
getActiveNotebook(): NotebookEntry | null;
|
|
56
|
+
/**
|
|
57
|
+
* Select a notebook as active
|
|
58
|
+
*/
|
|
59
|
+
selectNotebook(id: string): NotebookEntry;
|
|
60
|
+
/**
|
|
61
|
+
* Update notebook metadata
|
|
62
|
+
*/
|
|
63
|
+
updateNotebook(input: UpdateNotebookInput): NotebookEntry;
|
|
64
|
+
/**
|
|
65
|
+
* Remove notebook from library
|
|
66
|
+
*/
|
|
67
|
+
removeNotebook(id: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Increment use count for a notebook
|
|
70
|
+
*/
|
|
71
|
+
incrementUseCount(id: string): NotebookEntry | null;
|
|
72
|
+
/**
|
|
73
|
+
* Get library statistics
|
|
74
|
+
*/
|
|
75
|
+
getStats(): LibraryStats;
|
|
76
|
+
/**
|
|
77
|
+
* Search notebooks by query (searches name, description, topics)
|
|
78
|
+
*/
|
|
79
|
+
searchNotebooks(query: string): NotebookEntry[];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=notebook-library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-library.d.ts","sourceRoot":"","sources":["../../src/library/notebook-library.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EACV,aAAa,EAEb,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,cAAc,CAAC,EAAE,cAAc;IAa3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAsElE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;OAGG;IACG,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwDxD;;OAEG;IACH,aAAa,IAAI,aAAa,EAAE;IAIhC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAI7C;;OAEG;IACH,iBAAiB,IAAI,aAAa,GAAG,IAAI;IAOzC;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAwBzC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,aAAa;IA4BzD;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAuBnC;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAoBnD;;OAEG;IACH,QAAQ,IAAI,YAAY;IAmBxB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;CAUhD"}
|