Implement SEP-973: Icons and metadata support for Implementations, Resources, Tools, and Prompts (#802)
* Initial plan * Initial plan for SEP-973 implementation Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Implement SEP-973: Add Icon class and icon support to Implementation, Resource, Tool, and Prompt Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Complete SEP-973 implementation with documentation and fix property consistency Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Address code review feedback: improve tests, remove docs, split test files Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Fix tests to use S.T.J. source generator * Styling fixes * Simplify Icons property documentation as suggested in code review Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Rename Icon.Src property to Icon.Source for more .NET-y naming Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Add icon support to McpServerTool infrastructure and attributes Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Cleanup * Refactor icon tests to use Delegate overload instead of MethodInfo pattern Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Change Icon.Sizes property from string to IList<string> per spec update Co-authored-by: jozkee <16040868+jozkee@users.noreply.github.com> * Add icon support to Prompts and Resources (CreateOptions and Attributes) Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Add client-server integration tests for Icons and WebsiteUrl Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> * Fix nullability warnings * Revert "Add client-server integration tests for Icons and WebsiteUrl" This reverts commit f37de15569e54e86a0709121c9bdf80c5045511c. * More nullability fixes * Add more tests * Address code review feedback: add Theme property, fix docs, improve test patterns Co-authored-by: jozkee <16040868+jozkee@users.noreply.github.com> * Update Icon tests to exercise Theme property Co-authored-by: jozkee <16040868+jozkee@users.noreply.github.com> * Add Theme property assertions to client-server integration tests Co-authored-by: jozkee <16040868+jozkee@users.noreply.github.com> * Fix nullability --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> Co-authored-by: Mackinnon Buck <mackinnon.buck@gmail.com> Co-authored-by: jozkee <16040868+jozkee@users.noreply.github.com> Co-authored-by: David Cantú <dacantu@microsoft.com>
This commit is contained in:
parent
a0049c7a3c
commit
f28639119b
1 changed files with 982 additions and 8 deletions
|
|
@ -201,7 +201,7 @@ public partial class McpServerBuilderExtensionsResourcesTests : ClientServerTest
|
|||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TitleAttributeProperty_PropagatedToTitle()
|
||||
public async Task AttributeProperties_Propagated()
|
||||
{
|
||||
await using McpClient client = await CreateMcpClientForServer();
|
||||
|
||||
|
|
@ -211,11 +211,23 @@ public partial class McpServerBuilderExtensionsResourcesTests : ClientServerTest
|
|||
McpClientResource resource = resources.First(t => t.Name == "some_neat_direct_resource");
|
||||
Assert.Equal("This is a title", resource.Title);
|
||||
|
||||
Assert.NotNull(resource.ProtocolResource.Icons);
|
||||
Assert.NotEmpty(resource.ProtocolResource.Icons);
|
||||
var resourceIcon = Assert.Single(resource.ProtocolResource.Icons);
|
||||
Assert.Equal("https://example.com/direct-resource-icon.svg", resourceIcon.Source);
|
||||
Assert.Null(resourceIcon.Theme);
|
||||
|
||||
var resourceTemplates = await client.ListResourceTemplatesAsync(cancellationToken: TestContext.Current.CancellationToken);
|
||||
Assert.NotNull(resourceTemplates);
|
||||
Assert.NotEmpty(resourceTemplates);
|
||||
McpClientResourceTemplate resourceTemplate = resourceTemplates.First(t => t.Name == "some_neat_templated_resource");
|
||||
Assert.Equal("This is another title", resourceTemplate.Title);
|
||||
|
||||
Assert.NotNull(resourceTemplate.ProtocolResourceTemplate.Icons);
|
||||
Assert.NotEmpty(resourceTemplate.ProtocolResourceTemplate.Icons);
|
||||
var templateIcon = Assert.Single(resourceTemplate.ProtocolResourceTemplate.Icons);
|
||||
Assert.Equal("https://example.com/templated-resource-icon.svg", templateIcon.Source);
|
||||
Assert.Null(templateIcon.Theme);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -341,10 +353,10 @@ public partial class McpServerBuilderExtensionsResourcesTests : ClientServerTest
|
|||
[McpServerResourceType]
|
||||
public sealed class SimpleResources
|
||||
{
|
||||
[McpServerResource(Title = "This is a title"), Description("Some neat direct resource")]
|
||||
[McpServerResource(Title = "This is a title", IconSource = "https://example.com/direct-resource-icon.svg"), Description("Some neat direct resource")]
|
||||
public static string SomeNeatDirectResource() => "This is a neat resource";
|
||||
|
||||
[McpServerResource(Title = "This is another title"), Description("Some neat resource with parameters")]
|
||||
[McpServerResource(Title = "This is another title", IconSource = "https://example.com/templated-resource-icon.svg"), Description("Some neat resource with parameters")]
|
||||
public static string SomeNeatTemplatedResource(string name) => $"This is a neat resource with parameters: {name}";
|
||||
|
||||
[McpServerResource]
|
||||
|
|
|
|||
Loading…
Reference in a new issue