* Logging
Fixed bug in stdio transport argument promotion

* Logging
Fixed bug in stdio transport argument promotion

* Version bump
This commit is contained in:
Peder Holdgaard Pedersen 2025-01-09 19:39:11 +01:00 • committed by GitHub
commit 4b8df6638e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 674 additions and 298 deletions

View file

@ -1,6 +1,8 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using McpDotNet.Protocol.Messages;
using Microsoft.Extensions.Logging;
using McpDotNet.Logging;
namespace McpDotNet.Utils.Json;
@ -9,11 +11,19 @@ namespace McpDotNet.Utils.Json;
/// </summary>
internal class JsonRpcMessageConverter : JsonConverter<IJsonRpcMessage>
{
private readonly ILogger<JsonRpcMessageConverter> _logger;
public JsonRpcMessageConverter(ILogger<JsonRpcMessageConverter> logger)
{
_logger = logger;
}
/// <inheritdoc/>
public override IJsonRpcMessage? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
_logger.JsonRpcMessageConverterExpectedStartObjectToken();
throw new JsonException("Expected StartObject token");
}
@ -24,6 +34,7 @@ internal class JsonRpcMessageConverter : JsonConverter<IJsonRpcMessage>
if (!root.TryGetProperty("jsonrpc", out var versionProperty) ||
versionProperty.GetString() != "2.0")
{
_logger.JsonRpcMessageConverterInvalidJsonRpcVersion();
throw new JsonException("Invalid or missing jsonrpc version");
}
@ -40,26 +51,32 @@ internal class JsonRpcMessageConverter : JsonConverter<IJsonRpcMessage>
// Messages with an error property are error responses
if (hasError)
{
_logger.JsonRpcMessageConverterDeserializingErrorResponse(rawText);
return JsonSerializer.Deserialize<JsonRpcError>(rawText, options);
}
// Messages with a result property are success responses
else if (root.TryGetProperty("result", out _))
{
_logger.JsonRpcMessageConverterDeserializingResponse(rawText);
return JsonSerializer.Deserialize<JsonRpcResponse>(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<JsonRpcNotification>(rawText, options);
}
// Messages with both method and id are requests
else if (hasMethod && hasId)
{
_logger.JsonRpcMessageConverterDeserializingRequest(rawText);
return JsonSerializer.Deserialize<JsonRpcRequest>(rawText, options);
}
_logger.JsonRpcMessageConverterInvalidMessageFormat(rawText);
throw new JsonException("Invalid JSON-RPC message format");
}
@ -81,6 +98,7 @@ internal class JsonRpcMessageConverter : JsonConverter<IJsonRpcMessage>
JsonSerializer.Serialize(writer, error, options);
break;
default:
_logger.JsonRpcMessageConverterWriteUnknownMessageType(value.GetType().ToString());
throw new JsonException($"Unknown JSON-RPC message type: {value.GetType()}");
}
}

View file

@ -1,4 +1,5 @@
using System.Text.Json;
using Microsoft.Extensions.Logging;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace McpDotNet.Utils.Json;
@ -11,11 +12,12 @@ internal static class JsonSerializerOptionsExtensions
/// Configures JsonSerializerOptions with MCP-specific settings and converters.
/// </summary>
/// <param name="options">The options to configure.</param>
/// <param name="loggerFactory">The logger factory to use for logging.</param>
/// <returns>The configured options.</returns>
public static JsonSerializerOptions ConfigureForMcp(this JsonSerializerOptions options)
public static JsonSerializerOptions ConfigureForMcp(this JsonSerializerOptions options, ILoggerFactory loggerFactory)
{
// Add custom converters
options.Converters.Add(new JsonRpcMessageConverter());
options.Converters.Add(new JsonRpcMessageConverter(loggerFactory.CreateLogger<JsonRpcMessageConverter>()));
options.Converters.Add(new JsonStringEnumConverter());
// Configure general options