Add Extensions support to ClientCapabilities and ServerCapabilities (#1317)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
This commit is contained in:
parent
79b2dbeb20
commit
c2aa6a5123
2 changed files with 164 additions and 3 deletions
|
|
@ -21,7 +21,11 @@ public static class ClientCapabilitiesTests
|
|||
Form = new FormElicitationCapability(),
|
||||
Url = new UrlElicitationCapability()
|
||||
},
|
||||
Tasks = new McpTasksCapability()
|
||||
Tasks = new McpTasksCapability(),
|
||||
Extensions = new Dictionary<string, object>
|
||||
{
|
||||
["io.modelcontextprotocol/test"] = new object()
|
||||
}
|
||||
};
|
||||
|
||||
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);
|
||||
|
|
@ -37,6 +41,8 @@ public static class ClientCapabilitiesTests
|
|||
Assert.NotNull(deserialized.Elicitation.Form);
|
||||
Assert.NotNull(deserialized.Elicitation.Url);
|
||||
Assert.NotNull(deserialized.Tasks);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/test"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -53,5 +59,42 @@ public static class ClientCapabilitiesTests
|
|||
Assert.Null(deserialized.Sampling);
|
||||
Assert.Null(deserialized.Elicitation);
|
||||
Assert.Null(deserialized.Tasks);
|
||||
Assert.Null(deserialized.Extensions);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void ClientCapabilities_Extensions_DeserializesFromJson()
|
||||
{
|
||||
string json = """
|
||||
{
|
||||
"extensions": {
|
||||
"io.modelcontextprotocol/oauth-client-credentials": {},
|
||||
"io.modelcontextprotocol/test-extension": {
|
||||
"setting1": "value1",
|
||||
"setting2": 42
|
||||
}
|
||||
}
|
||||
}
|
||||
""";
|
||||
|
||||
var deserialized = JsonSerializer.Deserialize<ClientCapabilities>(json, McpJsonUtilities.DefaultOptions);
|
||||
|
||||
Assert.NotNull(deserialized);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.Equal(2, deserialized.Extensions.Count);
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/oauth-client-credentials"));
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/test-extension"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void ClientCapabilities_Extensions_EmptyObjectDeserializesAsEmptyDictionary()
|
||||
{
|
||||
string json = """{"extensions": {}}""";
|
||||
|
||||
var deserialized = JsonSerializer.Deserialize<ClientCapabilities>(json, McpJsonUtilities.DefaultOptions);
|
||||
|
||||
Assert.NotNull(deserialized);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.Empty(deserialized.Extensions);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,11 @@ public static class ServerCapabilitiesTests
|
|||
Resources = new ResourcesCapability { Subscribe = true, ListChanged = true },
|
||||
Tools = new ToolsCapability { ListChanged = false },
|
||||
Completions = new CompletionsCapability(),
|
||||
Tasks = new McpTasksCapability()
|
||||
Tasks = new McpTasksCapability(),
|
||||
Extensions = new Dictionary<string, object>
|
||||
{
|
||||
["io.modelcontextprotocol/apps"] = new object()
|
||||
}
|
||||
};
|
||||
|
||||
string json = JsonSerializer.Serialize(original, McpJsonUtilities.DefaultOptions);
|
||||
|
|
@ -32,6 +36,8 @@ public static class ServerCapabilitiesTests
|
|||
Assert.False(deserialized.Tools.ListChanged);
|
||||
Assert.NotNull(deserialized.Completions);
|
||||
Assert.NotNull(deserialized.Tasks);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/apps"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -50,5 +56,42 @@ public static class ServerCapabilitiesTests
|
|||
Assert.Null(deserialized.Tools);
|
||||
Assert.Null(deserialized.Completions);
|
||||
Assert.Null(deserialized.Tasks);
|
||||
Assert.Null(deserialized.Extensions);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void ServerCapabilities_Extensions_DeserializesFromJson()
|
||||
{
|
||||
string json = """
|
||||
{
|
||||
"extensions": {
|
||||
"io.modelcontextprotocol/apps": {},
|
||||
"io.modelcontextprotocol/custom": {
|
||||
"option": 42,
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
}
|
||||
""";
|
||||
|
||||
var deserialized = JsonSerializer.Deserialize<ServerCapabilities>(json, McpJsonUtilities.DefaultOptions);
|
||||
|
||||
Assert.NotNull(deserialized);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.Equal(2, deserialized.Extensions.Count);
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/apps"));
|
||||
Assert.True(deserialized.Extensions.ContainsKey("io.modelcontextprotocol/custom"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void ServerCapabilities_Extensions_EmptyObjectDeserializesAsEmptyDictionary()
|
||||
{
|
||||
string json = """{"extensions": {}}""";
|
||||
|
||||
var deserialized = JsonSerializer.Deserialize<ServerCapabilities>(json, McpJsonUtilities.DefaultOptions);
|
||||
|
||||
Assert.NotNull(deserialized);
|
||||
Assert.NotNull(deserialized.Extensions);
|
||||
Assert.Empty(deserialized.Extensions);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue