diff --git a/src/mcpdotnet/Logging/Log.cs b/src/mcpdotnet/Logging/Log.cs index 771e633..9a38b83 100644 --- a/src/mcpdotnet/Logging/Log.cs +++ b/src/mcpdotnet/Logging/Log.cs @@ -266,33 +266,6 @@ internal static partial class Log [LoggerMessage(Level = LogLevel.Information, Message = "Transport cleaned up for {endpointName}")] internal static partial void TransportCleanedUp(this ILogger logger, string endpointName); - [LoggerMessage(Level = LogLevel.Error, Message = "JSON-RPC message start object token expected")] - internal static partial void JsonRpcMessageConverterExpectedStartObjectToken(this ILogger logger); - - [LoggerMessage(Level = LogLevel.Error, Message = "JSON-RPC message invalid version")] - internal static partial void JsonRpcMessageConverterInvalidJsonRpcVersion(this ILogger logger); - - [LoggerMessage(Level = LogLevel.Trace, Message = "JSON-RPC message deserializing error response: {rawText}")] - internal static partial void JsonRpcMessageConverterDeserializingErrorResponse(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Trace, Message = "JSON-RPC message deserializing response: {rawText}")] - internal static partial void JsonRpcMessageConverterDeserializingResponse(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Error, Message = "JSON-RPC message response must have result or error: {rawText}")] - internal static partial void JsonRpcMessageConverterResponseMustHaveResultOrError(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Trace, Message = "JSON-RPC message deserializing notification: {rawText}")] - internal static partial void JsonRpcMessageConverterDeserializingNotification(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Trace, Message = "JSON-RPC message deserializing request: {rawText}")] - internal static partial void JsonRpcMessageConverterDeserializingRequest(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Error, Message = "JSON-RPC message invalid format: {rawText}")] - internal static partial void JsonRpcMessageConverterInvalidMessageFormat(this ILogger logger, string rawText); - - [LoggerMessage(Level = LogLevel.Error, Message = "JSON-RPC message write unknown message type: {type}")] - internal static partial void JsonRpcMessageConverterWriteUnknownMessageType(this ILogger logger, string type); - [LoggerMessage(Level = LogLevel.Debug, Message = "Sending notification payload for {endpointName}: {payload}")] internal static partial void SendingNotificationPayload(this ILogger logger, string endpointName, string payload); diff --git a/src/mcpdotnet/Protocol/Transport/SseClientTransport.cs b/src/mcpdotnet/Protocol/Transport/SseClientTransport.cs index 8ccf1a5..4340fde 100644 --- a/src/mcpdotnet/Protocol/Transport/SseClientTransport.cs +++ b/src/mcpdotnet/Protocol/Transport/SseClientTransport.cs @@ -44,7 +44,7 @@ public sealed class SseClientTransport : TransportBase, IClientTransport _httpClient = new HttpClient(); _connectionCts = new CancellationTokenSource(); _logger = loggerFactory.CreateLogger(); - _jsonOptions = new JsonSerializerOptions().ConfigureForMcp(loggerFactory); + _jsonOptions = JsonSerializerOptionsExtensions.DefaultOptions; _connectionEstablished = new TaskCompletionSource(); } diff --git a/src/mcpdotnet/Protocol/Transport/StdioClientTransport.cs b/src/mcpdotnet/Protocol/Transport/StdioClientTransport.cs index c015575..7a594ee 100644 --- a/src/mcpdotnet/Protocol/Transport/StdioClientTransport.cs +++ b/src/mcpdotnet/Protocol/Transport/StdioClientTransport.cs @@ -36,7 +36,7 @@ public sealed class StdioClientTransport : TransportBase, IClientTransport _options = options; _serverConfig = serverConfig; _logger = loggerFactory.CreateLogger(); - _jsonOptions = new JsonSerializerOptions().ConfigureForMcp(loggerFactory); + _jsonOptions = JsonSerializerOptionsExtensions.DefaultOptions; } /// diff --git a/src/mcpdotnet/Protocol/Transport/StdioServerTransport.cs b/src/mcpdotnet/Protocol/Transport/StdioServerTransport.cs index 7a7feb7..f3744a9 100644 --- a/src/mcpdotnet/Protocol/Transport/StdioServerTransport.cs +++ b/src/mcpdotnet/Protocol/Transport/StdioServerTransport.cs @@ -40,7 +40,7 @@ public sealed class StdioServerTransport : TransportBase, IServerTransport { _serverName = serverName; _logger = loggerFactory.CreateLogger(); - _jsonOptions = new JsonSerializerOptions().ConfigureForMcp(loggerFactory); + _jsonOptions = JsonSerializerOptionsExtensions.DefaultOptions; } /// diff --git a/src/mcpdotnet/Shared/McpJsonRpcEndpoint.cs b/src/mcpdotnet/Shared/McpJsonRpcEndpoint.cs index 7c0f57f..0e5cfa5 100644 --- a/src/mcpdotnet/Shared/McpJsonRpcEndpoint.cs +++ b/src/mcpdotnet/Shared/McpJsonRpcEndpoint.cs @@ -37,7 +37,7 @@ internal abstract class McpJsonRpcEndpoint _pendingRequests = new(); _notificationHandlers = new(); _nextRequestId = 1; - _jsonOptions = new JsonSerializerOptions().ConfigureForMcp(loggerFactory); + _jsonOptions = JsonSerializerOptionsExtensions.DefaultOptions; _logger = loggerFactory.CreateLogger(); } diff --git a/src/mcpdotnet/Utils/Json/JsonRpcMessageConverter.cs b/src/mcpdotnet/Utils/Json/JsonRpcMessageConverter.cs index 930d8ae..32b49c2 100644 --- a/src/mcpdotnet/Utils/Json/JsonRpcMessageConverter.cs +++ b/src/mcpdotnet/Utils/Json/JsonRpcMessageConverter.cs @@ -9,21 +9,13 @@ namespace McpDotNet.Utils.Json; /// /// JSON converter for IJsonRpcMessage that handles polymorphic deserialization of different message types. /// -internal class JsonRpcMessageConverter : JsonConverter +internal sealed class JsonRpcMessageConverter : JsonConverter { - private readonly ILogger _logger; - - public JsonRpcMessageConverter(ILogger logger) - { - _logger = logger; - } - /// public override IJsonRpcMessage? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { - _logger.JsonRpcMessageConverterExpectedStartObjectToken(); throw new JsonException("Expected StartObject token"); } @@ -34,7 +26,6 @@ internal class JsonRpcMessageConverter : JsonConverter if (!root.TryGetProperty("jsonrpc", out var versionProperty) || versionProperty.GetString() != "2.0") { - _logger.JsonRpcMessageConverterInvalidJsonRpcVersion(); throw new JsonException("Invalid or missing jsonrpc version"); } @@ -51,32 +42,27 @@ internal class JsonRpcMessageConverter : JsonConverter // Messages with an error property are error responses if (hasError) { - _logger.JsonRpcMessageConverterDeserializingErrorResponse(rawText); return JsonSerializer.Deserialize(rawText, options); } // Messages with a result property are success responses else if (root.TryGetProperty("result", out _)) { - _logger.JsonRpcMessageConverterDeserializingResponse(rawText); return JsonSerializer.Deserialize(rawText, options); } - _logger.JsonRpcMessageConverterResponseMustHaveResultOrError(rawText); + throw new JsonException("Response must have either result or error"); } // Messages with a method but no id are notifications else if (hasMethod && !hasId) { - _logger.JsonRpcMessageConverterDeserializingNotification(rawText); return JsonSerializer.Deserialize(rawText, options); } // Messages with both method and id are requests else if (hasMethod && hasId) { - _logger.JsonRpcMessageConverterDeserializingRequest(rawText); return JsonSerializer.Deserialize(rawText, options); } - _logger.JsonRpcMessageConverterInvalidMessageFormat(rawText); throw new JsonException("Invalid JSON-RPC message format"); } @@ -98,7 +84,6 @@ internal class JsonRpcMessageConverter : JsonConverter JsonSerializer.Serialize(writer, error, options); break; default: - _logger.JsonRpcMessageConverterWriteUnknownMessageType(value.GetType().ToString()); throw new JsonException($"Unknown JSON-RPC message type: {value.GetType()}"); } } diff --git a/src/mcpdotnet/Utils/Json/JsonSerializerOptionsExtensions.cs b/src/mcpdotnet/Utils/Json/JsonSerializerOptionsExtensions.cs index 1b24c6b..2a5f253 100644 --- a/src/mcpdotnet/Utils/Json/JsonSerializerOptionsExtensions.cs +++ b/src/mcpdotnet/Utils/Json/JsonSerializerOptionsExtensions.cs @@ -3,21 +3,24 @@ using System.Text.Json; using System.Text.Json.Serialization; namespace McpDotNet.Utils.Json; + /// /// Extensions for configuring System.Text.Json serialization options for MCP. /// internal static class JsonSerializerOptionsExtensions { + public static JsonSerializerOptions DefaultOptions { get; } = CreateDefaultOptions(); + /// - /// Configures JsonSerializerOptions with MCP-specific settings and converters. + /// Creates default options to use for MCP-related serialization. /// - /// The options to configure. - /// The logger factory to use for logging. /// The configured options. - public static JsonSerializerOptions ConfigureForMcp(this JsonSerializerOptions options, ILoggerFactory loggerFactory) + private static JsonSerializerOptions CreateDefaultOptions() { + JsonSerializerOptions options = new(); + // Add custom converters - options.Converters.Add(new JsonRpcMessageConverter(loggerFactory.CreateLogger())); + options.Converters.Add(new JsonRpcMessageConverter()); options.Converters.Add(new JsonStringEnumConverter()); // Configure general options