@pan-sec/notebooklm-mcp 1.4.0

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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/SECURITY.md +539 -0
  4. package/dist/auth/auth-manager.d.ts +137 -0
  5. package/dist/auth/auth-manager.d.ts.map +1 -0
  6. package/dist/auth/auth-manager.js +984 -0
  7. package/dist/auth/auth-manager.js.map +1 -0
  8. package/dist/auth/mcp-auth.d.ts +102 -0
  9. package/dist/auth/mcp-auth.d.ts.map +1 -0
  10. package/dist/auth/mcp-auth.js +286 -0
  11. package/dist/auth/mcp-auth.js.map +1 -0
  12. package/dist/config.d.ts +89 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +216 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/errors.d.ts +26 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +41 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/index.d.ts +32 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +371 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/library/notebook-library.d.ts +70 -0
  25. package/dist/library/notebook-library.d.ts.map +1 -0
  26. package/dist/library/notebook-library.js +279 -0
  27. package/dist/library/notebook-library.js.map +1 -0
  28. package/dist/library/types.d.ts +67 -0
  29. package/dist/library/types.d.ts.map +1 -0
  30. package/dist/library/types.js +8 -0
  31. package/dist/library/types.js.map +1 -0
  32. package/dist/resources/resource-handlers.d.ts +22 -0
  33. package/dist/resources/resource-handlers.d.ts.map +1 -0
  34. package/dist/resources/resource-handlers.js +216 -0
  35. package/dist/resources/resource-handlers.js.map +1 -0
  36. package/dist/session/browser-session.d.ts +108 -0
  37. package/dist/session/browser-session.d.ts.map +1 -0
  38. package/dist/session/browser-session.js +621 -0
  39. package/dist/session/browser-session.js.map +1 -0
  40. package/dist/session/session-manager.d.ts +77 -0
  41. package/dist/session/session-manager.d.ts.map +1 -0
  42. package/dist/session/session-manager.js +314 -0
  43. package/dist/session/session-manager.js.map +1 -0
  44. package/dist/session/session-timeout.d.ts +122 -0
  45. package/dist/session/session-timeout.d.ts.map +1 -0
  46. package/dist/session/session-timeout.js +281 -0
  47. package/dist/session/session-timeout.js.map +1 -0
  48. package/dist/session/shared-context-manager.d.ts +107 -0
  49. package/dist/session/shared-context-manager.d.ts.map +1 -0
  50. package/dist/session/shared-context-manager.js +447 -0
  51. package/dist/session/shared-context-manager.js.map +1 -0
  52. package/dist/tools/definitions/ask-question.d.ts +8 -0
  53. package/dist/tools/definitions/ask-question.d.ts.map +1 -0
  54. package/dist/tools/definitions/ask-question.js +211 -0
  55. package/dist/tools/definitions/ask-question.js.map +1 -0
  56. package/dist/tools/definitions/notebook-management.d.ts +3 -0
  57. package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
  58. package/dist/tools/definitions/notebook-management.js +243 -0
  59. package/dist/tools/definitions/notebook-management.js.map +1 -0
  60. package/dist/tools/definitions/session-management.d.ts +3 -0
  61. package/dist/tools/definitions/session-management.d.ts.map +1 -0
  62. package/dist/tools/definitions/session-management.js +41 -0
  63. package/dist/tools/definitions/session-management.js.map +1 -0
  64. package/dist/tools/definitions/system.d.ts +3 -0
  65. package/dist/tools/definitions/system.d.ts.map +1 -0
  66. package/dist/tools/definitions/system.js +143 -0
  67. package/dist/tools/definitions/system.js.map +1 -0
  68. package/dist/tools/definitions.d.ts +12 -0
  69. package/dist/tools/definitions.d.ts.map +1 -0
  70. package/dist/tools/definitions.js +26 -0
  71. package/dist/tools/definitions.js.map +1 -0
  72. package/dist/tools/handlers.d.ts +213 -0
  73. package/dist/tools/handlers.d.ts.map +1 -0
  74. package/dist/tools/handlers.js +813 -0
  75. package/dist/tools/handlers.js.map +1 -0
  76. package/dist/tools/index.d.ts +8 -0
  77. package/dist/tools/index.d.ts.map +1 -0
  78. package/dist/tools/index.js +8 -0
  79. package/dist/tools/index.js.map +1 -0
  80. package/dist/types.d.ts +82 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +5 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utils/audit-logger.d.ts +140 -0
  85. package/dist/utils/audit-logger.d.ts.map +1 -0
  86. package/dist/utils/audit-logger.js +361 -0
  87. package/dist/utils/audit-logger.js.map +1 -0
  88. package/dist/utils/cert-pinning.d.ts +97 -0
  89. package/dist/utils/cert-pinning.d.ts.map +1 -0
  90. package/dist/utils/cert-pinning.js +328 -0
  91. package/dist/utils/cert-pinning.js.map +1 -0
  92. package/dist/utils/cleanup-manager.d.ts +133 -0
  93. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  94. package/dist/utils/cleanup-manager.js +673 -0
  95. package/dist/utils/cleanup-manager.js.map +1 -0
  96. package/dist/utils/cli-handler.d.ts +16 -0
  97. package/dist/utils/cli-handler.d.ts.map +1 -0
  98. package/dist/utils/cli-handler.js +102 -0
  99. package/dist/utils/cli-handler.js.map +1 -0
  100. package/dist/utils/crypto.d.ts +175 -0
  101. package/dist/utils/crypto.d.ts.map +1 -0
  102. package/dist/utils/crypto.js +612 -0
  103. package/dist/utils/crypto.js.map +1 -0
  104. package/dist/utils/logger.d.ts +61 -0
  105. package/dist/utils/logger.d.ts.map +1 -0
  106. package/dist/utils/logger.js +92 -0
  107. package/dist/utils/logger.js.map +1 -0
  108. package/dist/utils/page-utils.d.ts +54 -0
  109. package/dist/utils/page-utils.d.ts.map +1 -0
  110. package/dist/utils/page-utils.js +405 -0
  111. package/dist/utils/page-utils.js.map +1 -0
  112. package/dist/utils/response-validator.d.ts +98 -0
  113. package/dist/utils/response-validator.d.ts.map +1 -0
  114. package/dist/utils/response-validator.js +352 -0
  115. package/dist/utils/response-validator.js.map +1 -0
  116. package/dist/utils/secrets-scanner.d.ts +126 -0
  117. package/dist/utils/secrets-scanner.d.ts.map +1 -0
  118. package/dist/utils/secrets-scanner.js +443 -0
  119. package/dist/utils/secrets-scanner.js.map +1 -0
  120. package/dist/utils/secure-memory.d.ts +130 -0
  121. package/dist/utils/secure-memory.d.ts.map +1 -0
  122. package/dist/utils/secure-memory.js +279 -0
  123. package/dist/utils/secure-memory.js.map +1 -0
  124. package/dist/utils/security.d.ts +83 -0
  125. package/dist/utils/security.d.ts.map +1 -0
  126. package/dist/utils/security.js +272 -0
  127. package/dist/utils/security.js.map +1 -0
  128. package/dist/utils/settings-manager.d.ts +37 -0
  129. package/dist/utils/settings-manager.d.ts.map +1 -0
  130. package/dist/utils/settings-manager.js +125 -0
  131. package/dist/utils/settings-manager.js.map +1 -0
  132. package/dist/utils/stealth-utils.d.ts +135 -0
  133. package/dist/utils/stealth-utils.d.ts.map +1 -0
  134. package/dist/utils/stealth-utils.js +398 -0
  135. package/dist/utils/stealth-utils.js.map +1 -0
  136. package/dist/utils/tool-validation.d.ts +93 -0
  137. package/dist/utils/tool-validation.d.ts.map +1 -0
  138. package/dist/utils/tool-validation.js +277 -0
  139. package/dist/utils/tool-validation.js.map +1 -0
  140. package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
  141. package/docs/configuration.md +94 -0
  142. package/docs/tools.md +34 -0
  143. package/docs/troubleshooting.md +59 -0
  144. package/docs/usage-guide.md +245 -0
  145. package/package.json +82 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Tool Validation Middleware (before_tool_callback pattern)
3
+ *
4
+ * Implements the before_tool_callback pattern from "Agentic Design Patterns"
5
+ * Chapter 18 - Guardrails/Safety Patterns
6
+ *
7
+ * This module provides pre-execution validation for tool calls,
8
+ * ensuring the Principle of Least Privilege is enforced.
9
+ */
10
+ import { log } from "./logger.js";
11
+ import { audit } from "./audit-logger.js";
12
+ import crypto from "crypto";
13
+ /**
14
+ * Tool permission definitions
15
+ */
16
+ const TOOL_PERMISSIONS = {
17
+ // Read-only tools - minimal permissions
18
+ ask_question: ["read"],
19
+ list_notebooks: ["read"],
20
+ get_notebook: ["read"],
21
+ search_notebooks: ["read"],
22
+ get_library_stats: ["read"],
23
+ list_sessions: ["read"],
24
+ get_health: ["read"],
25
+ // Write tools - require write permission
26
+ add_notebook: ["read", "write"],
27
+ update_notebook: ["read", "write"],
28
+ select_notebook: ["read", "write"],
29
+ // Destructive tools - require admin permission
30
+ remove_notebook: ["read", "write", "admin"],
31
+ close_session: ["read", "write", "admin"],
32
+ reset_session: ["read", "write", "admin"],
33
+ cleanup_data: ["read", "write", "admin"],
34
+ // Auth tools - special permissions
35
+ setup_auth: ["auth"],
36
+ re_auth: ["auth"],
37
+ };
38
+ /**
39
+ * Sensitive parameter patterns that require extra validation
40
+ */
41
+ const SENSITIVE_PARAMS = [
42
+ "user_id",
43
+ "session_id",
44
+ "notebook_id",
45
+ "auth_token",
46
+ "password",
47
+ "secret",
48
+ "key",
49
+ "credential",
50
+ ];
51
+ /**
52
+ * Session context store (in-memory, per-process)
53
+ */
54
+ const sessionContexts = new Map();
55
+ /**
56
+ * Create or get session context
57
+ */
58
+ export function getOrCreateSessionContext(sessionId, userId, clientId) {
59
+ let context = sessionContexts.get(sessionId);
60
+ if (!context) {
61
+ context = {
62
+ sessionId,
63
+ userId,
64
+ clientId,
65
+ permissions: new Set(["read"]), // Default: read-only
66
+ createdAt: new Date(),
67
+ lastActivity: new Date(),
68
+ requestCount: 0,
69
+ };
70
+ sessionContexts.set(sessionId, context);
71
+ log.info(`📋 Created session context: ${sessionId}`);
72
+ }
73
+ // Update activity
74
+ context.lastActivity = new Date();
75
+ context.requestCount++;
76
+ return context;
77
+ }
78
+ /**
79
+ * Grant permissions to a session
80
+ */
81
+ export function grantPermissions(sessionId, permissions) {
82
+ const context = sessionContexts.get(sessionId);
83
+ if (context) {
84
+ permissions.forEach((p) => context.permissions.add(p));
85
+ log.info(`🔑 Granted permissions to ${sessionId}: ${permissions.join(", ")}`);
86
+ }
87
+ }
88
+ /**
89
+ * Revoke permissions from a session
90
+ */
91
+ export function revokePermissions(sessionId, permissions) {
92
+ const context = sessionContexts.get(sessionId);
93
+ if (context) {
94
+ permissions.forEach((p) => context.permissions.delete(p));
95
+ log.info(`🔒 Revoked permissions from ${sessionId}: ${permissions.join(", ")}`);
96
+ }
97
+ }
98
+ /**
99
+ * Clear session context
100
+ */
101
+ export function clearSessionContext(sessionId) {
102
+ sessionContexts.delete(sessionId);
103
+ log.info(`🗑️ Cleared session context: ${sessionId}`);
104
+ }
105
+ /**
106
+ * before_tool_callback - Validate tool call before execution
107
+ *
108
+ * This implements the pattern from Chapter 18:
109
+ * - Validates tool permissions
110
+ * - Checks session state matches parameters
111
+ * - Sanitizes sensitive arguments
112
+ * - Logs security events
113
+ *
114
+ * @returns ValidationResult - { allowed: true } to proceed, { allowed: false, reason } to block
115
+ */
116
+ export async function beforeToolCallback(params) {
117
+ const { toolName, args, sessionContext } = params;
118
+ // 1. Check tool exists in permission map
119
+ const requiredPermissions = TOOL_PERMISSIONS[toolName];
120
+ if (!requiredPermissions) {
121
+ log.warning(`⚠️ Unknown tool: ${toolName}`);
122
+ await audit.security("unknown_tool_call", "warning", {
123
+ tool: toolName,
124
+ session_id: sessionContext.sessionId,
125
+ });
126
+ // Allow unknown tools but log them (fail-open for extensibility)
127
+ return { allowed: true };
128
+ }
129
+ // 2. Check session has required permissions
130
+ const missingPermissions = requiredPermissions.filter((p) => !sessionContext.permissions.has(p));
131
+ if (missingPermissions.length > 0) {
132
+ const reason = `Missing permissions: ${missingPermissions.join(", ")}`;
133
+ log.error(`🚫 [SECURITY] Tool blocked: ${toolName} - ${reason}`);
134
+ await audit.security("permission_denied", "error", {
135
+ tool: toolName,
136
+ session_id: sessionContext.sessionId,
137
+ missing_permissions: missingPermissions,
138
+ });
139
+ return { allowed: false, reason };
140
+ }
141
+ // 3. Validate sensitive parameters match session context
142
+ const sanitizedArgs = { ...args };
143
+ for (const param of SENSITIVE_PARAMS) {
144
+ if (param in args) {
145
+ const argValue = args[param];
146
+ // Session ID validation - must match current session or be undefined
147
+ if (param === "session_id" && argValue !== undefined) {
148
+ if (argValue !== sessionContext.sessionId) {
149
+ // Check if it's a valid session the user owns
150
+ const targetContext = sessionContexts.get(argValue);
151
+ if (!targetContext || targetContext.userId !== sessionContext.userId) {
152
+ const reason = `Session ID mismatch: cannot access session ${argValue}`;
153
+ log.error(`🚫 [SECURITY] ${reason}`);
154
+ await audit.security("session_hijack_attempt", "critical", {
155
+ tool: toolName,
156
+ session_id: sessionContext.sessionId,
157
+ target_session: argValue,
158
+ });
159
+ return { allowed: false, reason };
160
+ }
161
+ }
162
+ }
163
+ // User ID validation - must match session user
164
+ if (param === "user_id" && argValue !== undefined) {
165
+ if (sessionContext.userId && argValue !== sessionContext.userId) {
166
+ const reason = `User ID mismatch: ${argValue} vs session user ${sessionContext.userId}`;
167
+ log.error(`🚫 [SECURITY] ${reason}`);
168
+ await audit.security("user_id_mismatch", "critical", {
169
+ tool: toolName,
170
+ session_id: sessionContext.sessionId,
171
+ provided_user: argValue,
172
+ session_user: sessionContext.userId,
173
+ });
174
+ return { allowed: false, reason };
175
+ }
176
+ }
177
+ // Mask sensitive values in sanitized args for logging
178
+ if (["password", "secret", "key", "credential", "auth_token"].includes(param)) {
179
+ sanitizedArgs[param] = "[REDACTED]";
180
+ }
181
+ }
182
+ }
183
+ // 4. Log successful validation
184
+ log.info(`✅ Tool validated: ${toolName}`);
185
+ await audit.tool(toolName, sanitizedArgs, true, 0, "pre_validation_passed");
186
+ return { allowed: true, sanitizedArgs };
187
+ }
188
+ /**
189
+ * Generate a secure session token
190
+ */
191
+ export function generateSessionToken() {
192
+ return crypto.randomBytes(32).toString("base64url");
193
+ }
194
+ export function validateAuthHeaders(headers) {
195
+ const authHeader = headers["authorization"] || headers["x-mcp-auth"];
196
+ const clientId = headers["x-client-id"];
197
+ if (!authHeader) {
198
+ return { authenticated: false, error: "No authorization header" };
199
+ }
200
+ // Support Bearer token format
201
+ const bearerMatch = authHeader.match(/^Bearer\s+(.+)$/i);
202
+ if (bearerMatch) {
203
+ const token = bearerMatch[1];
204
+ // In production, validate token against stored tokens
205
+ // For now, we accept any valid-looking token
206
+ if (token.length >= 32) {
207
+ return {
208
+ authenticated: true,
209
+ userId: `user_${crypto.createHash("sha256").update(token).digest("hex").slice(0, 8)}`,
210
+ clientId: clientId,
211
+ permissions: ["read", "write"], // Authenticated users get read/write
212
+ };
213
+ }
214
+ }
215
+ // Support API key format
216
+ const apiKeyMatch = authHeader.match(/^ApiKey\s+(.+)$/i);
217
+ if (apiKeyMatch) {
218
+ const apiKey = apiKeyMatch[1];
219
+ if (apiKey.length >= 32) {
220
+ return {
221
+ authenticated: true,
222
+ userId: `api_${crypto.createHash("sha256").update(apiKey).digest("hex").slice(0, 8)}`,
223
+ clientId: clientId,
224
+ permissions: ["read", "write", "admin"], // API keys get full access
225
+ };
226
+ }
227
+ }
228
+ return { authenticated: false, error: "Invalid authorization format" };
229
+ }
230
+ /**
231
+ * Middleware to wrap tool handlers with before_tool_callback
232
+ */
233
+ export function withToolValidation(toolName, handler, getSessionContext) {
234
+ return (async (...args) => {
235
+ const sessionContext = getSessionContext();
236
+ // Extract args object (usually first parameter)
237
+ const toolArgs = args[0] || {};
238
+ // Run before_tool_callback
239
+ const validation = await beforeToolCallback({
240
+ toolName,
241
+ args: toolArgs,
242
+ sessionContext,
243
+ });
244
+ if (!validation.allowed) {
245
+ return {
246
+ success: false,
247
+ error: `Security validation failed: ${validation.reason}`,
248
+ };
249
+ }
250
+ // Execute the actual handler
251
+ return handler(...args);
252
+ });
253
+ }
254
+ /**
255
+ * Get all active session contexts (for admin/debugging)
256
+ */
257
+ export function getActiveSessionContexts() {
258
+ return Array.from(sessionContexts.values());
259
+ }
260
+ /**
261
+ * Clean up expired session contexts
262
+ */
263
+ export function cleanupExpiredContexts(maxAgeMs = 8 * 60 * 60 * 1000) {
264
+ const now = Date.now();
265
+ let cleaned = 0;
266
+ for (const [sessionId, context] of sessionContexts.entries()) {
267
+ if (now - context.lastActivity.getTime() > maxAgeMs) {
268
+ sessionContexts.delete(sessionId);
269
+ cleaned++;
270
+ }
271
+ }
272
+ if (cleaned > 0) {
273
+ log.info(`🧹 Cleaned up ${cleaned} expired session contexts`);
274
+ }
275
+ return cleaned;
276
+ }
277
+ //# sourceMappingURL=tool-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-validation.js","sourceRoot":"","sources":["../../src/utils/tool-validation.ts"],"names":[],"mappings":"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"}