ЁЯПл The SchoolтА║ЁЯФМ MCPтА║ЁЯкк рдзрдбрд╛ 04 тАФ Wire: badge, discovery, calls (protocol рдЖрд╡реГрддреНрддреА 2026-07-28)
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯкк рдзрдбрд╛ 04 тАФ Wire: badge, discovery, calls (protocol рдЖрд╡реГрддреНрддреА 2026-07-28)

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-primitives ┬╖ рдкреБрдвреЗ: lesson-05-transports-security


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ03, рдЖрдгрд┐ рдЦрд░рд╛ рд╕рдВрд╡рд╛рдж, рд╕рдВрджреЗрд╢рд╛-рд╕рдВрджреЗрд╢рд╛рдиреЗ тАФ protocol рдореНрд╣рдгрдЬреЗрдЪ рдЕрд╕рд▓реЗрд▓реА sequence рдЖрдХреГрддреА, рдЖрд╡реГрддреНрддреА 2026-07-28 рдиреБрд╕рд╛рд░ (рд╕рдзреНрдпрд╛рдЪреА; тЭУ рдХрд╛рдп рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪрд╛ box рдХрд╛рдп рдмрджрд▓рд▓реЗ рдЖрдгрд┐ рдХрд╛ рддреЗ рд╕рд╛рдВрдЧрддреЛ).

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдЦреЛрд▓реАрдд рдЙрдкрдХрд░рдг рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдкреВрд░реНрд╡реА рдПрдХрд╛ рдЫреЛрдЯреНрдпрд╛ рд╡рд┐рдзреАрдиреЗ рд╡реНрд╣рд╛рдпрдЪреА ("рдирдорд╕реНрдХрд╛рд░, рдореА socket-standard 2025 рдмреЛрд▓рддреЛ"). рдЖрддрд╛ рдирд╛рд╣реА. рдЖрддрд╛ рдкреНрд░рддреНрдпреЗрдХ message рдУрд│рдЦрдкрддреНрд░рд╛рдЪрд╛ badge рдШрд╛рд▓рддреЛ ЁЯкк, рдореНрд╣рдгреВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд┐рдзреАрдЪреА рдЧрд░рдЬ рдирд╛рд╣реА:

  1. ЁЯкк Badge. рдкреНрд░рддреНрдпреЗрдХ request _meta рдШреЗрдКрди рдпреЗрддреЛ: рдореА рдХреЛрдгрддреА рдЖрд╡реГрддреНрддреА рдмреЛрд▓рддреЛ (io.modelcontextprotocol/protocolVersion), рдореА рдХреЛрдг рдЖрд╣реЗ (тАж/clientInfo) рдЖрдгрд┐ рдореА рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЛ (тАж/clientCapabilities). рдЙрдкрдХрд░рдг рдкреНрд░рддреНрдпреЗрдХ message рд╡рд░рдЪрд╛ badge рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рдЙрддреНрддрд░ рджреЗрддреЗ тАФ рдХрд┐рдВрд╡рд╛ рддреА рдЖрд╡реГрддреНрддреА рдмреЛрд▓рдд рдирд╕реЗрд▓ рддрд░ рддрд╕реЗ рд╕рд╛рдВрдЧрддреЗ (UnsupportedProtocolVersion, рдЖрдгрд┐ рддреЗ рдмреЛрд▓рддреЗ рддреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА). рдРрдЪреНрдЫрд┐рдХ рдкрдг рд╕рднреНрдп: рдУрд│рдЦ (server/discover) тАФ "рддреВ рдХреЛрдг рдЖрд╣реЗрд╕, рдХреЛрдгрддреА рднрд╛рд╖рд╛ рдмреЛрд▓рддреЛрд╕, рдХреЛрдгрддреЗ рдХрдкреНрдкреЗ рднрд░рддреЛрд╕?" рдЖрдкрд▓рд╛ client рдиреЗрд╣рдореА рд╡рд┐рдЪрд╛рд░рддреЛ; client рд╣реЗ рдЯрд╛рд│реВрди рдереЗрдЯ рдмреЛрд▓рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рддрд╣реА рдХрд░реВ рд╢рдХрддреЛ.
  2. ЁЯУЛ "рддреВ рдХрд╛рдп рджреЗрддреЛрд╕?" (tools/list) тАФ рдЙрдкрдХрд░рдг рдЖрдкрд▓рд╛ рдХрдкреНрдкрд╛ рд╡рд╛рдЪреВрди рджрд╛рдЦрд╡рддреЗ: рдирд╛рд╡реЗ, рд╡рд░реНрдгрдиреЗ, input forms.
  3. ЁЯз░ "рддреЗ рдХрд╛рдо рдХрд░." (tools/call рдирд╛рд╡ + arguments рд╕рд╣) тАФ рдЙрдкрдХрд░рдг рдЦрд░реЗ рдХрд╛рдо рдХрд░рддреЗ рдЖрдгрд┐ рдмрд╛рдХрд╛рд╕рд╛рдареА content рдкрд░рдд рджреЗрддреЗ.

рдмрд╕реНрд╕тАж рд╣реАрдЪ рд╕рдВрдкреВрд░реНрдг рднрд╛рд╖рд╛. рддреАрди рдХреНрд░рд┐рдпрд╛рдкрджреЗ рдЖрдгрд┐ рдПрдХ badge. рдкреНрд░рддреНрдпреЗрдХ message JSON-RPC 2.0 рдЕрд╕рддреЛ: requests рдордзреНрдпреЗ id рдЕрд╕рддреЛ (рдЙрддреНрддрд░рд╛рдВрдиреА рддреЛ рдкрд░рдд рд╕рд╛рдВрдЧрд╛рдпрд▓рд╛рдЪ рд╣рд╡рд╛ тАФ рддреНрдпрд╛рд╡рд░реВрдирдЪ socket рдкреНрд░рд╢реНрдирд╛рдЪреА рдЙрддреНрддрд░рд╛рд╢реА рдЬреЛрдбрдгреА рдХрд░рддреЗ), notifications рдордзреНрдпреЗ рдирд╕рддреЛ (рдкрд╛рдард╡рд╛ рдЖрдгрд┐ рд╡рд┐рд╕рд░рд╛ тАФ рдЖрдкрд▓рд╛ server рддреНрдпрд╛рдВрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рддреЛ), errors code рд╕рд╣ error рдореНрд╣рдгреВрди рдпреЗрддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ result resultType: "complete" рд╕рд╛рдВрдЧрддреЛ рдЖрдгрд┐ server рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ badge (_meta тЖТ serverInfo) рдШреЗрдКрди рдпреЗрддреЛ.

ЁЯЧ║я╕П рдЖрдХреГрддреА тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдЧрд│реАрдХрдбреЗ рджрд┐рд╕рдгрд╛рд░рд╛ рдХреНрд░рдо

sequenceDiagram
    participant H as ЁЯФМ client (in the host)
    participant S as ЁЯФм server
    H->>S: 1 server/discover {_meta: protocolVersion, clientInfo, clientCapabilities} тАФ optional
    S-->>H: 2 {resultType, supportedVersions: ["2026-07-28"], capabilities: {tools}, _meta: {serverInfo}}
    H->>S: 3 tools/list {_meta: тАжthe same badge, every time}
    S-->>H: 4 {resultType, tools: [{name, description, inputSchema}, тАж], ttlMs}
    H->>S: 5 tools/call {name: "lookup_grade", arguments: {student: "katrina"}, _meta: тАж}
    S-->>H: 6 {resultType, content: [{type: "text", text: "Katrina (3A) has grade A+."}], isError: false}
    Note over H,S: three verbs and a badge тАФ that's the protocol ЁЯкк (no handshake since 2026-07-28)

тЭУ рдХрд╛рдп

тП│ рдХрд╛рдп рдмрджрд▓рд▓реЗ, рдЖрдгрд┐ рдЬреБрдиреА рдкрджреНрдзрдд рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдЬреВрдирд╣реА рдХрд╛ рднреЗрдЯреЗрд▓. рдЖрд╡реГрддреНрддреА 2025-11-25 рдкрд░реНрдпрдВрдд рдкреНрд░рддреНрдпреЗрдХ session handshake рдиреЗ рд╕реБрд░реВ рд╡реНрд╣рд╛рдпрдЪреЗ тАФ initialize тЖТ notifications/initialized тАФ рдЖрдгрд┐ server рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛рдпрдЪрд╛ (рдПрдХ session; HTTP рд╡рд░ Mcp-Session-Id). рдЖрд╡реГрддреНрддреА 2026-07-28 рдиреЗ рддреЗ рдирд┐рд╡реГрддреНрдд рдХреЗрд▓реЗ: requests рд╕реНрд╡рддрдГрдЪреЗ рд╡рд░реНрдгрди рд╕реНрд╡рддрдГ рдХрд░рддрд╛рдд, sessions рдЧреЗрд▓реЗ, рдЖрдгрд┐ server/discover рд╣рд╛ рдЖрдзреАрдЪ рд╡рд┐рдЪрд╛рд░рдгреНрдпрд╛рдЪрд╛ рдРрдЪреНрдЫрд┐рдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рдЬреБрдиреЗ servers рдЕрдЬреВрдирд╣реА handshake рдЕрдкреЗрдХреНрд╖рд┐рдд рдзрд░рддрд╛рдд; рдЖрдкрд▓рд╛ client рдореБрджреНрджрд╛рдо рдлрдХреНрдд рдЖрдзреБрдирд┐рдХ рдЖрд╡реГрддреНрддреА рдмреЛрд▓рддреЛ, рдЖрдгрд┐ рдЖрдкрд▓рд╛ server рдЬреБрдиреНрдпрд╛ initialize рд▓рд╛ -32022 рдЖрдгрд┐ рддреЛ рдмреЛрд▓рддреЛ рддреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рджреЗрдКрди рдЙрддреНрддрд░ рджреЗрддреЛ тАФ рдЬреБрдиреНрдпрд╛ client рд╢реА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд░рд╛рд╣рдгреНрдпрд╛рдЪрд╛ spec рдиреЗ рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реЗрд▓рд╛ рдорд╛рд░реНрдЧ.

ЁЯдФ рдХрд╛

рдПрдХрджрд╛ рддреБрдореНрд╣реА wire рд╡рд╛рдЪреВ рд╢рдХрд▓рд╛рдд рдХреА MCP debugging рдЕрдВрджрд╛рдЬрдкрдВрдЪреЗ рди рд░рд╛рд╣рддрд╛ k8s рдЪреНрдпрд╛ рдзрдбрд╛ 16 рд╕рд╛рд░рдЦреЗ triage рдмрдирддреЗ: рдкрд╣рд┐рд▓реНрдпрд╛рдЪ request рд╡рд░ -32022? (version mismatch тАФ badge рдиреЗ server рди рдмреЛрд▓рдгрд╛рд▒реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреЗ рдирд╛рд╡ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ.) Tool рдХрдзреАрдЪ call рдЭрд╛рд▓рд╛ рдирд╛рд╣реА? (рд╡рд╛рдИрдЯ рд╡рд░реНрдгрди тАФ model рд▓рд╛ рддреБрдордЪрд╛ рдХрдкреНрдкрд╛ рдиреАрдЯ рджрд┐рд╕рдд рдирд╛рд╣реА, L03.) Call рдЕрдбрдХрддреЛ? (id mismatch рдХрд┐рдВрд╡рд╛ server рдореЗрд▓рд╛ тАФ stderr рддрдкрд╛рд╕рд╛.) "MCP рдЪрд╛рд▓рдд рдирд╛рд╣реА" рдкреИрдХреА рдирд╡реНрд╡рдж рдЯрдХреНрдХреЗ рдкреНрд░рдХрд░рдгреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрддрд╛ рддреЛрдВрдбрдкрд╛рда рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд╣рд╛ messages рдордзреНрдпреЗ рджрд┐рд╕рддрд╛рдд.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рдЖрдХреГрддреА, live

python3 client/mini_client.py

рдпрд╛ рдзрдбреНрдпрд╛рдЪреА sequence рдЖрдХреГрддреА output рд╢реЗрдЬрд╛рд░реА рдареЗрд╡рд╛: messages 1тАУ6, рдХреНрд░рдорд╛рдиреЗ, рдЦрд░реЗ. рдордЧ рдЭрдЯрдкрдЯ рдкреНрд░рд╢реНрди: рдкреНрд░рддреНрдпреЗрдХ тЖТ рдУрд│реАрд╡рд░ рдХреЛрдгрддреЗ field рдЕрд╕рддреЗ? (_meta badge.) рдЖрддрд╛ рдореБрджреНрджрд╛рдо рдореЛрдбрд╛ тАФ mini_client.py рдордзреАрд▓ BADGE рдЪреА META + "protocolVersion" рдУрд│ comment out рдХрд░рд╛, рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд╛, рдЖрдгрд┐ server рдЪрд╛ рдирдХрд╛рд░ рд╡рд╛рдЪрд╛: -32022, рддреЛ рдмреЛрд▓рддреЛ рддреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрд╕рд╣. рддреА рдкрд░рдд рд▓рд╛рд╡рд╛, --drive рд╕рд╣ рдЪрд╛рд▓рд╡рд╛, lookup_grade {"student":"nobody"} call рдХрд░рд╛ тАФ wire рдордзреНрдпреЗ рдирдореНрд░ isError рдЙрддреНрддрд░ рд╢реЛрдзрд╛; рдордЧ рджреБрд╕рд▒реНрдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ error рд╕рд╛рдареА fly_to_moon {}.

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

Scripted run рдиреЗрдордХреНрдпрд╛ рдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рд╕рд╣рд╛ messages рджрд╛рдЦрд╡рддреЛ: server/discover тЖТ рддреНрдпрд╛рдЪрд╛ result (supportedVersions, capabilities, _meta.serverInfo); tools/list тЖТ {resultType, tools:[тАж]}; tools/call тЖТ {resultType, content:[тАж], isError:false}. рдкреНрд░рддреНрдпреЗрдХ тЖТ рдУрд│реАрд╡рд░ io.modelcontextprotocol/protocolVersion: "2026-07-28" рдЕрд╕рд▓реЗрд▓рд╛ _meta badge рдЕрд╕рддреЛ. BADGE рдордзреВрди protocolVersion рдУрд│ рдХрд╛рдврд╛ рдЖрдгрд┐ рдкрд╣рд┐рд▓реЗ рдЙрддреНрддрд░ supported: ["2026-07-28"] рдЪреА рдпрд╛рджреА рджреЗрдгрд╛рд░реЗ error -32022 Unsupported protocol version рдмрдирддреЗ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА рд╕рдзреНрдпрд╛рдЪреЗ MCP lifecycle рдбреЛрд│реНрдпрд╛рдВрдиреА рд╡рд╛рдЪреВ рд╢рдХрддрд╛: рддреАрди рдХреНрд░рд┐рдпрд╛рдкрджреЗ, рдкреНрд░рддреНрдпреЗрдХ request рд╡рд░ badge, рдкреНрд░рддреНрдпреЗрдХ result рд╡рд░ resultType, рдЖрдгрд┐ рддреБрдореНрд╣реА рдШрдбрд╡реВ рд╢рдХрддрд╛ рд╡ рдЬреНрдпрд╛рддреВрди рд╕рд╛рд╡рд░реВ рд╢рдХрддрд╛ рдЕрд╕рд╛ version error.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: version negotiation рдЖрддрд╛ рдкреНрд░рддреНрдпреЗрдХ request рд╡рд░ рд╣реЛрддреЗ, рддреНрдпрд╛рдореБрд│реЗрдЪ load balancer рдорд╛рдЧреАрд▓ рдХреЛрдгрддрд╛рд╣реА server instance рдХреЛрдгрддреНрдпрд╛рд╣реА request рд▓рд╛ рд╕рд╛рдорд╛рдпрд┐рдХ session store рд╢рд┐рд╡рд╛рдп рдЙрддреНрддрд░ рджреЗрдК рд╢рдХрддреЛ. Server рдмрд╛рдЬреВрд▓рд╛ badge (clientInfo, version) log рдХрд░рд╛ тАФ debugging рд╕рд╛рдареА рддреЛ рддреБрдордЪрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдзрд╛рдЧрд╛ рдЖрд╣реЗ.

тПня╕П рдкреБрдвреЗ

Messages рдХрд╕реЗ рдкреНрд░рд╡рд╛рд╕ рдХрд░рддрд╛рдд (stdio рд╡рд┐рд░реБрджреНрдз Streamable HTTP) тАФ рдЖрдгрд┐ рдХрдзреАрдЪ рди рдЯрд╛рд│рд╛рдпрдЪрд╛ security рдзрдбрд╛: transports рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕.

git checkout lesson-05-transports-security

ЁЯкк Lesson 04 тАФ The wire: badge, discovery, calls (protocol revision 2026-07-28)

ЁЯУН You are here: Lesson 04 of 8 ┬╖ Previous: lesson-03-primitives ┬╖ Next: lesson-05-transports-security


ЁЯУж What's in this branch

Lessons 01тАУ03, plus the actual conversation, message by message тАФ the sequence diagram that IS the protocol, as of revision 2026-07-28 (the current one; the box at the end of тЭУ What says what changed and why).

ЁЯзТ Explain like I'm 5

Plugging an instrument into a room used to start with a little ritual ("hello, I speak socket-standard 2025"). Not any more. Now every message wears an ID badge ЁЯкк, so no ritual is needed:

  1. ЁЯкк The badge. Every request carries _meta: which revision I speak (io.modelcontextprotocol/protocolVersion), who I am (тАж/clientInfo) and what I can do (тАж/clientCapabilities). The instrument checks the badge on every message and answers тАФ or, if it doesn't speak that revision, says so (UnsupportedProtocolVersion, listing the revisions it does speak). Optional but polite: introductions (server/discover) тАФ "who are you, what do you speak, which shelves do you stock?" Our client always asks; a client may skip it and just start talking.
  2. ЁЯУЛ "What do you offer?" (tools/list) тАФ the instrument reads out its shelf: names, descriptions, input forms.
  3. ЁЯз░ "Do the thing." (tools/call with name + arguments) тАФ the instrument does real work and hands back content for the desk.

That'sтАж the whole language. Three verbs and a badge. Every message is JSON-RPC 2.0: requests carry an id (answers must quote it back тАФ that's how the socket matches question to answer), notifications don't (fire-and-forget тАФ our server ignores them), errors come as error with a code. Every result says resultType: "complete" and carries the server's own badge (_meta тЖТ serverInfo).

ЁЯЧ║я╕П Diagram тАФ the sequence you'll see everywhere

sequenceDiagram
    participant H as ЁЯФМ client (in the host)
    participant S as ЁЯФм server
    H->>S: 1 server/discover {_meta: protocolVersion, clientInfo, clientCapabilities} тАФ optional
    S-->>H: 2 {resultType, supportedVersions: ["2026-07-28"], capabilities: {tools}, _meta: {serverInfo}}
    H->>S: 3 tools/list {_meta: тАжthe same badge, every time}
    S-->>H: 4 {resultType, tools: [{name, description, inputSchema}, тАж], ttlMs}
    H->>S: 5 tools/call {name: "lookup_grade", arguments: {student: "katrina"}, _meta: тАж}
    S-->>H: 6 {resultType, content: [{type: "text", text: "Katrina (3A) has grade A+."}], isError: false}
    Note over H,S: three verbs and a badge тАФ that's the protocol ЁЯкк (no handshake since 2026-07-28)

тЭУ What

тП│ What changed, and why you'll still meet the old way. Until revision 2025-11-25 every session began with a handshake тАФ initialize тЖТ notifications/initialized тАФ and the server remembered you (a session; Mcp-Session-Id on HTTP). Revision 2026-07-28 retired that: requests are self-describing, sessions are gone, and server/discover is the optional way to ask up front. Older servers still expect the handshake; our client deliberately speaks only the modern revision, and our server answers a legacy initialize with -32022 plus the list of revisions it does speak тАФ the spec's recommended way to be honest with an old client.

ЁЯдФ Why

Once you can READ the wire, MCP debugging becomes lesson-16-of-k8s style triage instead of vibes: -32022 on the first request? (version mismatch тАФ the badge named a revision the server doesn't speak.) Tool never called? (bad description тАФ the model can't see your shelf properly, L03.) Call hangs? (id mismatch or the server died тАФ check stderr.) Ninety percent of "MCP doesn't work" is visible in six messages you now know by heart.

ЁЯзк Try it тАФ the diagram, live

python3 client/mini_client.py

Hold this lesson's sequence diagram next to the output: messages 1тАУ6, in order, real. Then the pop quiz: which field is on EVERY тЖТ line? (The _meta badge.) Now break it on purpose тАФ comment out the META + "protocolVersion" line of BADGE in mini_client.py, rerun, and read the server's refusal: -32022, with the revisions it does speak. Put it back, run with --drive, call lookup_grade {"student":"nobody"} тАФ find the polite isError answer in the wire; then fly_to_moon {} for the other kind of error.

тЬЕ Verify тАФ what you should see

The scripted run shows six messages in this exact order: server/discover тЖТ its result (supportedVersions, capabilities, _meta.serverInfo); tools/list тЖТ {resultType, tools:[тАж]}; tools/call тЖТ {resultType, content:[тАж], isError:false}. Every тЖТ line carries the _meta badge with io.modelcontextprotocol/protocolVersion: "2026-07-28". Remove the protocolVersion line from BADGE and the first reply becomes error -32022 Unsupported protocol version listing supported: ["2026-07-28"].

ЁЯПБ What you just proved

You can read the current MCP lifecycle by eye: three verbs, a badge on every request, resultType on every result, and a version error you can trigger and recover from.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: version negotiation now happens on every request, which is what lets any server instance behind a load balancer answer any request with no shared session store. Log the badge (clientInfo, version) on the server side тАФ it is your best debugging breadcrumb.

тПня╕П Next

How the messages travel (stdio vs Streamable HTTP) тАФ and the security lesson that must not be skipped: transports & trust.

git checkout lesson-05-transports-security
тЖР PreviousprimitivesNext тЖТtransports security

This page is the lesson's README from the lesson-04-the-wire branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.