* Update dotnet-mcp-builder skill to ModelContextProtocol 2.x Align the skill with the C# SDK 2.0.0 release and the MCP 2026-07-28 spec: stable line is now 2.x, HttpServerTransportOptions.Stateless defaults to true, roots/sampling/MCP-channel logging are [Obsolete] (MCP9005) with the multi-round-trip input_required pattern as the replacement, discovery-first negotiation (server/discover) supersedes the initialize handshake, Mcp-Method/Mcp-Name routable headers, raw structuredContent for non-object results, required Tool.inputSchema, and the new ModelContextProtocol.Extensions.Tasks and ModelContextProtocol.Extensions.Apps packages (typed MCP Apps support replacing the hand-rolled _meta/ui:// pattern on 1.x). * Address Copilot review: Apps extension accuracy, header scope, capability ownership - packages.md: the Apps package replaces the manual _meta wiring, not the ui:// resource; note the experimental MCPEXP003 diagnostic; label the 1.x -> 2.0 list as highlights and add the OAuth/SSE runtime changes with a pointer to the full release notes. - transport-http.md: Mcp-Method is on every POST, Mcp-Name only on named invocations (tools/call, prompts/get, resources/read) - do not require it globally at gateways. - mcp-apps.md: current MIME type is text/html;profile=mcp-app (skybridge is a legacy draft value); document [McpAppUi] + WithMcpApps(). - server-features.md: roots/sampling are client capabilities, only logging sits on ServerCapabilities. * Correct stateful HTTP guidance: 2026-07-28 has no HTTP sessions Per the official SDK v2 elicitation docs, a server with Stateless=false refuses the 2026-07-28 revision so dual-path clients fall back to an initialize-capable revision; ElicitAsync cannot be used on 2026-07-28 Streamable HTTP at all. Reframe stateful HTTP as down-level compatibility mode and document the multi-round-trip pattern (InputRequiredException / InputRequest.ForElicitation, retry with InputResponses -> ElicitResult) as the current-protocol way to ask mid-tool, across SKILL.md, transport-http.md, and elicitation.md.
5.1 KiB
NuGet packages and target frameworks
The official packages
All packages live under the ModelContextProtocol NuGet profile. The official C# SDK repo is modelcontextprotocol/csharp-sdk, maintained jointly by the MCP project and Microsoft.
| Package | When to use it | Brings in |
|---|---|---|
ModelContextProtocol |
Default for STDIO servers and most projects | Core + Microsoft.Extensions.Hosting integration, attribute discovery (AddMcpServer, WithToolsFromAssembly, etc.) |
ModelContextProtocol.AspNetCore |
HTTP (Streamable) servers hosted in ASP.NET Core | The above + WithHttpTransport and MapMcp |
ModelContextProtocol.Core |
Pure clients, custom hosts, low-level scenarios where you don't want the Microsoft.Extensions.* dependencies |
Just the protocol + transports + low-level McpServer.Create / McpClient.CreateAsync |
ModelContextProtocol.Extensions.Tasks (2.x) |
Long-running task support (the MCP Tasks extension) | Production replacement for the experimental 1.4.x Tasks APIs; register via WithTasks(...) |
ModelContextProtocol.Extensions.Apps (2.x) |
MCP Apps — interactive UI rendered in the host | Typed [McpAppUi] attribute + .WithMcpApps() registration replacing the hand-rolled _meta wiring of 1.x; you still serve the UI as a ui:// resource, and the APIs are experimental (MCPEXP003) — see mcp-apps.md |
Rule of thumb:
- New STDIO server →
ModelContextProtocol+Microsoft.Extensions.Hosting. - New HTTP server →
ModelContextProtocol.AspNetCoreonly (it transitively pulls in everything you need). - Pure client app →
ModelContextProtocol.Core(orModelContextProtocolif you also want hosting/DI for the client).
Versions
As of mid-2026, the stable line is 2.x (2.0.0 is current at time of writing), aligned with the MCP 2026-07-28 spec. The 0.x line was preview and has breaking differences — if you find docs or blog posts referencing 0.4/0.6, treat them as out of date. The 1.x line still compiles and interoperates, but predates the v2 changes (stateless-by-default HTTP, discovery-first negotiation, roots/sampling/logging deprecations, the Tasks/Apps extension packages) — prefer 2.x for new projects.
Upgrading 1.x → 2.0 (highlights, not exhaustive): stable v1.x APIs keep working; the deprecated capabilities (roots, sampling, logging) are now [Obsolete] with MCP9005 warnings, experimental APIs moved (the 1.4.x Tasks surface → ModelContextProtocol.Extensions.Tasks), and several behaviors flipped (HttpServerTransportOptions.Stateless now defaults to true; non-object tool results emit raw structuredContent values; Tool.inputSchema is required on deserialization). OAuth also changed at runtime — AuthorizationRedirectDelegate → ClientOAuthOptions.AuthorizationCallbackHandler, RFC 9207 issuer validation, mandatory PKCE S256 in metadata, application_type in dynamic registration — and SSE transport failures now propagate the underlying HttpRequestException/TimeoutException. Before upgrading, read the full v2.0.0 release notes.
To check the latest:
dotnet search ModelContextProtocol --prerelease
Target frameworks
The SDK targets .NET 8.0 and netstandard2.0. That means it runs on:
- .NET 8 (LTS)
- .NET 9
- .NET 10 (current LTS — recommended for new projects)
- .NET Framework 4.6.2+ via netstandard2.0 (rare; only for legacy hosts)
For HTTP servers you specifically need a TFM that supports ASP.NET Core (so .NET 8/9/10).
Project setup commands
STDIO server
dotnet new console -n MyMcpServer -f net10.0
cd MyMcpServer
dotnet add package ModelContextProtocol
dotnet add package Microsoft.Extensions.Hosting
HTTP (Streamable) server
dotnet new web -n MyMcpServer -f net10.0
cd MyMcpServer
dotnet add package ModelContextProtocol.AspNetCore
(dotnet new web gives you a minimal ASP.NET Core project — exactly what MapMcp needs.)
Client
dotnet new console -n MyMcpClient -f net10.0
cd MyMcpClient
dotnet add package ModelContextProtocol.Core
Optional but commonly useful
| Package | Why |
|---|---|
Microsoft.Extensions.AI |
Provides IChatClient, ChatMessage, ChatRole, ChatOptions — the abstractions used by AsSamplingChatClient() and by prompt return types. |
Microsoft.Extensions.AI.Abstractions |
Pulled in transitively but worth knowing about for types like DataContent, TextContent. |
OpenTelemetry.Extensions.Hosting |
The SDK emits OTel traces and metrics for tool calls — wire them up if the user has an observability story. |
What about dnx?
Newer Microsoft examples sometimes show launching servers via dnx PackageName --version 1.2.3. That's a valid distribution model: publish your server as a NuGet package and let users run it without cloning. It's orthogonal to how the server itself is built — keep your code identical and just change the launch command.