Skip to content

Commit a5ba959

Browse files
authored
Adding some more descriptive relationships to the MCP inspector (#828)
1 parent 70fdeac commit a5ba959

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,13 @@ public static IResourceBuilder<McpInspectorResource> WithMcpServer<TResource>(
198198

199199
builder.Resource.AddMcpServer(mcpServer.Resource, isDefault, transportType, path);
200200

201-
mcpServer.WithRelationship(builder.Resource, "InspectedBy");
201+
mcpServer.WithRelationship(builder.Resource, "Inspected By");
202+
builder.WithRelationship(mcpServer.Resource, "Inspecting");
203+
204+
if (isDefault)
205+
{
206+
builder.WithRelationship(mcpServer.Resource, "Default Inspected Server");
207+
}
202208

203209
return builder;
204210
}

tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/McpInspectorResourceBuilderExtensionsTests.cs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,44 @@ public void WithMcpServerCreatesResourceRelationshipAnnotations()
319319
var inspectorResource = Assert.Single(appModel.Resources.OfType<McpInspectorResource>());
320320
var serverResource = appModel.Resources.Single(r => r.Name == "mcpServer");
321321

322-
// The inspector and/or server should have a resource relationship annotation linking them.
323-
var serverHasRelationship = serverResource.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var serverRelationships);
324-
var inspectorHasRelationship = inspectorResource.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var inspectorRelationships);
322+
// The server should have an "Inspected By" relationship pointing at the inspector
323+
Assert.True(serverResource.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var serverRelationships));
324+
var serverRelationship = Assert.Single(serverRelationships);
325+
Assert.Same(inspectorResource, serverRelationship.Resource);
326+
Assert.Equal("Inspected By", serverRelationship.Type);
327+
328+
// The inspector should have relationships back to the server: "Inspecting" and (since isDefault=true) "Default Inspected Server"
329+
Assert.True(inspectorResource.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var inspectorRelationships));
330+
Assert.Contains(inspectorRelationships, r => r.Resource == serverResource && r.Type == "Inspecting");
331+
Assert.Contains(inspectorRelationships, r => r.Resource == serverResource && r.Type == "Default Inspected Server");
332+
}
333+
334+
[Fact]
335+
public void WithMcpServer_NonDefaultDoesNotAddDefaultInspectedServerRelationship()
336+
{
337+
// Arrange
338+
var appBuilder = DistributedApplication.CreateBuilder();
339+
340+
// Create mock MCP server resources
341+
var mockServer1 = appBuilder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_McpInspector_McpServer>("mcpServer1");
342+
var mockServer2 = appBuilder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_McpInspector_McpServer>("mcpServer2");
343+
344+
// Act: first is default, second is not
345+
var inspector = appBuilder.AddMcpInspector("inspector")
346+
.WithMcpServer(mockServer1, isDefault: true)
347+
.WithMcpServer(mockServer2, isDefault: false);
348+
349+
using var app = appBuilder.Build();
350+
351+
// Assert
352+
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
353+
354+
var inspectorResource = Assert.Single(appModel.Resources.OfType<McpInspectorResource>());
355+
var serverResource2 = appModel.Resources.Single(r => r.Name == "mcpServer2");
325356

326-
Assert.True(serverHasRelationship || inspectorHasRelationship, "Expected a ResourceRelationshipAnnotation on either the server or inspector resource.");
357+
// Inspector should have relationships but should NOT have "Default Inspected Server" for serverResource2
358+
Assert.True(inspectorResource.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var inspectorRelationships));
359+
Assert.DoesNotContain(inspectorRelationships, r => r.Resource == serverResource2 && r.Type == "Default Inspected Server");
327360
}
328361

329362
[Fact]

0 commit comments

Comments
 (0)