Přejít k navigační liště

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

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

Články AI

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áší.

Nálepky:

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

Komentáře

Odebírat
Upozornit na
guest
0 Komentářů
Nejstarší
Nejnovější Nejvíce hlasů

Proč vám model napíše Python, i když jste si řekli o Rust

AI
Komentáře: 0
Výkonnostní propast mezi Pythonem a ostatními jazyky se za poslední rok a půl skoro zavřela. Dnešní modely zvládají Rust i Go srovnatelně dobře. Když jim ale volbu necháte, sáhnou stejně po Pythonu. A u knihoven je to ještě výraznější: mezi funkčně srovnatelnými balíčky je až 84procentní rozdíl v kvalitě generovaného kódu. Proč to tak je a co s tím.

WP2Shell: Kritická hrozba pro samotné jádro WordPressu. Útočníci mohou získat kontrolu nad webem

Zranitelnost ve WordPressu není žádná novinka. Kdo provozuje weby postavené na této platformě, ví, že bezpečnostní záplaty chodí prakticky pořád. O to větší pozornost by měla vzbudit chyba, u které nic z toho neplatí. A přesně takový je případ zranitelnosti, která dostala přezdívku wp2shell. potřeb. Zranitelný kontaktní formulář, děravý e-shopový plugin, opomenutá kontrola oprávnění v nějaké obskurní rozšiřující knihovně – to je denní chleba každého, kdo sleduje bezpečnostní feedy. Zpráva „nová chyba ve WordPress pluginu“ má tak nízkou informační hodnotu, že ji většina lidí přejde bez mrknutí oka.

Mýtus jedné aplikace: proč PWA nenahradí vývoj pro každou platformu

PWA mohou webu přidat ikonu na ploše, fungování bez připojení, notifikace a některé systémové funkce. Nejsou ale cestou k jednomu klientu pro všechny platformy. Vyplatí se tam, kde se lidé k webu vracejí a ocení okamžitý vstup z odkazu. Jakmile aplikace musí spolehlivě běžet na pozadí nebo fungovat stejně na každém zařízení, bývá vhodnější nativní řešení.