diff --git a/src/ModelContextProtocol/Client/McpClient.cs b/src/ModelContextProtocol/Client/McpClient.cs index 1ae358ef4..17eeb0f51 100644 --- a/src/ModelContextProtocol/Client/McpClient.cs +++ b/src/ModelContextProtocol/Client/McpClient.cs @@ -6,7 +6,6 @@ using ModelContextProtocol.Shared; using ModelContextProtocol.Utils.Json; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using System.Text.Json; namespace ModelContextProtocol.Client; @@ -126,11 +125,11 @@ private async Task InitializeAsync(CancellationToken cancellationToken) new JsonRpcRequest { Method = "initialize", - Params = new + Params = new InitializeRequestParams() { - protocolVersion = _options.ProtocolVersion, - capabilities = _options.Capabilities ?? new ClientCapabilities(), - clientInfo = _options.ClientInfo + ProtocolVersion = _options.ProtocolVersion, + Capabilities = _options.Capabilities ?? new ClientCapabilities(), + ClientInfo = _options.ClientInfo } }, initializationCts.Token).ConfigureAwait(false); diff --git a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs index e11a4ab9c..75d2cb7da 100644 --- a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs +++ b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs @@ -12,7 +12,9 @@ namespace ModelContextProtocol; /// public static partial class McpServerBuilderExtensions { - private const string RequiresUnreferencedCodeMessage = "This method requires dynamic lookup of method metadata and might not work in Native AOT."; + private const string WithToolsRequiresUnreferencedCodeMessage = + $"The non-generic {nameof(WithTools)} and {nameof(WithToolsFromAssembly)} methods require dynamic lookup of method metadata" + + $"and may not work in Native AOT. Use the generic {nameof(WithTools)} method instead."; /// Adds instances to the service collection backing . /// The tool type. @@ -59,7 +61,7 @@ public static partial class McpServerBuilderExtensions /// types, where the methods are attributed as , and adds an /// instance for each. For instance methods, an instance will be constructed for each invocation of the tool. /// - [RequiresUnreferencedCode(RequiresUnreferencedCodeMessage)] + [RequiresUnreferencedCode(WithToolsRequiresUnreferencedCodeMessage)] public static IMcpServerBuilder WithTools(this IMcpServerBuilder builder, params IEnumerable toolTypes) { Throw.IfNull(builder); @@ -95,7 +97,7 @@ public static IMcpServerBuilder WithTools(this IMcpServerBuilder builder, params /// The builder instance. /// The assembly to load the types from. Null to get the current assembly /// is . - [RequiresUnreferencedCode(RequiresUnreferencedCodeMessage)] + [RequiresUnreferencedCode(WithToolsRequiresUnreferencedCodeMessage)] public static IMcpServerBuilder WithToolsFromAssembly(this IMcpServerBuilder builder, Assembly? toolAssembly = null) { Throw.IfNull(builder); diff --git a/src/ModelContextProtocol/Protocol/Messages/JsonRpcMessage.cs b/src/ModelContextProtocol/Protocol/Messages/JsonRpcRequest.cs similarity index 100% rename from src/ModelContextProtocol/Protocol/Messages/JsonRpcMessage.cs rename to src/ModelContextProtocol/Protocol/Messages/JsonRpcRequest.cs diff --git a/src/ModelContextProtocol/Server/McpServer.cs b/src/ModelContextProtocol/Server/McpServer.cs index 7f425b1fb..50576a41e 100644 --- a/src/ModelContextProtocol/Server/McpServer.cs +++ b/src/ModelContextProtocol/Server/McpServer.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using ModelContextProtocol.Logging; using ModelContextProtocol.Protocol.Messages; using ModelContextProtocol.Protocol.Transport; diff --git a/src/ModelContextProtocol/Utils/Json/McpJsonUtilities.cs b/src/ModelContextProtocol/Utils/Json/McpJsonUtilities.cs index 71e9eb345..d8513ef85 100644 --- a/src/ModelContextProtocol/Utils/Json/McpJsonUtilities.cs +++ b/src/ModelContextProtocol/Utils/Json/McpJsonUtilities.cs @@ -105,21 +105,52 @@ internal static bool IsValidMcpToolSchema(JsonElement element) UseStringEnumConverter = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, NumberHandling = JsonNumberHandling.AllowReadingFromString)] + + // JSON [JsonSerializable(typeof(JsonDocument))] [JsonSerializable(typeof(JsonElement))] [JsonSerializable(typeof(JsonNode))] + + // JSON-RPC [JsonSerializable(typeof(IJsonRpcMessage))] [JsonSerializable(typeof(JsonRpcRequest))] [JsonSerializable(typeof(JsonRpcNotification))] [JsonSerializable(typeof(JsonRpcResponse))] [JsonSerializable(typeof(JsonRpcError))] - [JsonSerializable(typeof(ServerCapabilities))] - [JsonSerializable(typeof(ClientCapabilities))] - [JsonSerializable(typeof(Implementation))] + + // MCP Request Params / Results + [JsonSerializable(typeof(CallToolRequestParams))] + [JsonSerializable(typeof(CallToolResponse))] + [JsonSerializable(typeof(CompleteRequestParams))] + [JsonSerializable(typeof(CompleteResult))] + [JsonSerializable(typeof(CreateMessageRequestParams))] [JsonSerializable(typeof(CreateMessageResult))] - [JsonSerializable(typeof(ListRootsResult))] + [JsonSerializable(typeof(EmptyResult))] + [JsonSerializable(typeof(GetPromptRequestParams))] + [JsonSerializable(typeof(GetPromptResult))] + [JsonSerializable(typeof(InitializeRequestParams))] [JsonSerializable(typeof(InitializeResult))] - [JsonSerializable(typeof(CallToolResponse))] + [JsonSerializable(typeof(ListPromptsRequestParams))] + [JsonSerializable(typeof(ListPromptsResult))] + [JsonSerializable(typeof(ListResourcesRequestParams))] + [JsonSerializable(typeof(ListResourcesResult))] + [JsonSerializable(typeof(ListResourceTemplatesRequestParams))] + [JsonSerializable(typeof(ListResourceTemplatesResult))] + [JsonSerializable(typeof(ListRootsRequestParams))] + [JsonSerializable(typeof(ListRootsResult))] + [JsonSerializable(typeof(ListToolsRequestParams))] + [JsonSerializable(typeof(ListToolsResult))] + [JsonSerializable(typeof(LoggingMessageNotificationParams))] + [JsonSerializable(typeof(PingResult))] + [JsonSerializable(typeof(ReadResourceRequestParams))] + [JsonSerializable(typeof(ReadResourceResult))] + [JsonSerializable(typeof(ResourceUpdatedNotificationParams))] + [JsonSerializable(typeof(SetLevelRequestParams))] + [JsonSerializable(typeof(SubscribeRequestParams))] + [JsonSerializable(typeof(UnsubscribeFromResourceRequestParams))] + [JsonSerializable(typeof(UnsubscribeRequestParams))] + + [ExcludeFromCodeCoverage] internal sealed partial class JsonContext : JsonSerializerContext; private static JsonElement ParseJsonElement(ReadOnlySpan utf8Json) diff --git a/tests/ModelContextProtocol.Tests/Server/McpServerToolTests.cs b/tests/ModelContextProtocol.Tests/Server/McpServerToolTests.cs index 1ce4b36cb..3f066dd5c 100644 --- a/tests/ModelContextProtocol.Tests/Server/McpServerToolTests.cs +++ b/tests/ModelContextProtocol.Tests/Server/McpServerToolTests.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.AI; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using ModelContextProtocol.Protocol.Types; using ModelContextProtocol.Server; using Moq; diff --git a/tests/ModelContextProtocol.Tests/Utils/InMemoryTestSseServer.cs b/tests/ModelContextProtocol.Tests/Utils/InMemoryTestSseServer.cs index ce1c1beeb..453664b95 100644 --- a/tests/ModelContextProtocol.Tests/Utils/InMemoryTestSseServer.cs +++ b/tests/ModelContextProtocol.Tests/Utils/InMemoryTestSseServer.cs @@ -4,6 +4,7 @@ using ModelContextProtocol.Protocol.Messages; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using ModelContextProtocol.Protocol.Types; namespace ModelContextProtocol.Tests.Utils; @@ -288,19 +289,14 @@ private static async Task HandleInitializationRequest(HttpListenerResponse respo var jsonRpcResponse = new JsonRpcResponse() { Id = jsonRpcRequest.Id, - Result = new + Result = new InitializeResult() { - protocolVersion = "2024-11-05", - capabilities = new + ProtocolVersion = "2024-11-05", + Capabilities = new(), + ServerInfo = new() { - experimental = (object?)null, - roots = (object?)null, - sampling = (object?)null - }, - serverInfo = new - { - name = "ExampleServer", - version = "1.0.0" + Name = "ExampleServer", + Version = "1.0.0" } } };