@@ -2,9 +2,9 @@ import fs from "fs/promises";
22import type { MongoLogId , MongoLogWriter } from "mongodb-log-writer" ;
33import { mongoLogId , MongoLogManager } from "mongodb-log-writer" ;
44import redact from "mongodb-redact" ;
5- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" ;
65import type { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js" ;
76import { EventEmitter } from "events" ;
7+ import type { Server } from "../lib.js" ;
88
99export type LogLevel = LoggingMessageNotification [ "params" ] [ "level" ] ;
1010
@@ -51,6 +51,8 @@ export const LogId = {
5151 streamableHttpTransportSessionCloseNotificationFailure : mongoLogId ( 1_006_004 ) ,
5252 streamableHttpTransportRequestFailure : mongoLogId ( 1_006_005 ) ,
5353 streamableHttpTransportCloseFailure : mongoLogId ( 1_006_006 ) ,
54+ streamableHttpTransportKeepAliveFailure : mongoLogId ( 1_006_007 ) ,
55+ streamableHttpTransportKeepAlive : mongoLogId ( 1_006_008 ) ,
5456
5557 exportCleanupError : mongoLogId ( 1_007_001 ) ,
5658 exportCreationError : mongoLogId ( 1_007_002 ) ,
@@ -64,7 +66,7 @@ export const LogId = {
6466 oidcFlow : mongoLogId ( 1_008_001 ) ,
6567} as const ;
6668
67- interface LogPayload {
69+ export interface LogPayload {
6870 id : MongoLogId ;
6971 context : string ;
7072 message : string ;
@@ -152,6 +154,26 @@ export abstract class LoggerBase<T extends EventMap<T> = DefaultEventMap> extend
152154 public emergency ( payload : LogPayload ) : void {
153155 this . log ( "emergency" , payload ) ;
154156 }
157+
158+ protected mapToMongoDBLogLevel ( level : LogLevel ) : "info" | "warn" | "error" | "debug" | "fatal" {
159+ switch ( level ) {
160+ case "info" :
161+ return "info" ;
162+ case "warning" :
163+ return "warn" ;
164+ case "error" :
165+ return "error" ;
166+ case "notice" :
167+ case "debug" :
168+ return "debug" ;
169+ case "critical" :
170+ case "alert" :
171+ case "emergency" :
172+ return "fatal" ;
173+ default :
174+ return "info" ;
175+ }
176+ }
155177}
156178
157179export class ConsoleLogger extends LoggerBase {
@@ -225,42 +247,40 @@ export class DiskLogger extends LoggerBase<{ initialized: [] }> {
225247
226248 this . logWriter [ mongoDBLevel ] ( "MONGODB-MCP" , id , context , message , payload . attributes ) ;
227249 }
228-
229- private mapToMongoDBLogLevel ( level : LogLevel ) : "info" | "warn" | "error" | "debug" | "fatal" {
230- switch ( level ) {
231- case "info" :
232- return "info" ;
233- case "warning" :
234- return "warn" ;
235- case "error" :
236- return "error" ;
237- case "notice" :
238- case "debug" :
239- return "debug" ;
240- case "critical" :
241- case "alert" :
242- case "emergency" :
243- return "fatal" ;
244- default :
245- return "info" ;
246- }
247- }
248250}
249251
250252export class McpLogger extends LoggerBase {
251- public constructor ( private readonly server : McpServer ) {
253+ private static readonly LOG_LEVELS : LogLevel [ ] = [
254+ "debug" ,
255+ "info" ,
256+ "notice" ,
257+ "warning" ,
258+ "error" ,
259+ "critical" ,
260+ "alert" ,
261+ "emergency" ,
262+ ] ;
263+
264+ public constructor ( private readonly server : Server ) {
252265 super ( ) ;
253266 }
254267
255268 protected readonly type : LoggerType = "mcp" ;
256269
257270 protected logCore ( level : LogLevel , payload : LogPayload ) : void {
258271 // Only log if the server is connected
259- if ( ! this . server ?. isConnected ( ) ) {
272+ if ( ! this . server . mcpServer . isConnected ( ) ) {
273+ return ;
274+ }
275+
276+ const minimumLevel = McpLogger . LOG_LEVELS . indexOf ( this . server . mcpLogLevel ) ;
277+ const currentLevel = McpLogger . LOG_LEVELS . indexOf ( level ) ;
278+ if ( minimumLevel > currentLevel ) {
279+ // Don't log if the requested level is lower than the minimum level
260280 return ;
261281 }
262282
263- void this . server . server . sendLoggingMessage ( {
283+ void this . server . mcpServer . server . sendLoggingMessage ( {
264284 level,
265285 data : `[${ payload . context } ]: ${ payload . message } ` ,
266286 } ) ;
@@ -286,7 +306,11 @@ export class CompositeLogger extends LoggerBase {
286306 public log ( level : LogLevel , payload : LogPayload ) : void {
287307 // Override the public method to avoid the base logger redacting the message payload
288308 for ( const logger of this . loggers ) {
289- logger . log ( level , { ...payload , attributes : { ...this . attributes , ...payload . attributes } } ) ;
309+ const attributes =
310+ Object . keys ( this . attributes ) . length > 0 || payload . attributes
311+ ? { ...this . attributes , ...payload . attributes }
312+ : undefined ;
313+ logger . log ( level , { ...payload , attributes } ) ;
290314 }
291315 }
292316
0 commit comments