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