Skip to content

Commit 8da94b1

Browse files
committed
Address feedback
1 parent 8cdc282 commit 8da94b1

File tree

3 files changed

+69
-30
lines changed

3 files changed

+69
-30
lines changed

src/ModelContextProtocol/Server/McpServer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,10 +489,10 @@ internal static LoggingLevel ToLoggingLevel(LogLevel level) =>
489489
{
490490
LogLevel.Trace => Protocol.Types.LoggingLevel.Debug,
491491
LogLevel.Debug => Protocol.Types.LoggingLevel.Debug,
492+
LogLevel.Information => Protocol.Types.LoggingLevel.Info,
492493
LogLevel.Warning => Protocol.Types.LoggingLevel.Warning,
493494
LogLevel.Error => Protocol.Types.LoggingLevel.Error,
494495
LogLevel.Critical => Protocol.Types.LoggingLevel.Critical,
495-
LogLevel.Information => Protocol.Types.LoggingLevel.Info,
496-
_ => Protocol.Types.LoggingLevel.Debug,
496+
_ => Protocol.Types.LoggingLevel.Emergency,
497497
};
498498
}

src/ModelContextProtocol/Server/McpServerExtensions.cs

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,11 +379,16 @@ public async Task WithDescription_ChangesToolDescription()
379379
}
380380

381381
[Fact]
382-
public async Task AsClientLogger_MessagesSentToClient()
382+
public async Task AsClientLoggerProvider_MessagesSentToClient()
383383
{
384384
IMcpClient client = await CreateMcpClientForServer();
385385

386-
ILogger logger = _server.AsClientLogger();
386+
ILoggerProvider loggerProvider = _server.AsClientLoggerProvider();
387+
Assert.Throws<ArgumentNullException>("categoryName", () => loggerProvider.CreateLogger(null!));
388+
389+
ILogger logger = loggerProvider.CreateLogger("TestLogger");
390+
Assert.NotNull(logger);
391+
387392
Assert.Null(logger.BeginScope(""));
388393

389394
Assert.Null(_server.LoggingLevel);
@@ -433,9 +438,29 @@ public async Task AsClientLogger_MessagesSentToClient()
433438
var m = await channel.Reader.ReadAsync(TestContext.Current.CancellationToken);
434439
Assert.NotNull(m);
435440
Assert.NotNull(m.Data);
436-
437-
string? s = JsonSerializer.Deserialize<string>(m.Data.Value);
441+
442+
Assert.Equal("TestLogger", m.Logger);
443+
444+
string ? s = JsonSerializer.Deserialize<string>(m.Data.Value);
438445
Assert.NotNull(s);
446+
447+
if (s.Contains("Information"))
448+
{
449+
Assert.Equal(LoggingLevel.Info, m.Level);
450+
}
451+
else if (s.Contains("Warning"))
452+
{
453+
Assert.Equal(LoggingLevel.Warning, m.Level);
454+
}
455+
else if (s.Contains("Error"))
456+
{
457+
Assert.Equal(LoggingLevel.Error, m.Level);
458+
}
459+
else if (s.Contains("Critical"))
460+
{
461+
Assert.Equal(LoggingLevel.Critical, m.Level);
462+
}
463+
439464
data.Add(s);
440465
}
441466

0 commit comments

Comments
 (0)