72 lines
3.3 KiB
C#
72 lines
3.3 KiB
C#
using ModelContextProtocol.Protocol.Messages;
|
|
using ModelContextProtocol.Protocol.Types;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Text.Json;
|
|
using System.Text.Json.Nodes;
|
|
using System.Text.Json.Serialization;
|
|
using System.Text.Json.Serialization.Metadata;
|
|
|
|
namespace ModelContextProtocol.Utils.Json;
|
|
|
|
/// <summary>
|
|
/// Extensions for configuring System.Text.Json serialization options for MCP.
|
|
/// </summary>
|
|
internal static partial class JsonSerializerOptionsExtensions
|
|
{
|
|
public static JsonSerializerOptions DefaultOptions { get; } = CreateDefaultOptions();
|
|
|
|
/// <summary>
|
|
/// Creates default options to use for MCP-related serialization.
|
|
/// </summary>
|
|
/// <returns>The configured options.</returns>
|
|
[UnconditionalSuppressMessage("AotAnalysis", "IL3050", Justification = "DefaultJsonTypeInfoResolver is only used when reflection-based serialization is enabled")]
|
|
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "DefaultJsonTypeInfoResolver is only used when reflection-based serialization is enabled")]
|
|
private static JsonSerializerOptions CreateDefaultOptions()
|
|
{
|
|
// If reflection-based serialization is enabled by default, use it, as it's the most permissive in terms of what it can serialize,
|
|
// and we want to be flexible in terms of what can be put into the various collections in the object model.
|
|
// Otherwise, use the source-generated options to enable trimming and Native AOT.
|
|
|
|
if (JsonSerializer.IsReflectionEnabledByDefault)
|
|
{
|
|
// Keep in sync with the JsonSourceGenerationOptions attribute on JsonContext below.
|
|
JsonSerializerOptions options = new(JsonSerializerDefaults.Web)
|
|
{
|
|
TypeInfoResolver = new DefaultJsonTypeInfoResolver(),
|
|
Converters = { new JsonStringEnumConverter() },
|
|
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
|
|
NumberHandling = JsonNumberHandling.AllowReadingFromString
|
|
};
|
|
|
|
options.MakeReadOnly();
|
|
return options;
|
|
}
|
|
|
|
return JsonContext.Default.Options;
|
|
}
|
|
|
|
internal static JsonTypeInfo<T> GetTypeInfo<T>(this JsonSerializerOptions options) =>
|
|
(JsonTypeInfo<T>)options.GetTypeInfo(typeof(T));
|
|
|
|
// Keep in sync with CreateDefaultOptions above.
|
|
[JsonSourceGenerationOptions(JsonSerializerDefaults.Web,
|
|
UseStringEnumConverter = true,
|
|
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
|
|
NumberHandling = JsonNumberHandling.AllowReadingFromString)]
|
|
[JsonSerializable(typeof(JsonDocument))]
|
|
[JsonSerializable(typeof(JsonElement))]
|
|
[JsonSerializable(typeof(JsonNode))]
|
|
[JsonSerializable(typeof(IJsonRpcMessage))]
|
|
[JsonSerializable(typeof(JsonRpcRequest))]
|
|
[JsonSerializable(typeof(JsonRpcNotification))]
|
|
[JsonSerializable(typeof(JsonRpcResponse))]
|
|
[JsonSerializable(typeof(JsonRpcError))]
|
|
[JsonSerializable(typeof(ServerCapabilities))]
|
|
[JsonSerializable(typeof(Implementation))]
|
|
[JsonSerializable(typeof(CreateMessageResult))]
|
|
[JsonSerializable(typeof(ListRootsResult))]
|
|
[JsonSerializable(typeof(InitializeResult))]
|
|
[JsonSerializable(typeof(JsonSchema))]
|
|
[JsonSerializable(typeof(CallToolResponse))]
|
|
internal sealed partial class JsonContext : JsonSerializerContext;
|
|
}
|