11import fs from "fs/promises" ;
22import type { MongoLogId , MongoLogWriter } from "mongodb-log-writer" ;
33import { mongoLogId , MongoLogManager } from "mongodb-log-writer" ;
4- import redact from "mongodb-redact" ;
4+ import { redact } from "mongodb-redact" ;
55import type { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js" ;
66import { EventEmitter } from "events" ;
77import type { Server } from "../lib.js" ;
8+ import type { Keychain } from "./keychain.js" ;
89
910export type LogLevel = LoggingMessageNotification [ "params" ] [ "level" ] ;
1011
@@ -84,6 +85,10 @@ type DefaultEventMap = [never];
8485export abstract class LoggerBase < T extends EventMap < T > = DefaultEventMap > extends EventEmitter < T > {
8586 private readonly defaultUnredactedLogger : LoggerType = "mcp" ;
8687
88+ constructor ( private readonly keychain : Keychain | undefined ) {
89+ super ( ) ;
90+ }
91+
8792 public log ( level : LogLevel , payload : LogPayload ) : void {
8893 // If no explicit value is supplied for unredacted loggers, default to "mcp"
8994 const noRedaction = payload . noRedaction !== undefined ? payload . noRedaction : this . defaultUnredactedLogger ;
@@ -122,7 +127,7 @@ export abstract class LoggerBase<T extends EventMap<T> = DefaultEventMap> extend
122127 return message ;
123128 }
124129
125- return redact ( message ) ;
130+ return redact ( message , this . keychain ?. allSecrets ?? [ ] ) ;
126131 }
127132
128133 public info ( payload : LogPayload ) : void {
@@ -180,6 +185,10 @@ export abstract class LoggerBase<T extends EventMap<T> = DefaultEventMap> extend
180185export class ConsoleLogger extends LoggerBase {
181186 protected readonly type : LoggerType = "console" ;
182187
188+ public constructor ( keychain : Keychain ) {
189+ super ( keychain ) ;
190+ }
191+
183192 protected logCore ( level : LogLevel , payload : LogPayload ) : void {
184193 const { id, context, message } = payload ;
185194 console . error (
@@ -201,8 +210,8 @@ export class DiskLogger extends LoggerBase<{ initialized: [] }> {
201210 private bufferedMessages : { level : LogLevel ; payload : LogPayload } [ ] = [ ] ;
202211 private logWriter ?: MongoLogWriter ;
203212
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 ) ;
206215
207216 void this . initialize ( logPath , onError ) ;
208217 }
@@ -262,8 +271,11 @@ export class McpLogger extends LoggerBase {
262271 "emergency" ,
263272 ] as const ;
264273
265- public constructor ( private readonly server : Server ) {
266- super ( ) ;
274+ public constructor (
275+ private readonly server : Server ,
276+ keychain : Keychain
277+ ) {
278+ super ( keychain ) ;
267279 }
268280
269281 protected readonly type : LoggerType = "mcp" ;
@@ -295,7 +307,9 @@ export class CompositeLogger extends LoggerBase {
295307 private readonly attributes : Record < string , string > = { } ;
296308
297309 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 ) ;
299313
300314 this . loggers = loggers ;
301315 }
@@ -327,6 +341,10 @@ export class CompositeLogger extends LoggerBase {
327341export class NullLogger extends LoggerBase {
328342 protected type ?: LoggerType ;
329343
344+ constructor ( ) {
345+ super ( undefined ) ;
346+ }
347+
330348 protected logCore ( ) : void {
331349 // No-op logger, does not log anything
332350 }
0 commit comments