Start Debugging

dotnet new mcpserver agora vem embutido no SDK do .NET 11 Preview 4

.NET 11 Preview 4 inclui o template de projeto mcpserver diretamente no SDK. Sem instalar Microsoft.McpServer.ProjectTemplates separado, sem dança de feeds de preview. Escolha transporte stdio ou HTTP, ative Native AOT, e dotnet new mcpserver -o MyServer é toda a configuração.

As notas de release do .NET 11 Preview 4 trazem uma linha pequena mas crítica para quem entrega servidores Model Context Protocol em C#: o template de projeto mcpserver, antes disponível apenas instalando Microsoft.McpServer.ProjectTemplates, agora vem como template embutido no SDK do .NET. O dotnet new list descobre ele sem nenhuma instalação extra, e o servicing viaja com o stack do ASP.NET Core em vez de um pacote NuGet separado.

O que muda em um SDK Preview 4

Até o .NET 11 Preview 3 a receita para um servidor MCP novo era em duas etapas:

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

Em uma imagem de CI limpa ou no primeiro checkout de um colega, o passo dotnet new install era o que quebrava em silêncio: puxava do NuGet, tinha cadência própria, e o template ficava no seu perfil de usuário, que não sobrevive a um devcontainer novo.

Com o Preview 4 (11.0.100-preview.4), o passo um sumiu:

dotnet new mcpserver -o InventoryMcp
cd InventoryMcp
dotnet run

O template é versionado junto com a release do SDK, então um pin de global.json em 11.0.100-preview.4 fixa o template também.

O que você ganha de fábrica

O dotnet new mcpserver --help mostra as opções que o template suporta. As duas que mais importam:

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.

Aqui moram duas escolhas reais:

A flag --aot já liga o Native AOT publish: PublishAot=true no .csproj, source generators compatíveis com AOT para os bindings do protocolo, e o encanamento trim-safe de atributos no registro de tools. Junto com --self-contained, você ganha um executável single-file que abre em dezenas de milissegundos, o que importa para servidores stdio porque o agente os bifurca a cada sessão.

Um esqueleto mínimo stdio fica assim:

// 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}";
}

O logging só-pra-stderr vem cabeado de fábrica, que é a maior cilada de quem está começando: qualquer Console.WriteLine perdido no stdout corrompe o fluxo JSON-RPC e o agente reporta um erro de protocolo sem detalhe útil.

Como encaixa em um projeto existente

Se você já tem um servidor MCP scaffoldado do jeito antigo (veja o walkthrough mais a fundo em Como construir um servidor MCP customizado em C# no .NET 11), não há migração necessária. O template embutido gera as mesmas referências ao pacote ModelContextProtocol que o antigo. A mudança é puramente sobre como projetos novos começam.

O que vale a pena fazer hoje: fixar global.json em 11.0.100-preview.4, tirar a linha dotnet new install Microsoft.McpServer.ProjectTemplates dos docs de setup do time e do devcontainer, e ver sumir uma pergunta de dia de onboarding no Slack.

Comments

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

< Voltar