1
1
import fs from "fs/promises" ;
2
2
import type { MongoLogId , MongoLogWriter } from "mongodb-log-writer" ;
3
3
import { mongoLogId , MongoLogManager } from "mongodb-log-writer" ;
4
- import redact from "mongodb-redact" ;
4
+ import { redact } from "mongodb-redact" ;
5
5
import type { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js" ;
6
6
import { EventEmitter } from "events" ;
7
7
import type { Server } from "../lib.js" ;
8
+ import type { Keychain } from "./keychain.js" ;
8
9
9
10
export type LogLevel = LoggingMessageNotification [ "params" ] [ "level" ] ;
10
11
@@ -84,6 +85,10 @@ type DefaultEventMap = [never];
84
85
export abstract class LoggerBase < T extends EventMap < T > = DefaultEventMap > extends EventEmitter < T > {
85
86
private readonly defaultUnredactedLogger : LoggerType = "mcp" ;
86
87
88
+ constructor ( private readonly keychain : Keychain | undefined ) {
89
+ super ( ) ;
90
+ }
91
+
87
92
public log ( level : LogLevel , payload : LogPayload ) : void {
88
93
// If no explicit value is supplied for unredacted loggers, default to "mcp"
89
94
const noRedaction = payload . noRedaction !== undefined ? payload . noRedaction : this . defaultUnredactedLogger ;
@@ -122,7 +127,7 @@ export abstract class LoggerBase<T extends EventMap<T> = DefaultEventMap> extend
122
127
return message ;
123
128
}
124
129
125
- return redact ( message ) ;
130
+ return redact ( message , this . keychain ?. allSecrets ?? [ ] ) ;
126
131
}
127
132
128
133
public info ( payload : LogPayload ) : void {
@@ -180,6 +185,10 @@ export abstract class LoggerBase<T extends EventMap<T> = DefaultEventMap> extend
180
185
export class ConsoleLogger extends LoggerBase {
181
186
protected readonly type : LoggerType = "console" ;
182
187
188
+ public constructor ( keychain : Keychain ) {
189
+ super ( keychain ) ;
190
+ }
191
+
183
192
protected logCore ( level : LogLevel , payload : LogPayload ) : void {
184
193
const { id, context, message } = payload ;
185
194
console . error (
@@ -201,8 +210,8 @@ export class DiskLogger extends LoggerBase<{ initialized: [] }> {
201
210
private bufferedMessages : { level : LogLevel ; payload : LogPayload } [ ] = [ ] ;
202
211
private logWriter ?: MongoLogWriter ;
203
212
204
- public constructor ( logPath : string , onError : ( error : Error ) => void ) {
205
- super ( ) ;
213
+ public constructor ( logPath : string , onError : ( error : Error ) => void , keychain : Keychain ) {
214
+ super ( keychain ) ;
206
215
207
216
void this . initialize ( logPath , onError ) ;
208
217
}
@@ -262,8 +271,11 @@ export class McpLogger extends LoggerBase {
262
271
"emergency" ,
263
272
] as const ;
264
273
265
- public constructor ( private readonly server : Server ) {
266
- super ( ) ;
274
+ public constructor (
275
+ private readonly server : Server ,
276
+ keychain : Keychain
277
+ ) {
278
+ super ( keychain ) ;
267
279
}
268
280
269
281
protected readonly type : LoggerType = "mcp" ;
@@ -295,7 +307,9 @@ export class CompositeLogger extends LoggerBase {
295
307
private readonly attributes : Record < string , string > = { } ;
296
308
297
309
constructor ( ...loggers : LoggerBase [ ] ) {
298
- super ( ) ;
310
+ // composite logger does not redact, only the actual delegates do the work
311
+ // so we don't need the Keychain here
312
+ super ( undefined ) ;
299
313
300
314
this . loggers = loggers ;
301
315
}
@@ -327,6 +341,10 @@ export class CompositeLogger extends LoggerBase {
327
341
export class NullLogger extends LoggerBase {
328
342
protected type ?: LoggerType ;
329
343
344
+ constructor ( ) {
345
+ super ( undefined ) ;
346
+ }
347
+
330
348
protected logCore ( ) : void {
331
349
// No-op logger, does not log anything
332
350
}
0 commit comments