@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.
- package/LICENSE +21 -0
- package/README.md +289 -0
- package/SECURITY.md +539 -0
- package/dist/auth/auth-manager.d.ts +137 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +984 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/mcp-auth.d.ts +102 -0
- package/dist/auth/mcp-auth.d.ts.map +1 -0
- package/dist/auth/mcp-auth.js +286 -0
- package/dist/auth/mcp-auth.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/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +70 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +279 -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/resources/resource-handlers.d.ts +22 -0
- package/dist/resources/resource-handlers.d.ts.map +1 -0
- package/dist/resources/resource-handlers.js +216 -0
- package/dist/resources/resource-handlers.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 +621 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +77 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +314 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-timeout.d.ts +122 -0
- package/dist/session/session-timeout.d.ts.map +1 -0
- package/dist/session/session-timeout.js +281 -0
- package/dist/session/session-timeout.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/definitions/ask-question.d.ts +8 -0
- package/dist/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/tools/definitions/ask-question.js +211 -0
- package/dist/tools/definitions/ask-question.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-management.js +243 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -0
- package/dist/tools/definitions/session-management.d.ts +3 -0
- package/dist/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/tools/definitions/session-management.js +41 -0
- package/dist/tools/definitions/session-management.js.map +1 -0
- package/dist/tools/definitions/system.d.ts +3 -0
- package/dist/tools/definitions/system.d.ts.map +1 -0
- package/dist/tools/definitions/system.js +143 -0
- package/dist/tools/definitions/system.js.map +1 -0
- package/dist/tools/definitions.d.ts +12 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +26 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +213 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +813 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -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/audit-logger.d.ts +140 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +361 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cert-pinning.d.ts +97 -0
- package/dist/utils/cert-pinning.d.ts.map +1 -0
- package/dist/utils/cert-pinning.js +328 -0
- package/dist/utils/cert-pinning.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/cli-handler.d.ts +16 -0
- package/dist/utils/cli-handler.d.ts.map +1 -0
- package/dist/utils/cli-handler.js +102 -0
- package/dist/utils/cli-handler.js.map +1 -0
- package/dist/utils/crypto.d.ts +175 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +612 -0
- package/dist/utils/crypto.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 +405 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/response-validator.d.ts +98 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js +352 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/secrets-scanner.d.ts +126 -0
- package/dist/utils/secrets-scanner.d.ts.map +1 -0
- package/dist/utils/secrets-scanner.js +443 -0
- package/dist/utils/secrets-scanner.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +130 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +279 -0
- package/dist/utils/secure-memory.js.map +1 -0
- package/dist/utils/security.d.ts +83 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +272 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +37 -0
- package/dist/utils/settings-manager.d.ts.map +1 -0
- package/dist/utils/settings-manager.js +125 -0
- package/dist/utils/settings-manager.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/dist/utils/tool-validation.d.ts +93 -0
- package/dist/utils/tool-validation.d.ts.map +1 -0
- package/dist/utils/tool-validation.js +277 -0
- package/dist/utils/tool-validation.js.map +1 -0
- package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
- package/docs/configuration.md +94 -0
- package/docs/tools.md +34 -0
- package/docs/troubleshooting.md +59 -0
- package/docs/usage-guide.md +245 -0
- 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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"}
|