From 80851394eae0da7265d40d61b69a2b712ff3a383 Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Tue, 7 Apr 2026 11:11:41 -0700 Subject: [PATCH] Add McpServer.ProjectTemplates as BundledTemplate Wire the Microsoft.McpServer.ProjectTemplates package (produced from dotnet/aspnetcore) into the SDK as a BundledTemplate entry. - Add BundledTemplate entry in BundledTemplates.targets - Add version property and dependency tracking in eng/Version.Details.* - Add McpServerTemplateTests covering local/remote x default/no-selfcontained/aot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/Version.Details.props | 2 + .../redist/targets/BundledTemplates.targets | 1 + .../McpServerTemplateTests.cs | 69 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 test/dotnet-new.IntegrationTests/McpServerTemplateTests.cs diff --git a/eng/Version.Details.props b/eng/Version.Details.props index ac7cea426718..e546553aa7a2 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -58,6 +58,7 @@ This file should be imported by eng/Versions.props 11.0.0-beta.26203.108 11.0.0-preview.4.26203.108 11.0.0-preview.4.26203.108 + 11.0.0-preview.4.26203.108 11.0.0-preview.4.26203.108 11.0.0-preview.4.26203.108 11.0.0-beta.26203.108 @@ -202,6 +203,7 @@ This file should be imported by eng/Versions.props $(MicrosoftDotNetSignToolPackageVersion) $(MicrosoftDotNetWebItemTemplates110PackageVersion) $(MicrosoftDotNetWebProjectTemplates110PackageVersion) + $(MicrosoftMcpServerProjectTemplatesPackageVersion) $(MicrosoftDotnetWinFormsProjectTemplatesPackageVersion) $(MicrosoftDotNetWpfProjectTemplatesPackageVersion) $(MicrosoftDotNetXliffTasksPackageVersion) diff --git a/src/Layout/redist/targets/BundledTemplates.targets b/src/Layout/redist/targets/BundledTemplates.targets index 586977f2c69e..3cc6b6047b01 100644 --- a/src/Layout/redist/targets/BundledTemplates.targets +++ b/src/Layout/redist/targets/BundledTemplates.targets @@ -8,6 +8,7 @@ + diff --git a/test/dotnet-new.IntegrationTests/McpServerTemplateTests.cs b/test/dotnet-new.IntegrationTests/McpServerTemplateTests.cs new file mode 100644 index 000000000000..d854c18d6f32 --- /dev/null +++ b/test/dotnet-new.IntegrationTests/McpServerTemplateTests.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Xunit.Sdk; + +namespace Microsoft.DotNet.Cli.New.IntegrationTests +{ + public class McpServerTemplateTests : BaseIntegrationTest, IClassFixture + { + private readonly McpServerTemplateFixture _fixture; + private readonly ITestOutputHelper _log; + + public McpServerTemplateTests(McpServerTemplateFixture fixture, ITestOutputHelper log) : base(log) + { + _fixture = fixture; + _log = log; + } + + [Theory] + [InlineData("mcpserver_local", "mcpserver", "--transport", "local")] + [InlineData("mcpserver_remote", "mcpserver", "--transport", "remote")] + [InlineData("mcpserver_local_no_selfcontained", "mcpserver", "--transport", "local", "--self-contained", "false")] + [InlineData("mcpserver_remote_no_selfcontained", "mcpserver", "--transport", "remote", "--self-contained", "false")] + [InlineData("mcpserver_local_aot", "mcpserver", "--transport", "local", "--aot", "true")] + [InlineData("mcpserver_remote_aot", "mcpserver", "--transport", "remote", "--aot", "true")] + public void AllMcpServerProjectsRestoreAndBuild(string testName, params string[] args) + { + string workingDir = Path.Combine(_fixture.BaseWorkingDirectory, testName); + Directory.CreateDirectory(workingDir); + + new DotnetNewCommand(_log, args) + .WithCustomHive(_fixture.HomeDirectory) + .WithWorkingDirectory(workingDir) + .Execute() + .Should() + .ExitWith(0) + .And + .NotHaveStdErr(); + + new DotnetRestoreCommand(_log) + .WithWorkingDirectory(workingDir) + .Execute() + .Should() + .ExitWith(0) + .And + .NotHaveStdErr(); + + new DotnetBuildCommand(_log) + .WithWorkingDirectory(workingDir) + .Execute() + .Should() + .ExitWith(0) + .And + .NotHaveStdErr(); + + Directory.Delete(workingDir, true); + } + } + + public sealed class McpServerTemplateFixture : SharedHomeDirectory + { + public McpServerTemplateFixture(IMessageSink messageSink) : base(messageSink) + { + BaseWorkingDirectory = Utilities.CreateTemporaryFolder(nameof(McpServerTemplateTests)); + } + + internal string BaseWorkingDirectory { get; private set; } + } +}