From 539481f99935f3bcbe66e8bc514922e7f67dac8f Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Fri, 20 Feb 2026 03:47:08 +0000
Subject: [PATCH] Validate mimeType in ImageContentBlock.FromBytes and
AudioContentBlock.FromBytes (#1321)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
---
.../Protocol/ContentBlock.cs | 10 ++++++++--
.../Protocol/ContentBlockTests.cs | 18 ++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs b/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs
index d31936b..7d35cec 100644
--- a/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs
+++ b/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs
@@ -425,9 +425,12 @@ public sealed class ImageContentBlock : ContentBlock
///
/// This method stores the provided bytes as and encodes them to base64 UTF-8 bytes for .
///
- ///
+ /// is .
+ /// is empty or composed entirely of whitespace.
public static ImageContentBlock FromBytes(ReadOnlyMemory bytes, string mimeType)
{
+ Throw.IfNullOrWhiteSpace(mimeType);
+
ReadOnlyMemory data = EncodingUtilities.EncodeToBase64Utf8(bytes);
return new()
@@ -510,9 +513,12 @@ public sealed class AudioContentBlock : ContentBlock
///
/// This method stores the provided bytes as and encodes them to base64 UTF-8 bytes for .
///
- ///
+ /// is .
+ /// is empty or composed entirely of whitespace.
public static AudioContentBlock FromBytes(ReadOnlyMemory bytes, string mimeType)
{
+ Throw.IfNullOrWhiteSpace(mimeType);
+
ReadOnlyMemory data = EncodingUtilities.EncodeToBase64Utf8(bytes);
return new()
diff --git a/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs b/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs
index 2dfcf7d..957a452 100644
--- a/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs
+++ b/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs
@@ -272,4 +272,22 @@ public class ContentBlockTests
Assert.Equal("Paris", result.Input.GetProperty("city").GetString());
Assert.Equal("metric", result.Input.GetProperty("units").GetString());
}
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData(" ")]
+ public void ImageContentBlock_FromBytes_ThrowsForNullOrWhiteSpaceMimeType(string? mimeType)
+ {
+ Assert.ThrowsAny(() => ImageContentBlock.FromBytes((byte[])[1, 2, 3], mimeType!));
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData(" ")]
+ public void AudioContentBlock_FromBytes_ThrowsForNullOrWhiteSpaceMimeType(string? mimeType)
+ {
+ Assert.ThrowsAny(() => AudioContentBlock.FromBytes((byte[])[1, 2, 3], mimeType!));
+ }
}
\ No newline at end of file