MCP C# SDK dosáhlo verze 1.0 – co přináší nová specifikace?

Model Context Protocol (MCP) je dnes jedním z nejrychleji rostoucích standardů pro integraci LLM modelů s nástroji a servery. Oficiální C# SDK právě dosáhlo stabilní verze 1.0 s plnou podporou specifikace 2025-11-25. Pojďme se podívat, co nového přináší.
MCP je otevřený protokol, který standardizuje způsob komunikace mezi LLM modely a externími nástroji nebo zdroji dat. Zjednodušeně řečeno: jde o „USB-C pro AI“ – jednotné rozhraní, které umožňuje připojit libovolný nástroj k libovolnému modelu.
Verze 1.0 oficiálního C# SDK přináší celou řadu novinek. Pojďme si je projít.
Vylepšené vyhledávání autorizačního serveru
Předchozí verze specifikace vyžadovala, aby servery poskytovaly odkaz na Protected Resource Metadata (PRM) dokument výhradně přes WWW-Authenticate header. Nová specifikace nabízí serveru tři cesty, jak PRM vystavit: přes URL v parametru resource_metadata hlavičky WWW-Authenticate (jako dříve), na „well-known“ URL odvozené z MCP endpointu (například /.well-known/oauth-protected-resource/public/mcp), nebo na kořenové well-known URL. Klient testuje tato místa postupně.
Konfigurace na straně serveru vypadá takto:
.AddMcp(options =>
{
options.ResourceMetadata = new()
{
ResourceDocumentation = new Uri("https://docs.example.com/api/weather"),
AuthorizationServers = { new Uri(inMemoryOAuthServerUrl) },
ScopesSupported = ["mcp:tools"],
};
});Code language: JavaScript (javascript)
SDK pak automaticky hostuje PRM dokument na well-known URL a přidává odkaz do WWW-Authenticate headeru. Na straně klienta je celá discovery sekvence zvládnuta automaticky.
Ikony pro nástroje, zdroje a prompty
Specifikace nově přidává metadata s ikonami pro Tools, Resources a Prompts. Nejjednodušší varianta využívá atribut:
[McpServerTool(Title = "This is a title", IconSource = "https://example.com/tool-icon.svg")]
public static string ToolWithIcon(...)Code language: PHP (php)
Pro pokročilejší scénáře, kde se nachází více ikon, MIME typy, velikosti, světlé/tmavé téma, lze ikony konfigurovat programaticky přes McpServerToolCreateOptions.Icons. Stejnou podporu získaly i McpServerResourceAttribute, McpServerResourceTemplateAttribute a McpServerPromptAttribute. Ikony jsou pak viditelné například v MCP Inspectoru přímo u seznamu nástrojů.
Inkrementální souhlas se scopesy
Z pohledu bezpečnosti jde o jeden z nejdůležitějších přírůstků – implementaci principu nejmenšího privilegia (Principle of Least Privilege) pro MCP autorizaci.
V minulosti klienti žádali o všechny OAuth scopy najednou, protože nevěděli, které operace je budou potřebovat. Nyní mohou začít s minimem a rozšiřovat přístup podle potřeby. Při prvním nepřihlášeném requestu server odpoví 401 Unauthorized s hlavičkou WWW-Authenticate, která nově obsahuje parametr scopes (jen ty, které daná operace vyžaduje). Pokud pak token potřebný scope nemá, server vrátí 403 Forbidden s error=insufficient_scope a klient si vyžádá token s rozšířenými právy.
C# klient SDK zvládá celý tento flow automaticky. Na straně serveru je nutné implementovat ověření scopesů v ASP.NET Core middlewaru, nikoli uvnitř samotného handleru nástroje, protože HTTP hlavičky musí být nastaveny dříve, než se handler zavolá.
URL elicitace – bezpečné získávání citlivých dat
Elicitace v URL módu umožňuje serveru interagovat s uživatelem zcela mimo MCP host/klient. To je klíčové pro sběr citlivých informací jako jsou API klíče, třetistranové autorizace nebo platební data, tedy věcí, které by bylo bezpečnostní riziko přenášet přes klienta.
Server vygeneruje URL, na které přesměruje uživatele. Co se tam odehraje, je mimo rozsah MCP – může to být formulář, OAuth redirect nebo cokoli jiného. Klient deklaruje podporu tohoto módu přes capabilities:
McpClientOptions options = new()
{
Capabilities = new ClientCapabilities
{
Elicitation = new ElicitationCapability
{
Url = new UrlElicitationCapability()
}
}
};Code language: JavaScript (javascript)
Formulář na elicitační URL by měl z bezpečnostních důvodů obsahovat anti-forgery tokeny (ASP.NET Core má pro to vestavěnou podporu) a data odesílat přes POST, aby se citlivé hodnoty nedostaly do URL a logů.
Volání nástrojů uvnitř samplingu
Tohle je pravděpodobně nejvýkonnější novinka celé specifikace. Servery teď mohou do sampling requestů zahrnout definice nástrojů, které LLM může volat během generování odpovědi.
Flow funguje iterativně: LLM při samplingu požádá o volání nástroje – to je jeho odpověď. Server nástroj spustí a pošle nový sampling request, který obsahuje výsledek volání. Toto se opakuje, dokud LLM nevygeneruje finální odpověď bez dalšího tool callu.
Díky balíčku Microsoft.Extensions.AI je implementace výrazně jednodušší. Na klientovi stačí obalit IChatClient od vašeho LLM providera:
IChatClient chatClient =
new OpenAIClient(new ApiKeyCredential(token), ...)
.GetChatClient(modelId)
.AsIChatClient();
var samplingHandler = chatClient.CreateSamplingHandler();Code language: JavaScript (javascript)
Na straně serveru lze nástroje definovat jako AIFunction objekty a předat je v ChatOptions. Celá složitost iterativního samplingu, jako posílání requestů, zpracování tool calls, translace formátů, je řešena automaticky.
OAuth Client ID Metadata dokumenty
Specifikace zavádí alternativu k Dynamic Client Registration (DCR). Klient jako svůj client_id uvede URL, která odkazuje na JSON dokument s jeho metadaty. Autorizační server URL dereferencuje a z dokumentu si přečte potřebné informace o klientovi.
SDK zkouší CIMD jako první a fallbackuje na DCR, pokud autorizační server CIMD nepodporuje. URL musí používat HTTPS, mít neprázdnou cestu a nesmí obsahovat tečkové segmenty ani fragment.
Dlouhé operace přes HTTP s pollingem
HTTP má timeouty, to je fakt. Nová specifikace výrazně vylepšuje práci s dlouhotrvajícími požadavky. Server při otevření SSE streamu pošle prázdný event s Event ID (a volitelně Retry-After) a pak může stream kdykoli zavřít. Klient se může znovupřipojovat pomocí Event ID bez nutnosti začínat od začátku.
Konfigurace na straně serveru je přímočará:
builder.Services.AddDistributedMemoryCache();
builder.Services
.AddMcpServer()
.WithHttpTransport()
.WithDistributedCacheEventStreamStore()
.WithTools<RandomNumberTools>();Code language: CSS (css)
Handlery nástrojů mohou polling aktivovat voláním EnablePollingAsync na McpRequestContext.
Tasky – primitiv pro trvanlivé operace
Poznámka: Tasky jsou experimentální feature – API se může v budoucích verzích měnit.
Tasky jsou nový primitiv, který poskytuje trvanlivé sledování stavu MCP requestů. Zatímco polling řeší problémy na transportní vrstvě, tasky fungují na datové vrstvě – výsledky jsou uloženy trvanlivě a lze je kdykoli znovu vyzvednout v rámci serverem definovaného retention okna, i když původní spojení dávno zaniklo.
Klient signalizuje zájem o task přidáním pole Task do requestu:
var result = await client.CallToolAsync(
new CallToolRequestParams
{
Name = "processDataset",
Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) }
},
cancellationToken);Code language: JavaScript (javascript)
Task prochází definovaným životním cyklem: working -> input_required (volitelně) -> completed / failed / cancelled. Poslední tři stavy jsou terminální. SDK nabízí PollTaskUntilCompleteAsync pro pohodlné čekání na výsledek, ListTasksAsync pro výpis všech tasků a CancelTaskAsync pro zrušení.
Pro produkci je nutné implementovat IMcpTaskStore s trvanlivým úložištěm (databáze, Redis apod.).
Kde začít?
Zdrojové kódy SDK jsou na GitHubu, changelog specifikace na modelcontextprotocol.io. Ukázkové projekty pro většinu popsaných funkcí jsou k dispozici v repozitáři mcp-whats-new.
Pro více informací: https://devblogs.microsoft.com/dotnet/release-v10-of-the-official-mcp-csharp-sdk/?ref=dailydev
… reposted this!
… liked this!