diff --git a/src/ModelContextProtocol.Core/AIContentExtensions.cs b/src/ModelContextProtocol.Core/AIContentExtensions.cs index b7d02bc27..6b6a9c780 100644 --- a/src/ModelContextProtocol.Core/AIContentExtensions.cs +++ b/src/ModelContextProtocol.Core/AIContentExtensions.cs @@ -39,6 +39,29 @@ public static ChatMessage ToChatMessage(this PromptMessage promptMessage) }; } + /// + /// Converts a to a object. + /// + /// The tool result to convert. + /// The identifier for the function call request that triggered the tool invocation. + /// A object created from the tool result. + /// + /// This method transforms a protocol-specific from the Model Context Protocol + /// into a standard object that can be used with AI client libraries. It produces a + /// message containing a with result as a + /// serialized . + /// + public static ChatMessage ToChatMessage(this CallToolResult result, string callId) + { + Throw.IfNull(result); + Throw.IfNull(callId); + + return new(ChatRole.Tool, [new FunctionResultContent(callId, JsonSerializer.SerializeToElement(result, McpJsonUtilities.JsonContext.Default.CallToolResult)) + { + RawRepresentation = result, + }]); + } + /// /// Converts a to a list of objects. /// diff --git a/tests/ModelContextProtocol.Tests/AIContentExtensionsTests.cs b/tests/ModelContextProtocol.Tests/AIContentExtensionsTests.cs new file mode 100644 index 000000000..ec603c63f --- /dev/null +++ b/tests/ModelContextProtocol.Tests/AIContentExtensionsTests.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.AI; +using ModelContextProtocol.Protocol; +using System.Text.Json; + +namespace ModelContextProtocol.Tests; + +public class AIContentExtensionsTests +{ + [Fact] + public void CallToolResult_ToChatMessage_ProducesExpectedAIContent() + { + CallToolResult toolResult = new() { Content = [new TextContentBlock { Text = "This is a test message." }] }; + + Assert.Throws(() => AIContentExtensions.ToChatMessage(null!, "call123")); + Assert.Throws(() => AIContentExtensions.ToChatMessage(toolResult, null!)); + + ChatMessage message = AIContentExtensions.ToChatMessage(toolResult, "call123"); + + Assert.NotNull(message); + Assert.Equal(ChatRole.Tool, message.Role); + + FunctionResultContent frc = Assert.IsType(Assert.Single(message.Contents)); + Assert.Same(toolResult, frc.RawRepresentation); + Assert.Equal("call123", frc.CallId); + JsonElement result = Assert.IsType(frc.Result); + Assert.Contains("This is a test message.", result.ToString()); + } +} \ No newline at end of file