diff --git a/src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs b/src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs
index 0eefa52fb..35ec90c05 100644
--- a/src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs
+++ b/src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs
@@ -20,8 +20,9 @@ public static class McpEndpointRouteBuilderExtensions
///
/// The web application to attach MCP HTTP endpoints.
/// The route pattern prefix to map to.
+ /// Whether to use MapGet to occupy the default home page(/)
/// Returns a builder for configuring additional endpoint conventions like authorization policies.
- public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern = "")
+ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern = "", bool occupyRootUrl = true)
{
var streamableHttpHandler = endpoints.ServiceProvider.GetService() ??
throw new InvalidOperationException("You must call WithHttpTransport(). Unable to find required services. Call builder.Services.AddMcpServer().WithHttpTransport() in application startup code.");
@@ -31,13 +32,18 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
.WithDisplayName(b => $"MCP Streamable HTTP | {b.DisplayName}")
.WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status404NotFound, typeof(JsonRpcError), contentTypes: ["application/json"]));
- streamableHttpGroup.MapPost("", streamableHttpHandler.HandlePostRequestAsync)
- .WithMetadata(new AcceptsMetadata(["application/json"]))
- .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status200OK, contentTypes: ["text/event-stream"]))
- .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
- streamableHttpGroup.MapGet("", streamableHttpHandler.HandleGetRequestAsync)
- .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status200OK, contentTypes: ["text/event-stream"]));
- streamableHttpGroup.MapDelete("", streamableHttpHandler.HandleDeleteRequestAsync);
+
+ var routeGroup = endpoints.MapGroup(pattern);
+ if (occupyRootUrl)
+ {
+ streamableHttpGroup.MapPost("", streamableHttpHandler.HandlePostRequestAsync)
+ .WithMetadata(new AcceptsMetadata(["application/json"]))
+ .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status200OK, contentTypes: ["text/event-stream"]))
+ .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
+ streamableHttpGroup.MapGet("", streamableHttpHandler.HandleGetRequestAsync)
+ .WithMetadata(new ProducesResponseTypeMetadata(StatusCodes.Status200OK, contentTypes: ["text/event-stream"]));
+ streamableHttpGroup.MapDelete("", streamableHttpHandler.HandleDeleteRequestAsync);
+ }
// Map legacy HTTP with SSE endpoints.
var sseHandler = endpoints.ServiceProvider.GetRequiredService();