Skip to content

Commit 650df63

Browse files
Copiloteiriktsarpalisstephentoub
authored
Fix ResourceLinkBlock deserialization by adding missing "name" case (#645)
* Initial plan * Initial analysis and plan for ResourceLinkBlock deserialization fix Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Fix ResourceLinkBlock deserialization by adding missing "name" case Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Remove unnecessary dotnet-install.sh file Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> * Use const for JSON string variables and improve indentation Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> * Remove temporary backup file Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> * Change JSON variable names to use PascalCase (Json) as requested Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
1 parent 9e12167 commit 650df63

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

src/ModelContextProtocol.Core/Protocol/ContentBlock.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ public class Converter : JsonConverter<ContentBlock>
103103
text = reader.GetString();
104104
break;
105105

106+
case "name":
107+
name = reader.GetString();
108+
break;
109+
106110
case "data":
107111
data = reader.GetString();
108112
break;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using System.Text.Json;
2+
using ModelContextProtocol.Protocol;
3+
4+
namespace ModelContextProtocol.Tests.Protocol;
5+
6+
public class ContentBlockTests
7+
{
8+
[Fact]
9+
public void ResourceLinkBlock_SerializationRoundTrip_PreservesAllProperties()
10+
{
11+
// Arrange
12+
var original = new ResourceLinkBlock
13+
{
14+
Uri = "https://example.com/resource",
15+
Name = "Test Resource",
16+
Description = "A test resource for validation",
17+
MimeType = "text/plain",
18+
Size = 1024
19+
};
20+
21+
// Act - Serialize to JSON
22+
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);
23+
24+
// Act - Deserialize back from JSON
25+
var deserialized = JsonSerializer.Deserialize<ContentBlock>(json, McpJsonUtilities.DefaultOptions);
26+
27+
// Assert
28+
Assert.NotNull(deserialized);
29+
var resourceLink = Assert.IsType<ResourceLinkBlock>(deserialized);
30+
31+
Assert.Equal(original.Uri, resourceLink.Uri);
32+
Assert.Equal(original.Name, resourceLink.Name);
33+
Assert.Equal(original.Description, resourceLink.Description);
34+
Assert.Equal(original.MimeType, resourceLink.MimeType);
35+
Assert.Equal(original.Size, resourceLink.Size);
36+
Assert.Equal("resource_link", resourceLink.Type);
37+
}
38+
39+
[Fact]
40+
public void ResourceLinkBlock_DeserializationWithMinimalProperties_Succeeds()
41+
{
42+
// Arrange - JSON with only required properties
43+
const string Json = """
44+
{
45+
"type": "resource_link",
46+
"uri": "https://example.com/minimal",
47+
"name": "Minimal Resource"
48+
}
49+
""";
50+
51+
// Act
52+
var deserialized = JsonSerializer.Deserialize<ContentBlock>(Json, McpJsonUtilities.DefaultOptions);
53+
54+
// Assert
55+
Assert.NotNull(deserialized);
56+
var resourceLink = Assert.IsType<ResourceLinkBlock>(deserialized);
57+
58+
Assert.Equal("https://example.com/minimal", resourceLink.Uri);
59+
Assert.Equal("Minimal Resource", resourceLink.Name);
60+
Assert.Null(resourceLink.Description);
61+
Assert.Null(resourceLink.MimeType);
62+
Assert.Null(resourceLink.Size);
63+
Assert.Equal("resource_link", resourceLink.Type);
64+
}
65+
66+
[Fact]
67+
public void ResourceLinkBlock_DeserializationWithoutName_ThrowsJsonException()
68+
{
69+
// Arrange - JSON missing the required "name" property
70+
const string Json = """
71+
{
72+
"type": "resource_link",
73+
"uri": "https://example.com/missing-name"
74+
}
75+
""";
76+
77+
// Act & Assert
78+
var exception = Assert.Throws<JsonException>(() =>
79+
JsonSerializer.Deserialize<ContentBlock>(Json, McpJsonUtilities.DefaultOptions));
80+
81+
Assert.Contains("Name must be provided for 'resource_link' type", exception.Message);
82+
}
83+
}

0 commit comments

Comments
 (0)