Add 3-arg RequestContext constructor and obsolete 2-arg to eliminate null-forgiving operator usage (#1462)

This commit is contained in:
Copilot 2026-03-27 12:33:23 -07:00 • committed by GitHub
commit 7dcdbafe9d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -204,9 +204,9 @@ internal static class Program
};
options.Handlers.CallToolHandler = async (request, cancellationToken) =>
{
if (request.Params?.Name == "echo")
if (request.Params.Name == "echo")
{
if (request.Params?.Arguments is null || !request.Params.Arguments.TryGetValue("message", out var message))
if (request.Params.Arguments is null || !request.Params.Arguments.TryGetValue("message", out var message))
{
throw new McpProtocolException("Missing required argument 'message'", McpErrorCode.InvalidParams);
}
@ -215,16 +215,16 @@ internal static class Program
Content = [new TextContentBlock { Text = $"Echo: {message}" }]
};
}
else if (request.Params?.Name == "echoSessionId")
else if (request.Params.Name == "echoSessionId")
{
return new CallToolResult
{
Content = [new TextContentBlock { Text = request.Server.SessionId ?? string.Empty }]
};
}
else if (request.Params?.Name == "trigger-sampling-request")
else if (request.Params.Name == "trigger-sampling-request")
{
if (request.Params?.Arguments is null ||
if (request.Params.Arguments is null ||
!request.Params.Arguments.TryGetValue("prompt", out var prompt) ||
!request.Params.Arguments.TryGetValue("maxTokens", out var maxTokens))
{
@ -238,16 +238,16 @@ internal static class Program
Content = [new TextContentBlock { Text = $"LLM sampling result: {sampleResult.Content.OfType<TextContentBlock>().FirstOrDefault()?.Text}" }]
};
}
else if (request.Params?.Name == "echoCliArg")
else if (request.Params.Name == "echoCliArg")
{
return new CallToolResult
{
Content = [new TextContentBlock { Text = cliArg ?? "null" }]
};
}
else if (request.Params?.Name == "longRunning")
else if (request.Params.Name == "longRunning")
{
if (request.Params?.Arguments is null || !request.Params.Arguments.TryGetValue("durationMs", out var durationMsValue))
if (request.Params.Arguments is null || !request.Params.Arguments.TryGetValue("durationMs", out var durationMsValue))
{
throw new McpProtocolException("Missing required argument 'durationMs'", McpErrorCode.InvalidParams);
}
@ -258,9 +258,9 @@ internal static class Program
Content = [new TextContentBlock { Text = $"Long-running operation completed after {durationMs}ms" }]
};
}
else if (request.Params?.Name == "crash")
else if (request.Params.Name == "crash")
{
if (request.Params?.Arguments is null || !request.Params.Arguments.TryGetValue("exitCode", out var exitCodeValue))
if (request.Params.Arguments is null || !request.Params.Arguments.TryGetValue("exitCode", out var exitCodeValue))
{
throw new McpProtocolException("Missing required argument 'exitCode'", McpErrorCode.InvalidParams);
}
@ -271,7 +271,7 @@ internal static class Program
}
else
{
throw new McpProtocolException($"Unknown tool: {request.Params?.Name}", McpErrorCode.InvalidParams);
throw new McpProtocolException($"Unknown tool: {request.Params.Name}", McpErrorCode.InvalidParams);
}
};
}
@ -335,7 +335,7 @@ internal static class Program
options.Handlers.GetPromptHandler = async (request, cancellationToken) =>
{
List<PromptMessage> messages = [];
if (request.Params?.Name == "simple-prompt")
if (request.Params.Name == "simple-prompt")
{
messages.Add(new PromptMessage
{
@ -343,7 +343,7 @@ internal static class Program
Content = new TextContentBlock { Text = "This is a simple prompt without arguments." },
});
}
else if (request.Params?.Name == "args-prompt")
else if (request.Params.Name == "args-prompt")
{
string city = request.Params.Arguments?["city"].ToString() ?? "unknown";
string state = request.Params.Arguments?["state"].ToString() ?? "";
@ -354,7 +354,7 @@ internal static class Program
Content = new TextContentBlock { Text = $"What's weather in {location}?" },
});
}
else if (request.Params?.Name == "completable-prompt")
else if (request.Params.Name == "completable-prompt")
{
string department = request.Params.Arguments?["department"].ToString() ?? "unknown";
string name = request.Params.Arguments?["name"].ToString() ?? "unknown";
@ -366,7 +366,7 @@ internal static class Program
}
else
{
throw new McpProtocolException($"Unknown prompt: {request.Params?.Name}", McpErrorCode.InvalidParams);
throw new McpProtocolException($"Unknown prompt: {request.Params.Name}", McpErrorCode.InvalidParams);
}
return new GetPromptResult
@ -382,11 +382,6 @@ internal static class Program
{
options.Handlers.SetLoggingLevelHandler = async (request, cancellationToken) =>
{
if (request.Params?.Level is null)
{
throw new McpProtocolException("Missing required argument 'level'", McpErrorCode.InvalidParams);
}
_minimumLoggingLevel = request.Params.Level;
return new EmptyResult();
@ -452,7 +447,7 @@ internal static class Program
options.Handlers.ListResourcesHandler = async (request, cancellationToken) =>
{
int startIndex = 0;
if (request.Params?.Cursor is not null)
if (request.Params.Cursor is not null)
{
try
{
@ -481,7 +476,7 @@ internal static class Program
options.Handlers.ReadResourceHandler = async (request, cancellationToken) =>
{
if (request.Params?.Uri is null)
if (request.Params.Uri is null)
{
throw new McpProtocolException("Missing required argument 'uri'", McpErrorCode.InvalidParams);
}
@ -518,7 +513,7 @@ internal static class Program
options.Handlers.SubscribeToResourcesHandler = async (request, cancellationToken) =>
{
if (request?.Params?.Uri is null)
if (request?.Params.Uri is null)
{
throw new McpProtocolException("Missing required argument 'uri'", McpErrorCode.InvalidParams);
}
@ -535,7 +530,7 @@ internal static class Program
options.Handlers.UnsubscribeFromResourcesHandler = async (request, cancellationToken) =>
{
if (request?.Params?.Uri is null)
if (request?.Params.Uri is null)
{
throw new McpProtocolException("Missing required argument 'uri'", McpErrorCode.InvalidParams);
}
@ -563,7 +558,7 @@ internal static class Program
options.Handlers.CompleteHandler = async (request, cancellationToken) =>
{
string[]? values;
switch (request.Params?.Ref)
switch (request.Params.Ref)
{
case ResourceTemplateReference rtr:
var resourceId = rtr.Uri?.Split('/').LastOrDefault();
@ -571,7 +566,7 @@ internal static class Program
return new CompleteResult { Completion = new() { Values = [] } };
// Filter resource IDs that start with the input value
values = sampleResourceIds.Where(id => id.StartsWith(request.Params!.Argument.Value)).ToArray();
values = sampleResourceIds.Where(id => id.StartsWith(request.Params.Argument.Value)).ToArray();
return new CompleteResult { Completion = new() { Values = values, HasMore = false, Total = values.Length } };
case PromptReference pr:
@ -583,7 +578,7 @@ internal static class Program
return new CompleteResult { Completion = new() { Values = values, HasMore = false, Total = values.Length } };
default:
throw new McpProtocolException($"Unknown reference type: '{request.Params?.Ref.Type}'", McpErrorCode.InvalidParams);
throw new McpProtocolException($"Unknown reference type: '{request.Params.Ref.Type}'", McpErrorCode.InvalidParams);
}
};
}