From 62d173d23398ee5e4bc6054a427c7eae7d7d6e8d Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 31 Oct 2025 17:20:24 +0800 Subject: [PATCH 1/2] Fix MCP endpoint with redirect HTTPS --- .../DashboardWebApplication.cs | 5 +-- .../Integration/McpServiceTests.cs | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Aspire.Dashboard/DashboardWebApplication.cs b/src/Aspire.Dashboard/DashboardWebApplication.cs index e35864e20be..ac548ea2ebb 100644 --- a/src/Aspire.Dashboard/DashboardWebApplication.cs +++ b/src/Aspire.Dashboard/DashboardWebApplication.cs @@ -196,7 +196,7 @@ public DashboardWebApplication( ConfigureKestrelEndpoints(builder, dashboardOptions); var browserHttpsPort = dashboardOptions.Frontend.GetEndpointAddresses().FirstOrDefault(IsHttpsOrNull)?.Port; - var isAllHttps = browserHttpsPort is not null && IsHttpsOrNull(dashboardOptions.Otlp.GetGrpcEndpointAddress()) && IsHttpsOrNull(dashboardOptions.Otlp.GetHttpEndpointAddress()); + var isAllHttps = browserHttpsPort is not null && IsHttpsOrNull(dashboardOptions.Otlp.GetGrpcEndpointAddress()) && IsHttpsOrNull(dashboardOptions.Otlp.GetHttpEndpointAddress()) && IsHttpsOrNull(dashboardOptions.Mcp.GetEndpointAddress()); if (isAllHttps) { // Explicitly configure the HTTPS redirect port as we're possibly listening on multiple HTTPS addresses @@ -619,8 +619,9 @@ static void AddEndpointConfiguration(Dictionary values, string var kestrelSection = context.Configuration.GetSection("Kestrel"); var configurationLoader = serverOptions.Configure(kestrelSection); + var groupedEndpoints = EndpointInfo.GroupEndpointsByAddress(endpoints); - foreach (var (address, addressEndpoints) in EndpointInfo.GroupEndpointsByAddress(endpoints)) + foreach (var (address, addressEndpoints) in groupedEndpoints) { var name = string.Join("-", addressEndpoints.Select(m => m.Name)); var connectionTypes = addressEndpoints.Select(m => m.ConnectionType).ToList(); diff --git a/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs b/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs index 0a9e7860ff7..8fe746929fc 100644 --- a/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs +++ b/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs @@ -204,6 +204,40 @@ public async Task CallService_BrowserEndPoint_Failure() Assert.False(responseMessage.IsSuccessStatusCode); } + [Fact] + public async Task CallService_McpEndPointHttpOnly_Success() + { + // Arrange + await using var app = IntegrationTestHelpers.CreateDashboardWebApplication(_testOutputHelper, + additionalConfiguration: data => + { + data[DashboardConfigNames.DashboardFrontendUrlName.ConfigKey] = "https://127.0.0.1:0;"; + data[DashboardConfigNames.DashboardOtlpGrpcUrlName.ConfigKey] = "https://127.0.0.1:0"; + data[DashboardConfigNames.DashboardOtlpHttpUrlName.ConfigKey] = "https://127.0.0.1:0"; + + // Only HTTP endpoint + data[DashboardConfigNames.DashboardMcpUrlName.ConfigKey] = "http://127.0.0.1:0"; + }); + + await app.StartAsync().DefaultTimeout(); + + using var httpClient = IntegrationTestHelpers.CreateHttpClient($"http://{app.McpEndPointAccessor().EndPoint}"); + + var request = CreateListToolsRequest(); + + // Act + var responseMessage = await httpClient.SendAsync(request).DefaultTimeout(TestConstants.LongTimeoutDuration); + responseMessage.EnsureSuccessStatusCode(); + + var responseData = await GetDataFromSseResponseAsync(responseMessage); + + // Assert + var jsonResponse = JsonNode.Parse(responseData!)!; + var tools = jsonResponse["result"]!["tools"]!.AsArray(); + + Assert.NotEmpty(tools); + } + internal static HttpRequestMessage CreateListToolsRequest() { var json = From 40786ea6076b22f15e0a05388c513813dc0f4550 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 31 Oct 2025 17:21:04 +0800 Subject: [PATCH 2/2] Clean up --- tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs b/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs index 8fe746929fc..15fc6e628b2 100644 --- a/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs +++ b/tests/Aspire.Dashboard.Tests/Integration/McpServiceTests.cs @@ -211,7 +211,7 @@ public async Task CallService_McpEndPointHttpOnly_Success() await using var app = IntegrationTestHelpers.CreateDashboardWebApplication(_testOutputHelper, additionalConfiguration: data => { - data[DashboardConfigNames.DashboardFrontendUrlName.ConfigKey] = "https://127.0.0.1:0;"; + data[DashboardConfigNames.DashboardFrontendUrlName.ConfigKey] = "https://127.0.0.1:0"; data[DashboardConfigNames.DashboardOtlpGrpcUrlName.ConfigKey] = "https://127.0.0.1:0"; data[DashboardConfigNames.DashboardOtlpHttpUrlName.ConfigKey] = "https://127.0.0.1:0";