MCP podle specifikace: co server opravdu je
Jeden řádek JSON do subprocessu, třináct definic nástrojů zpět a čtení podle revize 2026-07-28 bez handshake.
Na této stránce
Nainstalujte publikovaný MCP server, pošlete mu jeden řádek JSON a přečtěte si, co se vrátí.
npm i @modelcontextprotocol/server-everything@2026.8.31
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
| npx @modelcontextprotocol/server-everything stdio{"result":{"tools":[{"name":"echo","title":"Echo Tool","description":"Echoes
back the input string","inputSchema":{"$schema":"http://json-schema.org/draft-07/
schema#","type":"object","properties":{"message":{"type":"string","description":
"Message to echo"}},"required":["message"]},"annotations":{"readOnlyHint":true,
… … 7,663 bytes on one line …
"jsonrpc":"2.0","id":1}Třináct definic nástrojů, na jediném řádku, z procesu, který přečetl jeden řádek ze svého standardního vstupu. Právě jste promluvili protokolem Model Context Protocol, bez SDK, bez klientské knihovny a bez frameworku. To je celé: transport, formát zpráv a malá sada pojmenovaných metod.
Kapitola 18 definovala nástroj jako dvě věci — JSON Schema, které vidí model, a endpoint ve vašem kódu, který model nikdy nevidí. Kapitola 23 postavila harness, který drží jejich katalog. Ani jedna neodpověděla na otázku, která rozhoduje, jestli je cokoli z toho znovupoužitelné: kdo píše schema a jak se od autora dostane do vašeho prompt? MCP je jedna odpověď na tuto otázku a stojí za to číst ji v originálu, protože skoro všechno, co se o něm píše, popisuje revizi, která už neexistuje.
Tři věci na příkazu, který jste právě spustili, jsou špatně, a každá z nich je oddílem této kapitoly. Nenese žádnou verzi protokolu, takže vyhovující server by ho odmítl. Přesto dostal odpověď, z důvodu, který specifikace označuje jako riziko, ne jako funkci. A požádal o jedno ze tří primitiv, aniž kdy zjistil, že existují další dvě.
Problém, který řeší, a analogie, kterou uvádí sama specifikace
Odkaz na sekci: Problém, který řeší, a analogie, kterou uvádí sama specifikaceNež půjdeme na drát, počítejme. Máte AI aplikací a věcí, na které by měly dosáhnout — kalendář, ticketovací systém, databázi skladu, návrhový nástroj. Bez sdílené smlouvy někdo napíše integrací a každá z nich je schema plus endpoint plus příběh autentizace plus údržbová zátěž. S ní napíše dodavatel nástroje server, dodavatel aplikace napíše klienta a celkový počet je .
To není nová myšlenka a specifikace říká, čí nápad to byl:
MCP takes some inspiration from the Language Server Protocol, which standardizes how to add support for programming languages across a whole ecosystem of development tools. In a similar way, MCP standardizes how to integrate additional context and tools into the ecosystem of AI applications.1
Berte to srovnání doslova, ne jako kompliment. Před tímto protokolem znamenala podpora jazyka v editoru plugin pro každý editor; potom tým jazyka dodal jeden server a každý editor ho dostal. Měřítkem úspěchu nebyla elegance, ale to, že se počet integrací přestal násobit. Totéž platí tady: hodnota je v počtu implementací, ne v návrhu. Protokol, kterým mluví dva produkty, je datový formát s extra ceremonií.
Co je skutečně na drátu
Odkaz na sekci: Co je skutečně na drátuZprávy MCP jsou JSON-RPC 2.0. Požadavek je objekt s jsonrpc, id, method a volitelným params; odpověď nese stejné id a buď result, nebo error; notifikace je požadavek bez id a nedostává odpověď. Specifikace navrch přidává tři omezení: id musí být řetězec nebo číslo a nesmí být null, nesmí kolidovat s jiným požadavkem, který je stále rozpracovaný, a každý výsledek musí nést pole resultType.2
Na transportu stdio — tom, který použil příkaz výše — je pravidlo rámování jeden řádek na zprávu:
Messages are delimited by newlines, and MUST NOT contain embedded newlines. […] The server MUST NOT write anything to its
stdoutthat is not a valid MCP message.3
Ta poslední klauzule je nejčastější způsob, jak se domácí server rozbije, a rozbije se potichu: zatoulané console.log, progress bar, varování o deprecaci ze závislosti, a řádkový parser klienta narazí na něco, co není JSON. Úniková cesta je ve stejném oddílu — server může psát cokoli chce do stderr a klient by to neměl brát jako chybu. Referenční server výše při každém spuštění vypisuje Starting default (STDIO) server... na stderr, proto pipe stále fungovala.
Druhý standardní transport je Streamable HTTP: každá zpráva je POST na jeden endpoint a odpověď je buď JSON objekt, nebo stream Server-Sent Events omezený na daný požadavek — wire formát, který kapitola 14 rozebrala ručně. Sémantika je na obou stejná, protože transport je vazba: definuje rámování a doručení, ne význam.4
První věc, která byla špatně: nebyla tam verze
Odkaz na sekci: První věc, která byla špatně: nebyla tam verzePříkaz výše poslal tools/list a nic dalšího. Podle současné revize je tento požadavek chybný a vyhovující server ho musí odmítnout.
Od 2026-07-28 je MCP bezstavový protokol a specifikace to říká bez kličkování:
The Model Context Protocol (MCP) is a stateless protocol: all the information needed to process a request is contained in the request itself. A server processes each request independently; no state should be inferred from previous requests, even those on the same connection or stream.2
Každý požadavek tedy nese vlastní verzi protokolu a vlastní schopnosti klienta v rezervovaném objektu _meta uvnitř params. Dvě z těchto polí jsou povinná v úplně každém požadavku; požadavek, kterému některé chybí, je chybný a server musí odpovědět -32602:2
klíč _meta | povinné | co to je |
|---|---|---|
io.modelcontextprotocol/protocolVersion | ano | revize, kterou tento požadavek mluví, např. "2026-07-28" |
io.modelcontextprotocol/clientCapabilities | ano | co klient dokáže pro server v tomto požadavku udělat |
io.modelcontextprotocol/clientInfo | ne (ale mělo by) | název a verze klienta, jen pro zobrazení a logy |
io.modelcontextprotocol/logLevel | ne | minimální úroveň logů, kterou má server pro tento požadavek emitovat |
Rozepsaný správný tools/list vypadá takto — a je to naposledy, kdy tato kapitola ukazuje metadata celá, protože odteď jsou v každém požadavku:
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{}}},
"io.modelcontextprotocol/clientInfo":{"name":"bare-hands","version":"0.0.1"}}}}Objekt schopností je vyjednávání. Už neexistuje samostatný krok vyjednávání: klient v každém požadavku deklaruje, co umí, server ve výsledku deklaruje, co umí, a ani jedna strana nesmí použít funkci, kterou druhá nepřiznala. Server, který potřebuje schopnost, již klient nedeklaroval, musí odpovědět -32021 a v data.requiredCapabilities pojmenovat chybějící schopnost. Server, který nemluví požadovanou verzí, musí odpovědět -32022 a vypsat verze, kterými mluví.2
Klienti, kteří chtějí odpověď dopředu, si o ni mohou říct: server/discover je povinné RPC, které v jednom kole vrací podporované verze, schopnosti, identitu a volitelný blok instructions.5 Volat ho je volitelné. Implementovat ho není.
Druhá věc, která byla špatně: server byl legacy
Odkaz na sekci: Druhá věc, která byla špatně: server byl legacyPříkaz fungoval. Podle současné revize neměl, a důvod, proč fungoval, stojí spíš za měření než za odstavec, protože v jednom řádku ukazuje stav celého ekosystému.
Otestujte referenční server tak, jak specifikace modernímu klientovi říká, že má testovat:
echo '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientCapabilities":{}}}}' \
| npx @modelcontextprotocol/server-everything stdio{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"Method not found"}}To je třetí větev pravidla kompatibility: DiscoverResult znamená moderní, rozpoznaná moderní chyba znamená moderní, ale špatná verze, a cokoli jiného — včetně -32601 — znamená legacy, vraťte se na handshake initialize.3 Tak to udělejte a požádejte o současnou revizi:
→ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-07-28",
"capabilities":{},"clientInfo":{"name":"bare-hands","version":"0.0.1"}}}
← {"result":{"protocolVersion":"2025-11-25","capabilities":{"tools":{"listChanged":true},
"prompts":{"listChanged":true},"resources":{"subscribe":true,"listChanged":true},
"logging":{},"tasks":{…},"completions":{}},"serverInfo":{"name":"mcp-servers/everything",
"title":"Everything Reference Server","version":"2.0.0"},"instructions":"…"}}Klient požádal o 2026-07-28 a server odpověděl 2025-11-25. Dne 7. září 2026 oficiální referenční server — npm balíček @modelcontextprotocol/server-everything, verze 2026.8.31, publikovaný 31. srpna 2026 — neimplementuje současnou revizi. Podle dat ji neimplementuje ani TypeScript SDK, na kterém je postavený: release 1.30.0 vyšel 27. července 2026, den před danou revizí.
Čtěte důsledek, ne drby. Skoro všechno, co se o MCP píše, popisuje protokol s handshake initialize, session, požadavkem roots/list, který server posílá klientovi, a transportem HTTP+SSE. Všechny čtyři jsou pryč nebo na odchodu. Když čtete cokoli o MCP, včetně této stránky, první věc, kterou hledat, je číslo revize.
A důvod, proč úplně první příkaz fungoval, je ve specifikaci uveden jako riziko, ne jako funkce:
some legacy servers do not validate that a request arrives after
initializeand would process an era-ambiguous method (such astools/call) under legacy semantics. Probing yields a deterministic failure instead.3
Naměřeno: odeslání tools/list na tento server úplně bez handshake vrací celý katalog. Metoda, která měla být odmítnuta, byla obsloužena, což je přesně důvod, proč specifikace říká nejdřív sondovat pomocí server/discover, i když podporujete jen moderní verze.
Tři role a věta, kterou citovat z celého dokumentu
Odkaz na sekci: Tři role a věta, kterou citovat z celého dokumentuMCP má tři strany a rozdíl mezi prvními dvěma je ten, který lidé slévají dohromady:
Host. Aplikace: chatovací produkt, editor, agent. Vlastní konverzaci, model, přihlašovací údaje a souhlas uživatele. Vytváří klienty a vynucuje bezpečnostní hranici mezi nimi.
Klient. Konektor uvnitř hostu. Každý klient mluví s přesně jedním serverem — striktní vztah 1:1 — a připojuje verzi protokolu a schopnosti ke každému požadavku, který směruje.
Server. Proces nebo služba, která vystavuje zdroje, nástroje a prompts. Může být lokální nebo vzdálený, funguje nezávisle a jeho celý úkol je jedna soustředěná oblast.6
Pravidlo „přesně jeden server“ není účetnictví. Právě ono umožňuje implementovat níže uvedený princip návrhu, a pokud si ze specifikace odnést jen jednu větu, je to tahle:
Servers should not be able to read the whole conversation, nor "see into" other servers. Servers receive only necessary contextual information. Full conversation history stays with the host. Each server maintains isolation. Cross-server interactions are controlled by the host.6
To převrací mentální model, se kterým většina lidí přichází. Weather server, který připojíte ke svému asistentovi, nevidí, na co jste se zeptali. Vidí tools/call s argumenty, které model zvolil, a nic dalšího — ne předchozí tahy, ne váš system prompt, ne výsledky, které před chvílí vrátil calendar server. Pokud dva servery potřebují spolupracovat, host přenese hodnotu z jednoho do druhého, záměrně, protože si o to model řekl. Proto je izolace bezpečnostní vlastnost, o kterou se opírá kapitola 30: kompromitovaný server má malý, definovaný dosah škody a jeho rozšíření vyžaduje spolupráci hostu.
Třetí věc: tři primitiva seřazená podle toho, kdo rozhoduje
Odkaz na sekci: Třetí věc: tři primitiva seřazená podle toho, kdo rozhodujePrvní příkaz požádal tento server o nástroje a dostal třináct. Zeptejte se na další dvě otázky a odpoví i na ně: resources/list vrátí sedm, prompts/list vrátí čtyři. Žádné se neobjevilo, protože se nikdo nezeptal. Tím se dostáváme k pedagogické páteři MCP, která ve specifikaci leží jako tabulka, již téměř nikdo necituje:
| Primitivum | Řízení | Popis | Příklad |
|---|---|---|---|
| Prompts | Řídí uživatel | Interaktivní šablony vyvolané volbou uživatele | Slash příkazy, položky menu |
| Zdroje | Řídí aplikace | Kontextová data připojená a spravovaná klientem | Obsah souborů, git historie |
| Nástroje | Řídí model | Funkce vystavené LLM k provádění akcí | API POST požadavky, zápis souborů |
Ne „tři způsoby, jak vystavit schopnost“. Tři odpovědi na otázku kdo rozhoduje, že se to stane. Model rozhoduje o zavolání nástroje. Aplikace rozhoduje o připojení zdroje. Člověk rozhoduje o spuštění prompt. Když to pochopíte špatně, funkce stále funguje, ale funguje ve špatný okamžik a ze špatného důvodu.
Nejjasněji to ucítíte na kalendáři. Tady je server, který vystavuje stejný kalendář třikrát, jednou jako každé primitivum, ve stovce řádků čistého Node bez závislostí:
const TOOL = {
name: "create_event",
description: "Create a calendar event. Writes to the calendar.",
inputSchema: {
type: "object",
properties: {
title: { type: "string", description: "Event title." },
startsAt: { type: "string", format: "date-time", description: "Start, ISO 8601 UTC." },
},
required: ["title"],
},
};
switch (method) {
case "resources/read":
return ok(id, { contents: [{ uri: "calendar://week",
mimeType: "application/json", text: JSON.stringify(EVENTS) }],
ttlMs: 60000, cacheScope: "private" });
case "prompts/get":
return ok(id, { description: PROMPT.description, messages: [{ role: "user",
content: { type: "text", text: `Read calendar://week and draft a plan. ` +
`Focus: ${params.arguments?.focus ?? "balance"}.` } }] });
case "tools/list":
return ok(id, { tools: [TOOL], ttlMs: 300000, cacheScope: "public" });
}Spusťte ho a zeptejte se všemi třemi způsoby. Skutečný výstup, jedna zpráva na řádek na drátu, tady zalomený pro stránku, s vynechaným požadavkem _meta a blokem identity serveru:
→ resources/read {"uri":"calendar://week"}
← {"resultType":"complete","contents":[{"uri":"calendar://week",
"mimeType":"application/json","text":"[{\"id\":\"e1\",\"title\":\"Standup\",
\"startsAt\":\"2026-09-07T09:00:00Z\"},{\"id\":\"e2\",\"title\":\"Design review\",
\"startsAt\":\"2026-09-09T15:00:00Z\"}]"}],"ttlMs":60000,"cacheScope":"private"}
→ prompts/get {"name":"prepare_week","arguments":{"focus":"deep work"}}
← {"resultType":"complete","description":"Read the week and draft a plan.",
"messages":[{"role":"user","content":{"type":"text",
"text":"Read calendar://week and draft a plan. Focus: deep work."}}]}
→ tools/call {"name":"create_event","arguments":{"title":"Dentist",
"startsAt":"2026-09-10T08:30:00Z"}}
← {"resultType":"complete","content":[{"type":"text",
"text":"Created e3: Dentist at 2026-09-10T08:30:00Z"}],
"structuredContent":{"id":"e3","title":"Dentist","startsAt":"2026-09-10T08:30:00Z"},
"isError":false}Tři metody, tři tvary, jeden kalendář. Teď pointa:
Čtení týdne je zdroj
Odkaz na sekci: Čtení týdne je zdrojJe adresovaný pomocí URI, je inertní a aplikace rozhoduje, zda ho připojí ke konverzaci. Nic v protokolu nedovoluje modelu sáhnout si pro něj samo. Výsledek nese ttlMs a cacheScope, nová v této revizi, aby klient mohl týden na minutu uložit do cache místo pollingu.
Vytvoření události je nástroj
Odkaz na sekci: Vytvoření události je nástrojMá schema, má vedlejší efekty a model rozhoduje, kdy ho zavolat. Jeho výsledek nese isError, což je pole, za které argumentovala kapitola 18: validační chyba se vrací jako výsledek nástroje, který si model může přečíst a opravit, ne jako chyba protokolu.
„Připrav můj týden“ je prompt
Odkaz na sekci: „Připrav můj týden“ je promptJe to pojmenovaná šablona s argumenty, kterou vyvolává člověk — slash příkaz v menu. Vrací zprávy, ne odpověď. Je to způsob, jak může autor serveru dodat formulaci, která funguje s jeho vlastními nástroji, což je přesně znalost, kterou autor serveru má a uživatel ne.
Skoro všichni z těchto tří věcí udělají nástroje. Výsledkem je katalog, kde čtení, které měla aplikace tiše připojit, soutěží o attention modelu se zápisem, který potřebuje schválení, a kde jediná věc, na kterou člověk chtěl tlačítko, leží zahrabaná ve schema. Udělat to správně nic nestojí a rozhoduje se o tom dřív, než napíšete jediný řádek.
Server vám nemůže zavolat
Odkaz na sekci: Server vám nemůže zavolatKalendářový nástroj má jeden povinný argument, title, a volitelný startsAt. Požádejte ho o vytvoření události bez data a vrátí se něco zajímavého:
→ tools/call {"name":"create_event","arguments":{"title":"Dentist"}}
← {"resultType":"input_required",
"inputRequests":{"when":{"method":"elicitation/create","params":{"mode":"form",
"message":"When should \"Dentist\" start?",
"requestedSchema":{"type":"object",
"properties":{"startsAt":{"type":"string","format":"date-time"}},
"required":["startsAt"]}}}},
"requestState":"eyJ0aXRsZSI6IkRlbnRpc3QifQ=="}Server neposlal požadavek. Odpověděl na ten, který dostal, pomocí resultType: "input_required" a popisu toho, co ještě potřebuje. Klient získá odpověď od člověka a potom znovu pošle původní volání — s novým id, které nese inputResponses a zpět opakuje neprůhledné requestState:
→ tools/call {"name":"create_event","arguments":{"title":"Dentist"},
"inputResponses":{"when":{"action":"accept",
"content":{"startsAt":"2026-09-10T08:30:00Z"}}},
"requestState":"eyJ0aXRsZSI6IkRlbnRpc3QifQ=="}
← {"resultType":"complete","content":[{"type":"text",
"text":"Created e3: Dentist at 2026-09-10T08:30:00Z"}],"isError":false}To jsou Multi Round-Trip Requests, zavedené v současné revizi, a nahradily starší návrh, ve kterém servery posílaly JSON-RPC požadavky zpět klientům. Specifikace transportu teď pravidlo říká přímo: „servers do not initiate JSON-RPC requests and clients do not send JSON-RPC responses“.4 Existuje jeden směr iniciativy a patří hostu.
Na tomto mechanismu jedou dvě klientské funkce a jedna z nich má název, o který zakopnete.
Elicitation je server, který žádá člověka o něco: formulář se záměrně omezeným JSON Schema — ploché objekty, primitivní vlastnosti, žádné vnořování — aby ho každý klient mohl vykreslit bez layout enginu. Nese tvrdé pravidlo: servery nesmějí používat režim formuláře k vyžádání „passwords, API keys, access tokens, or payment credentials“ a musejí pro ně použít režim URL, který pošle uživatele na stránku, kterou klient nikdy nečte.7
Sampling je server, který žádá model hostu o generování, takže server může být inteligentní, aniž drží API key. A tady je terminologické varování, protože tohle slovo už v tomto kurzu znamená něco jiného: tohle není sampling z kapitoly 17. Tady nejde o temperature, top-p ani tvar pravděpodobnostního rozdělení. Je to vnořené volání modelu, které cestuje protokolem zpátky.
Je tu i druhý důvod po tom nesahat: od této revize je sampling deprecated, společně s roots a logging, pod SEP-2577, s přímočarou doporučenou migrací — „integrate directly with LLM provider APIs instead of Sampling“.8 Myšlenka neselhala technicky; neobhájila svou plochu v protokolu, a protokol, který umí věci odstraňovat, je zdravější než ten, který to neumí.
Rozbijte to schválně: připojení nejsou sessions
Odkaz na sekci: Rozbijte to schválně: připojení nejsou sessionsBezstavovost zní jako detail wire formátu, dokud ji neotestujete. Vezměte třízprávovou výměnu výše a spusťte každou zprávu v samostatném procesu — čerstvý node calendar.mjs, žádná sdílená paměť, nic nepřenesené:
process A tools/call (no date) → resultType: input_required
requestState: eyJ0aXRsZSI6IkRlbnRpc3QifQ==
process B tools/call (with the answer, same requestState)
→ resultType: complete
"Created e3: Dentist at 2026-09-10T08:30:00Z"
process C resources/read calendar://week
→ events: 2 (Standup, Design review)Proces B, který nikdy neviděl otázku, dokončil multi-round-trip volání, které proces A začal. To je smysl requestState: pokračování cestuje ve zprávě, takže nic nezávisí na tom, že proces je tentýž.
Proces C je selhání. Událost byla vytvořena a není tam — protože toy server drží EVENTS v poli na úrovni modulu a pole na úrovni modulu je stav připojení. Poznámka ve specifikaci chybu pojmenovává přesně:
an open connection, such as a STDIO process, is not a conversation or session: clients may interleave unrelated requests on the same transport, and a server must not treat connection or process identity as a proxy for conversation or session continuity.2
Předepsaná oprava není session. Je to explicitní handle: nástroj pro vytvoření vrátí neprůhledný identifikátor a každé pozdější volání ho bere jako obyčejný argument. Protokol pro něj nemá žádný koncept — „from the wire's perspective a handle is an ordinary string in a tool result and an ordinary argument to subsequent tool calls“.9 Tím dává modelu odpovědnost ho nést a serveru odpovědnost v každém jednotlivém volání ověřit, že tento volající ho smí použít, protože handle je název, ne oprávnění.
Kolik server stojí, než vůbec něco udělá
Odkaz na sekci: Kolik server stojí, než vůbec něco uděláKaždý nástroj, který server vystavuje, je schema, které jde do vašeho prompt při každém požadavku, a kapitola 24 změřila, co to dělá s oknem. MCP přidává druhou položku, kterou je snadné přehlédnout, takže stojí za to spočítat obě na referenčním serveru výše.
13 tool definitions (name + description + inputSchema): 1,307 tokens
cheapest tool, get-tiny-image 52
costliest tool, gzip-file-as-resource 235
server `instructions`, returned by discovery: 312 tokens
------
one server, connected, before it is used: 1,619 tokensDvě pozorování. První je aritmetika: připojte pět serverů této velikosti a zhruba osm tisíc tokenů vašeho okna je obsazeno v každém tahu, navždy, ať model některý z nich použije, nebo ne — což je mechanismus za snížením ze 150 000 na 2 000, které citovala kapitola 24, a důvod, proč existuje just-in-time objevování nástrojů.
Druhé je bezpečnostní poznámka v účetním kostýmu. instructions je text v přirozeném jazyce, napsaný autorem serveru, který přistane v prompt hostu, a popisy nástrojů vedle něj jsou totéž. Specifikace ve svých bezpečnostních principech říká, co s tím dělat: anotace a popisy nástrojů „should be considered untrusted, unless obtained from a trusted server“ a hosté „must obtain explicit user consent before invoking any tool“.1 Připojení MCP serveru není přidání závislosti. Je to udělení cizímu člověku 1 619 tokenů vašeho system prompt a práva být volán. Kapitola 30 je to, co se stane, když je ten cizí člověk nepřátelský.
Datovaný oddíl: revize 2026-07-28 a co rozbíjí
Odkaz na sekci: Datovaný oddíl: revize 2026-07-28 a co rozbíjíVšechno v tomto oddílu platí pro revizi protokolu 2026-07-28, současnou revizi, čtenou 7. září 2026. Revize jsou datované YYYY-MM-DD a datum je poslední okamžik, kdy byla provedena zpětně nekompatibilní změna.10 Normativní dokument je TypeScript soubor, schema/2026-07-28/schema.ts; JSON Schema vedle něj se z něj generuje, proto se zde specifikace čte v TypeScriptu a proto učit MCP z čehokoli jiného znamená učit překlad.
| Co se změnilo | Bylo | Je teď | Rozbíjí |
|---|---|---|---|
| Handshake | initialize + notifications/initialized, jednou na připojení | odstraněn; každý požadavek nese verzi a schopnosti _meta | každý klient napsaný před touto revizí |
| Sessions | hlavička Mcp-Session-Id, stav vázaný na připojení | odstraněny; stav cestuje v explicitních handlech vyražených serverem | list endpointy, které se lišily podle připojení |
| Discovery | odvozené z výsledku initialize | server/discover, které servery musejí implementovat | nic, ale implementace je teď povinná |
| Volání serveru na klienta | server posílal roots/list, sampling/createMessage, elicitation/create | InputRequiredResult a opakování klientem | každý server, který tlačil požadavek na klienta |
| Tvar výsledku | libovolný objekt | povinné resultType: "complete" nebo "input_required" | nic: chybějící pole se musí číst jako "complete" |
| Subscriptions | HTTP GET stream, resources/subscribe | jeden stream subscriptions/listen s opt-in typy | GET endpoint je pryč |
| Obnovení streamu | replay Last-Event-ID na Streamable HTTP | odstraněno; rozbitý stream ztratí požadavek, odešlete znovu s novým id | klienty, které spoléhaly na redelivery |
| Roots | klientská funkce, o kterou servery mohly požádat | deprecated (SEP-2577); předávejte cesty jako argumenty nástrojů nebo resource URI | zatím nic — dvanáctiměsíční okno |
| Sampling a logging | klientské funkce | deprecated (SEP-2577) | zatím nic — dvanáctiměsíční okno |
| Transport HTTP+SSE | deprecated od 2025-03-26 | Deprecated podle lifecycle policy (SEP-2596) | migrujte na Streamable HTTP |
| Registrace klienta | OAuth 2.0 Dynamic Client Registration, RFC 7591 | deprecated ve prospěch Client ID Metadata Documents | ponecháno pro autorizační servery bez nich |
| Chybové kódy | -32002 pro nenalezený zdroj | -32602; -32020–-32099 rezervováno pro specifikaci | nové kódy -32020, -32021, -32022 |
Změna řízení pod touto tabulkou je důležitější než kterýkoli jednotlivý řádek. Tato revize přijala feature lifecycle and deprecation policy: funkce jsou Active, Deprecated nebo Removed, deprecated funkce dokumentuje migrační cestu a zůstává ve specifikaci alespoň dvanáct měsíců, než se stane způsobilou k odstranění, a existuje registr se seznamem všeho, co je aktuálně ve stavu Deprecated.8 Před touto politikou znamenalo „deprecated“ v AI protokolu cokoli, co tvrdil poslední blog post. Teď to znamená datum.
Zobrazit podrobnosti
Extensions, část, o které ještě nikdo nepsal.
Vedle jádra MCP definuje volitelná extensions — „always opt-in and require explicit support from both client and server“, deklarovaná přes pole extensions ve schopnostech klienta i serveru.1 Tři stojí za to znát jménem:
- Tasks (
io.modelcontextprotocol/tasks), přesunuté v této revizi z jádra protokolu do oficiální extension: asynchronní provádění dlouhotrvajících operací, s pollingem přestasks/get, vstupem uprostřed běhu přestasks/updatea trvalými handles. Je to odpověď na nástroj, který trvá dvacet minut, což kapitola 23 řešila progress eventem a signálem, který dojde k nástroji. - Skills over MCP, pracovní skupina, která dělá agent skills — téma kapitoly 28 — objevitelné a použitelné přes protokol.
- MCP Apps, interaktivní UI vykreslené inline v konverzaci: grafy, formuláře, video přehrávače.
A všimněte si, co „vyjednané“ znamená teď: neexistuje initialization, při kterém by se vyjednávalo, takže extension se deklaruje pro každý požadavek jako všechno ostatní.
Kam MCP patří vůči všemu, s čím se plete
Odkaz na sekci: Kam MCP patří vůči všemu, s čím se pleteTady je slovník celého bloku na jednom místě.
| Co to je | Kdo mluví s kým | Kdy je to odpověď | |
|---|---|---|---|
| Obyčejné API | Rozhraní pro program | váš kód ↔ služba | Píšete volajícího. Kontrolujete schema, auth i ošetření chyb a není žádný problém discovery, který by bylo potřeba řešit. |
| MCP | Protokol pro vystavování nástrojů, dat a šablon AI aplikaci | host ↔ server, každý po jednom klientovi | Schopnost napsal někdo jiný a mnoho hostů ji má umět použít bez integrace na míru. |
| RAG | Technika pro hledání textu a jeho vložení do prompt | váš kód ↔ váš index | Model potřebuje něco vědět. Kapitola 19. MCP je způsob, jak dodat retriever; není to retriever. |
| Agent skills | Složka se SKILL.md, který model čte | model ↔ dokument | Znalost je procedurální — jak to my děláme — a je to próza, ne funkce. Kapitola 28. |
| A2A | Protokol pro spolupráci agentů jako rovnocenných stran | agent ↔ agent | Druhá strana uvažuje, plánuje a drží stav napříč dlouhým úkolem, místo aby odpovídala na volání. |
| ACP | Býval samostatný komunikační protokol agentů | — | Už to není živé srovnání. Viz níže. |
Dvě z těchto položek si zaslouží po jedné větě, protože právě tam se zmatek opravdu nachází.
MCP vůči A2A není rivalita a obě specifikace to říkají. Dokumentace A2A kreslí hranici podle toho, co je na druhém konci: MCP „defines how an AI agent interacts with and utilizes individual tools and resources, such as a database or an API“, kde nástroj provádí „specific, often stateless, functions“; A2A řeší agenty, „more autonomous systems“, které „reason, plan, use multiple tools, maintain state over longer interactions, and engage in complex, often multi-turn dialogues“. Její vlastní shrnutí je věta k zapamatování: „A2A is about agents partnering on tasks, while MCP is more about agents using capabilities.“11 Ty dvě věci se vnořují — aplikace používá A2A, aby dosáhla na jiné agenty, a každý agent používá MCP, aby dosáhl na vlastní nástroje. Kapitola 25 nakreslila tuto hranici uvnitř jednoho procesu, mezi tím, kdy se ptáte sub-agent, a tím, kdy mu předáváte konverzaci; A2A ji kreslí mezi organizacemi.
MCP vůči ACP je srovnání se zastaralým předpokladem, a právě proto stojí za odpověď. Agent Communication Protocol byl samostatný otevřený standard pro zprávy mezi agenty. Jeho vlastní dokumentace teď začíná upozorněním: „ACP is now part of A2A under the Linux Foundation!“12 Poctivá odpověď na „MCP nebo ACP?“ v září 2026 je, že otázka má o jednu možnost méně, než naznačují stránky, které se na ni umisťují.
A srovnání, na které se lidé ptají nejčastěji, mcp vs api, má nejméně zajímavou odpověď: MCP je API. Nepřidává sílu, ale konvence — pevnou sadu názvů metod, discovery call, hierarchii řízení nad primitivy a izolační model. Vzdáváte se svobody navrhnout vlastní rozhraní a získáváte každého hosta, který protokolem mluví, což je směna, kterou nabízel každý protokol v historii.
Kam to pokračuje
Odkaz na sekci: Kam to pokračujeTeď už můžete číst specifikaci bez překladatele, rozeznat zdroj od nástroje od prompt podle toho, kdo ho řídí, napsat požadavek ručně, když vám klientská knihovna lže, a datovat každý článek o MCP podle toho, které deprecated funkce stále učí jako současné.
Co jste neudělali, je dodat jeden do produkce. Kapitola 27 napíše stejný server dvakrát — TypeScript a Python vedle sebe, protože MCP je v tomto kurzu jediné opravdu dvojjazyčné území a čísla to říkají oběma směry. Pokryje oba živé transporty pořádně, inspector, balení a tu polovinu protokolu, kterou tato kapitola záměrně nechala stranou: authorization. Protože ve chvíli, kdy je váš server vzdálený, a ne subprocess na vašem vlastním notebooku, předloží klient cizího člověka token a pravidlo specifikace o tom, co s ním smíte udělat, je neobvykle přísné.
Tím vzniká otázka, na kterou musí odpovědět další kapitola, a není přátelská: když na váš server dorazí token vydaný pro audience někoho jiného, co přesně vám brání ho přeposlat dál?
Zdroje a metoda
Odkaz na sekci: Zdroje a metodaKaždá citace, název metody, chybový kód a pravidlo v této kapitole byly přečteny ze specifikace Model Context Protocol, revize 2026-07-28, dne 7. září 2026. Každý trace byl vytvořen lokálně na Node 22: toy calendar server má 101 řádků bez závislostí a referenční server je níže uvedený publikovaný npm balíček. Při psaní této kapitoly nebylo zavoláno žádné placené API — nic tady nepotřebuje model, což je samo o sobě pointa.
Měření: @modelcontextprotocol/server-everything@2026.8.31, publikováno 31. srpna 2026, postaveno na @modelcontextprotocol/sdk@1.30.0, publikovaném 27. července 2026 — jeden den před revizí, kterou tato kapitola popisuje. Na server/discover odpovídá -32601, vyjedná 2025-11-25 při žádosti o 2026-07-28 a servíruje tools/list úplně bez handshake. Jeho katalog má 13 nástrojů v 7 663 bytech; počty tokenů jsou o200k_base přes tiktoken, přes name, description a inputSchema každé definice, což je to, co provider vykreslí do vašeho prompt, ne kolik váží JSON-RPC rámec.
Anthropic, Code execution with MCP: building more efficient agents, 4. listopadu 2025, je zdrojem čísla 150 000 na 2 000, citovaného a použitého v kapitole 24 a zde jen odkazovaného.
Reference
Odkaz na sekci: Reference-
Specifikace,
modelcontextprotocol.io/specification/latest(přesměrovává na/2026-07-28), čteno 7. září 2026. Zdroj srovnání s Language Server Protocol; tvrzení, že specifikace je „based on the TypeScript schema inschema.ts“; shrnutí base protocol („Stateless, self-contained requests“, „Per-request capability negotiation“); seznam extensions (Tasks, Skills over MCP, MCP Apps) a tvrzení, že extensions „are always opt-in and require explicit support from both client and server“; a principy Security a Trust & Safety, včetně „Hosts must obtain explicit user consent before invoking any tool“ a zacházení s anotacemi nástrojů jako s nedůvěryhodnými. ↩ ↩2 ↩3 -
Base Protocol,
modelcontextprotocol.io/specification/2026-07-28/basic. Zdroj omezení JSON-RPC (nenullové id, žádné opětovné použití id, povinnéresultType); oddílu Statelessness a jeho poznámky, že otevřený stdio proces není session; tabulky rezervovaných klíčů_metaa povinného/volitelného statusu každého pole na požadavek; pravidla-32602pro chybějící povinné pole; pravidlaMissingRequiredClientCapability(-32021); a politiky přidělování chybových kódů. ↩ ↩2 ↩3 ↩4 ↩5 -
stdio transport,
modelcontextprotocol.io/specification/2026-07-28/basic/transports/stdio. Zdroj pravidel rámování odděleného novými řádky, požadavku čistotystdout, povolenístderra třívýsledkové sondy zpětné kompatibility — včetně varování, že některé legacy servery zpracují metody nejednoznačné mezi érami bez handshake, což měření v této kapitole reprodukuje. ↩ ↩2 ↩3 -
Přehled transportů,
modelcontextprotocol.io/specification/2026-07-28/basic/transports. Zdroj rámování „a transport is a binding“ a tvrzení, že servery neiniciují JSON-RPC požadavky a klienti neposílají JSON-RPC odpovědi. ↩ ↩2 -
Discovery,
modelcontextprotocol.io/specification/2026-07-28/server/discover. Zdroj povinného statususerver/discover, tvaruDiscoverResulta poleinstructionspopsaného jako „optional natural-language guidance for LLMs on how to use this server effectively“. ↩ -
Architektura,
modelcontextprotocol.io/specification/2026-07-28/architecture. Zdroj definic host/client/server, pravidla 1:1 klient–server, čtyř principů návrhu, z nichž je zde princip izolace citován bez páté odrážky, „Host process enforces security boundaries“, a oddílu o vyjednávání schopností. ↩ ↩2 -
Elicitation,
.../client/elicitation, a Sampling,.../client/sampling. Zdroj dvou režimů elicitation a jejich omezeného schema; zákazu vyžadovat credentials přes režim formuláře; definice sampling, požadavku human-in-the-loop a deprecation warning k němu připojeného. ↩ -
Klíčové změny,
modelcontextprotocol.io/specification/2026-07-28/changelog, a Feature lifecycle and deprecation policy,.../community/feature-lifecycle. Zdroj každého řádku tabulky změn: odstranění sessions a hlavičkyMcp-Session-Id(SEP-2567); bezstavovosti a odstraněníinitialize(SEP-2575);server/discover(SEP-2575);subscriptions/listen(SEP-2575); Multi Round-Trip Requests aresultType(SEP-2322); odstranění obnovitelnosti streamu (SEP-2575); deprecace Roots, Sampling a Logging (SEP-2577); překlasifikování HTTP+SSE (SEP-2596); deprecace Dynamic Client Registration ve prospěch Client ID Metadata Documents; přečíslování chybových kódů; a dvanáctiměsíční deprecation window. ↩ ↩2 -
Tools,
modelcontextprotocol.io/specification/2026-07-28/server/tools, a Server Features,.../server. Zdroj tabulky hierarchie řízení reprodukované výše; tvarůtools/listatools/call; rozlišeníisErrormezi chybami protokolu a chybami provedení nástroje; pravidel pro názvy nástrojů a poznámky k namespace doporučující „prefixing tool names with a server identifier“; a nenormativního guidance „Stateful Tools“ k explicitním handles. ↩ -
Versioning,
modelcontextprotocol.io/specification/versioning. Zdroj schématuYYYY-MM-DD, stavů revizí Draft/Current/Final, potvrzení, že 2026-07-28 je current, a pravidel vyjednávání pro každý požadavek. Tabulka úrovní SDK namodelcontextprotocol.io/docs/sdkuvádí TypeScript, Python, C#, Go a Rust jako Tier 1, Java a Ruby jako Tier 2 a Swift, PHP a Kotlin jako Tier 3. ↩ -
A2A Protocol, verze 1.0.0,
a2a-protocol.org— specifikace a stránka A2A and MCP: Relationship and Distinction, čteno 7. září 2026. Zdroj rozlišení nástrojů vůči agentům, tvrzení, že oba protokoly „address distinct but highly complementary needs“, a formulace partnering/using. ↩ -
Agent Communication Protocol,
agentcommunicationprotocol.dev, čteno 7. září 2026: „ACP is now part of A2A under the Linux Foundation!“, banner přidaný nad specifikaci, která se stále servíruje celá — architecture, agent manifest, agent discovery, message structure, stateful agents, run lifecycle i seznam REST endpointů stále odpovídají 200. Specifikace nezmizela; projekt ano. ↩