Skip to content

Commit e1bd3f6

Browse files
committed
Eliminate some code smells
1 parent 441c895 commit e1bd3f6

3 files changed

Lines changed: 54 additions & 26 deletions

File tree

src/ModelContextProtocol.Core/Client/McpClientImpl.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,8 @@ private void RegisterTaskHandlers(RequestHandlers requestHandlers, IMcpTaskStore
489489
// Advertise task capabilities
490490
_options.Capabilities ??= new();
491491

492-
// Advertise MRTR support so servers can use IncompleteResult instead of legacy JSON-RPC requests.
492+
// Advertise MRTR support so servers can return IncompleteResult to request input inline
493+
// instead of sending separate server-to-client JSON-RPC requests.
493494
var experimental = _options.Capabilities.Experimental ??= new Dictionary<string, object>();
494495
experimental[MrtrContext.ExperimentalCapabilityKey] = new JsonObject();
495496
var tasksCapability = _options.Capabilities.Tasks ??= new McpTasksCapability();
@@ -559,10 +560,11 @@ private async Task<InputResponse> ResolveInputRequestAsync(InputRequest inputReq
559560
case RequestMethods.SamplingCreateMessage:
560561
if (_options.Handlers.SamplingHandler is { } samplingHandler)
561562
{
562-
var samplingParams = inputRequest.SamplingParams;
563+
var samplingParams = inputRequest.SamplingParams
564+
?? throw new McpException($"Failed to deserialize sampling parameters from MRTR input request.");
563565
var result = await samplingHandler(
564566
samplingParams,
565-
samplingParams?.ProgressToken is { } token ? new TokenProgress(this, token) : NullProgress.Instance,
567+
samplingParams.ProgressToken is { } token ? new TokenProgress(this, token) : NullProgress.Instance,
566568
cancellationToken).ConfigureAwait(false);
567569
return InputResponse.FromSamplingResult(result);
568570
}
@@ -573,7 +575,8 @@ private async Task<InputResponse> ResolveInputRequestAsync(InputRequest inputReq
573575
case RequestMethods.ElicitationCreate:
574576
if (_options.Handlers.ElicitationHandler is { } elicitationHandler)
575577
{
576-
var elicitParams = inputRequest.ElicitationParams;
578+
var elicitParams = inputRequest.ElicitationParams
579+
?? throw new McpException($"Failed to deserialize elicitation parameters from MRTR input request.");
577580
var result = await elicitationHandler(elicitParams, cancellationToken).ConfigureAwait(false);
578581
result = ElicitResult.WithDefaults(elicitParams, result);
579582
return InputResponse.FromElicitResult(result);
@@ -585,7 +588,8 @@ private async Task<InputResponse> ResolveInputRequestAsync(InputRequest inputReq
585588
case RequestMethods.RootsList:
586589
if (_options.Handlers.RootsHandler is { } rootsHandler)
587590
{
588-
var rootsParams = inputRequest.RootsParams;
591+
var rootsParams = inputRequest.RootsParams
592+
?? throw new McpException($"Failed to deserialize roots parameters from MRTR input request.");
589593
var result = await rootsHandler(rootsParams, cancellationToken).ConfigureAwait(false);
590594
return InputResponse.FromRootsResult(result);
591595
}

src/ModelContextProtocol.Core/Protocol/InputRequest.cs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,33 +86,45 @@ public sealed class InputRequest
8686
/// </summary>
8787
/// <param name="requestParams">The sampling request parameters.</param>
8888
/// <returns>A new <see cref="InputRequest"/> instance.</returns>
89-
public static InputRequest ForSampling(CreateMessageRequestParams requestParams) => new()
89+
public static InputRequest ForSampling(CreateMessageRequestParams requestParams)
9090
{
91-
Method = RequestMethods.SamplingCreateMessage,
92-
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.CreateMessageRequestParams),
93-
};
91+
Throw.IfNull(requestParams);
92+
return new()
93+
{
94+
Method = RequestMethods.SamplingCreateMessage,
95+
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.CreateMessageRequestParams),
96+
};
97+
}
9498

9599
/// <summary>
96100
/// Creates an <see cref="InputRequest"/> for an elicitation request.
97101
/// </summary>
98102
/// <param name="requestParams">The elicitation request parameters.</param>
99103
/// <returns>A new <see cref="InputRequest"/> instance.</returns>
100-
public static InputRequest ForElicitation(ElicitRequestParams requestParams) => new()
104+
public static InputRequest ForElicitation(ElicitRequestParams requestParams)
101105
{
102-
Method = RequestMethods.ElicitationCreate,
103-
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.ElicitRequestParams),
104-
};
106+
Throw.IfNull(requestParams);
107+
return new()
108+
{
109+
Method = RequestMethods.ElicitationCreate,
110+
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.ElicitRequestParams),
111+
};
112+
}
105113

106114
/// <summary>
107115
/// Creates an <see cref="InputRequest"/> for a roots list request.
108116
/// </summary>
109117
/// <param name="requestParams">The roots list request parameters.</param>
110118
/// <returns>A new <see cref="InputRequest"/> instance.</returns>
111-
public static InputRequest ForRootsList(ListRootsRequestParams requestParams) => new()
119+
public static InputRequest ForRootsList(ListRootsRequestParams requestParams)
112120
{
113-
Method = RequestMethods.RootsList,
114-
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.ListRootsRequestParams),
115-
};
121+
Throw.IfNull(requestParams);
122+
return new()
123+
{
124+
Method = RequestMethods.RootsList,
125+
Params = JsonSerializer.SerializeToElement(requestParams, McpJsonUtilities.JsonContext.Default.ListRootsRequestParams),
126+
};
127+
}
116128

117129
/// <summary>Provides JSON serialization support for <see cref="InputRequest"/>.</summary>
118130
public sealed class Converter : JsonConverter<InputRequest>

src/ModelContextProtocol.Core/Protocol/InputResponse.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,30 +71,42 @@ public sealed class InputResponse
7171
/// </summary>
7272
/// <param name="result">The sampling result.</param>
7373
/// <returns>A new <see cref="InputResponse"/> instance.</returns>
74-
public static InputResponse FromSamplingResult(CreateMessageResult result) => new()
74+
public static InputResponse FromSamplingResult(CreateMessageResult result)
7575
{
76-
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.CreateMessageResult),
77-
};
76+
Throw.IfNull(result);
77+
return new()
78+
{
79+
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.CreateMessageResult),
80+
};
81+
}
7882

7983
/// <summary>
8084
/// Creates an <see cref="InputResponse"/> from an <see cref="ElicitResult"/>.
8185
/// </summary>
8286
/// <param name="result">The elicitation result.</param>
8387
/// <returns>A new <see cref="InputResponse"/> instance.</returns>
84-
public static InputResponse FromElicitResult(ElicitResult result) => new()
88+
public static InputResponse FromElicitResult(ElicitResult result)
8589
{
86-
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.ElicitResult),
87-
};
90+
Throw.IfNull(result);
91+
return new()
92+
{
93+
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.ElicitResult),
94+
};
95+
}
8896

8997
/// <summary>
9098
/// Creates an <see cref="InputResponse"/> from a <see cref="ListRootsResult"/>.
9199
/// </summary>
92100
/// <param name="result">The roots list result.</param>
93101
/// <returns>A new <see cref="InputResponse"/> instance.</returns>
94-
public static InputResponse FromRootsResult(ListRootsResult result) => new()
102+
public static InputResponse FromRootsResult(ListRootsResult result)
95103
{
96-
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.ListRootsResult),
97-
};
104+
Throw.IfNull(result);
105+
return new()
106+
{
107+
RawValue = JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.ListRootsResult),
108+
};
109+
}
98110

99111
/// <summary>Provides JSON serialization support for <see cref="InputResponse"/>.</summary>
100112
public sealed class Converter : JsonConverter<InputResponse>

0 commit comments

Comments
 (0)