Start Debugging

dotnet new mcpserver ist jetzt im SDK von .NET 11 Preview 4 enthalten

.NET 11 Preview 4 bringt das mcpserver-Projekttemplate direkt im SDK mit. Keine separate Microsoft.McpServer.ProjectTemplates-Installation, kein Preview-Feed-Tanz. Wählen Sie stdio- oder HTTP-Transport, aktivieren Sie Native AOT, und dotnet new mcpserver -o MyServer ist das gesamte Setup.

Die .NET 11 Preview 4 Release Notes enthalten eine kleine, aber tragende Zeile für alle, die Model Context Protocol Server aus C# ausliefern: Das Projekttemplate mcpserver, das bisher nur per Installation von Microsoft.McpServer.ProjectTemplates verfügbar war, wird jetzt als gebündeltes Template im .NET SDK ausgeliefert. dotnet new list findet es ohne zusätzliche Installation, und das Servicing läuft mit dem ASP.NET Core Stack statt über ein separates NuGet-Paket.

Was sich mit einem Preview 4 SDK ändert

Bis .NET 11 Preview 3 bestand das Rezept für einen frischen MCP-Server aus zwei Schritten:

# Preview 3 and earlier
dotnet new install Microsoft.McpServer.ProjectTemplates
dotnet new mcpserver -o InventoryMcp

Auf einem sauberen CI-Image oder beim ersten Checkout eines Teamkollegen war der dotnet new install-Schritt derjenige, der leise brach: Er zog aus NuGet, hatte seinen eigenen Rhythmus, und das Template lebte im Benutzerprofil, das einen frischen Devcontainer nicht überlebt.

Mit Preview 4 (11.0.100-preview.4) entfällt Schritt eins:

dotnet new mcpserver -o InventoryMcp
cd InventoryMcp
dotnet run

Das Template wird mit dem SDK-Release versioniert, also fixiert ein global.json-Pin auf 11.0.100-preview.4 auch das Template.

Was Sie out of the box bekommen

dotnet new mcpserver --help zeigt die Stellschrauben, die das Template unterstützt. Die zwei wichtigsten:

dotnet new mcpserver --help

# Options:
#   -f, --framework <net11.0>            The target framework.
#   --transport <stdio|http>             MCP transport type. Default: stdio.
#   --aot                                Enable Native AOT publish.
#   --self-contained                     Enable self-contained publish.

Hier liegen zwei echte Entscheidungen:

Der Schalter --aot verdrahtet Native AOT Publish direkt: PublishAot=true in der .csproj, AOT-kompatible Source Generators für die Protokoll-Bindings und die trim-safe Attribut-Verdrahtung in der Tool-Registrierung. Kombiniert mit --self-contained erhalten Sie eine Single-File Executable, die in zehntelsekunden startet, was für stdio-Server wichtig ist, weil der Agent sie bei jeder Session forkt.

Ein minimales stdio-Grundgerüst sieht so aus:

// Program.cs -- generated by dotnet new mcpserver --transport stdio
using Microsoft.Extensions.Hosting;
using ModelContextProtocol.Server;
using System.ComponentModel;

var builder = Host.CreateApplicationBuilder(args);

builder.Logging.AddConsole(o =>
{
    // stderr only -- stdout is the protocol channel
    o.LogToStandardErrorThreshold = LogLevel.Trace;
});

builder.Services
    .AddMcpServer()
    .WithStdioServerTransport()
    .WithToolsFromAssembly();

await builder.Build().RunAsync();

[McpServerToolType]
public static class EchoTool
{
    [McpServerTool, Description("Echo the input back.")]
    public static string Echo(string message) => $"hello {message}";
}

Das stderr-only-Logging ist von Haus aus eingebaut, was der größte Stolperstein für Erstanwender ist: Ein verirrtes Console.WriteLine auf stdout korrumpiert den JSON-RPC-Stream, und der Agent meldet einen Protokollfehler ohne nützliches Detail.

Wie es zu einem bestehenden Projekt passt

Wenn Sie bereits einen MCP-Server auf die alte Art gescaffoldet haben (siehe die tiefere Begehung in Wie man einen eigenen MCP-Server in C# auf .NET 11 baut), ist keine Migration nötig. Das gebündelte Template generiert dieselben ModelContextProtocol-Paketreferenzen wie das alte. Die Änderung betrifft nur, wie neue Projekte starten.

Was sich heute lohnt: global.json auf 11.0.100-preview.4 pinnen, die Zeile dotnet new install Microsoft.McpServer.ProjectTemplates aus den Team-Setup-Docs und dem Devcontainer streichen und zusehen, wie eine Onboarding-Tag-Frage aus Slack verschwindet.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück