@@ -158,11 +158,11 @@ public static IChatClient AsSamplingChatClient(this IMcpServer server)
158158 /// <summary>Gets an <see cref="ILogger"/> on which logged messages will be sent as notifications to the client.</summary>
159159 /// <param name="server">The server to wrap as an <see cref="ILogger"/>.</param>
160160 /// <returns>An <see cref="ILogger"/> that can be used to log to the client..</returns>
161- public static ILogger AsClientLogger ( this IMcpServer server )
161+ public static ILoggerProvider AsClientLoggerProvider ( this IMcpServer server )
162162 {
163163 Throw . IfNull ( server ) ;
164164
165- return new ClientLogger ( server ) ;
165+ return new ClientLoggerProvider ( server ) ;
166166 }
167167
168168 /// <summary>
@@ -224,40 +224,54 @@ void IDisposable.Dispose() { } // nop
224224 }
225225
226226 /// <summary>
227- /// Provides an <see cref="ILogger "/> implementation for sending logging message notifications
228- /// to the client for logged messages.
227+ /// Provides an <see cref="ILoggerProvider "/> implementation for creating loggers
228+ /// that send logging message notifications to the client for logged messages.
229229 /// </summary>
230- private sealed class ClientLogger ( IMcpServer server ) : ILogger
230+ private sealed class ClientLoggerProvider ( IMcpServer server ) : ILoggerProvider
231231 {
232232 /// <inheritdoc />
233- public IDisposable ? BeginScope < TState > ( TState state ) where TState : notnull =>
234- null ;
233+ public ILogger CreateLogger ( string categoryName )
234+ {
235+ Throw . IfNull ( categoryName ) ;
235236
236- /// <inheritdoc />
237- public bool IsEnabled ( LogLevel logLevel ) =>
238- server ? . LoggingLevel is { } loggingLevel &&
239- McpServer . ToLoggingLevel ( logLevel ) >= loggingLevel ;
237+ return new ClientLogger ( server , categoryName ) ;
238+ }
240239
241240 /// <inheritdoc />
242- public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception ? exception , Func < TState , Exception ? , string > formatter )
241+ void IDisposable . Dispose ( ) { }
242+
243+ private sealed class ClientLogger ( IMcpServer server , string categoryName ) : ILogger
243244 {
244- if ( ! IsEnabled ( logLevel ) )
245+ /// <inheritdoc />
246+ public IDisposable ? BeginScope < TState > ( TState state ) where TState : notnull =>
247+ null ;
248+
249+ /// <inheritdoc />
250+ public bool IsEnabled ( LogLevel logLevel ) =>
251+ server ? . LoggingLevel is { } loggingLevel &&
252+ McpServer . ToLoggingLevel ( logLevel ) >= loggingLevel ;
253+
254+ /// <inheritdoc />
255+ public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception ? exception , Func < TState , Exception ? , string > formatter )
245256 {
246- return ;
247- }
257+ if ( ! IsEnabled ( logLevel ) )
258+ {
259+ return ;
260+ }
248261
249- Throw . IfNull ( formatter ) ;
262+ Throw . IfNull ( formatter ) ;
250263
251- Log ( logLevel , formatter ( state , exception ) ) ;
264+ Log ( logLevel , formatter ( state , exception ) ) ;
252265
253- void Log ( LogLevel logLevel , string message )
254- {
255- _ = server . SendNotificationAsync ( NotificationMethods . LoggingMessageNotification , new LoggingMessageNotificationParams ( )
266+ void Log ( LogLevel logLevel , string message )
256267 {
257- Level = McpServer . ToLoggingLevel ( logLevel ) ,
258- Data = JsonSerializer . SerializeToElement ( message , McpJsonUtilities . JsonContext . Default . String ) ,
259- Logger = eventId . Name ,
260- } ) ;
268+ _ = server . SendNotificationAsync ( NotificationMethods . LoggingMessageNotification , new LoggingMessageNotificationParams ( )
269+ {
270+ Level = McpServer . ToLoggingLevel ( logLevel ) ,
271+ Data = JsonSerializer . SerializeToElement ( message , McpJsonUtilities . JsonContext . Default . String ) ,
272+ Logger = categoryName ,
273+ } ) ;
274+ }
261275 }
262276 }
263277 }
0 commit comments