Skip to content

Commit 0e8c530

Browse files
Add validation for user-defined JsonSerializerOptions.
1 parent 75967d8 commit 0e8c530

File tree

3 files changed

+14
-0
lines changed

3 files changed

+14
-0
lines changed

src/ModelContextProtocol/Client/McpClientExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ public static Task<GetPromptResult> GetPromptAsync(
188188
Throw.IfNull(client);
189189
Throw.IfNullOrWhiteSpace(name);
190190
serializerOptions ??= McpJsonUtilities.DefaultOptions;
191+
McpJsonUtilities.ValidateSerializerOptions(serializerOptions);
191192
var parametersTypeInfo = serializerOptions.GetTypeInfo<IReadOnlyDictionary<string, object?>>();
192193

193194
return client.SendRequestAsync(
@@ -454,6 +455,7 @@ public static Task<CallToolResponse> CallToolAsync(
454455
Throw.IfNull(client);
455456
Throw.IfNull(toolName);
456457
serializerOptions ??= McpJsonUtilities.DefaultOptions;
458+
McpJsonUtilities.ValidateSerializerOptions(serializerOptions);
457459
var parametersTypeInfo = serializerOptions.GetTypeInfo<IReadOnlyDictionary<string, object?>>();
458460

459461
return client.SendRequestAsync(

src/ModelContextProtocol/McpEndpointExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public static Task<TResult> SendRequestAsync<TParameters, TResult>(
7575
where TResult : notnull
7676
{
7777
serializerOptions ??= McpJsonUtilities.DefaultOptions;
78+
McpJsonUtilities.ValidateSerializerOptions(serializerOptions);
7879
JsonTypeInfo<TParameters> paramsTypeInfo = serializerOptions.GetTypeInfo<TParameters>();
7980
JsonTypeInfo<TResult> resultTypeInfo = serializerOptions.GetTypeInfo<TResult>();
8081
return SendRequestAsync(endpoint, method, parameters, paramsTypeInfo, resultTypeInfo, requestId, cancellationToken);
@@ -132,6 +133,7 @@ public static Task SendNotificationAsync<TParameters>(
132133
CancellationToken cancellationToken = default)
133134
{
134135
serializerOptions ??= McpJsonUtilities.DefaultOptions;
136+
McpJsonUtilities.ValidateSerializerOptions(serializerOptions);
135137
JsonTypeInfo<TParameters> parametersTypeInfo = serializerOptions.GetTypeInfo<TParameters>();
136138
return SendNotificationAsync(endpoint, method, parameters, parametersTypeInfo, cancellationToken);
137139
}

src/ModelContextProtocol/Utils/Json/McpJsonUtilities.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ private static JsonSerializerOptions CreateDefaultOptions()
7474
internal static JsonTypeInfo<T> GetTypeInfo<T>(this JsonSerializerOptions options) =>
7575
(JsonTypeInfo<T>)options.GetTypeInfo(typeof(T));
7676

77+
internal static void ValidateSerializerOptions(JsonSerializerOptions options)
78+
{
79+
if (options.WriteIndented)
80+
{
81+
throw new InvalidOperationException("JsonSerializerOptions.WriteIndented is not supported for JSON-RPC workloads.");
82+
}
83+
84+
options.MakeReadOnly();
85+
}
86+
7787
internal static JsonElement DefaultMcpToolSchema { get; } = ParseJsonElement("""{"type":"object"}"""u8);
7888
internal static object? AsObject(this JsonElement element) => element.ValueKind is JsonValueKind.Null ? null : element;
7989

0 commit comments

Comments
 (0)