Logging (#11)
* Logging Fixed bug in stdio transport argument promotion * Logging Fixed bug in stdio transport argument promotion * Version bump
This commit is contained in:
parent
67bcba5af4
commit
4b8df6638e
2 changed files with 674 additions and 298 deletions
|
|
@ -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()}");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue