ЁЯФм рдзрдбрд╛ 06 тАФ Server рдмрд╛рдВрдзрд╛: ~125 рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдУрд│реА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдорд╛рдЧреЗ: lesson-05-transports-security ┬╖ рдкреБрдвреЗ: lesson-07-build-a-client
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ05, рдЖрдгрд┐ рдПрдХрд╛ рдЦрд▒реНрдпрд╛ MCP server рдЪреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдд рд╡рд╛рдЪрди тАФ server/school_server.py тАФ рдЖрдгрд┐ рддреНрдпрд╛рдд рддреБрдордЪреА рдкрд╣рд┐рд▓реА рднрд░.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЙрдкрдХрд░рдг рдмрд╛рдВрдзрдгреЗ рднреАрддрд┐рджрд╛рдпрдХ рд╡рд╛рдЯрддреЗ, рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рдПрдЦрд╛рджреЗ рдЙрдШрдбрд▓реЗрд▓реЗ рдкрд╛рд╣рдд рдирд╛рд╣реА. рдЖрдкрд▓реНрдпрд╛ рдЙрдкрдХрд░рдгрд╛рдд file рдордзреНрдпреЗ рд╡рд░реВрди рдЦрд╛рд▓реА рдиреЗрдордХреЗ рдЪрд╛рд░ рднрд╛рдЧ рдЖрд╣реЗрдд:
- рдЧреБрдВрдбрд╛рд│рд▓реЗрд▓реА рдЧреЛрд╖реНрдЯ ЁЯЧДя╕П тАФ рдПрдХ рдЦреЗрд│рдгреНрдпрд╛рддрд▓рд╛ database (
DB,HOMEWORK). рдЦрд▒реНрдпрд╛ servers рдордзреНрдпреЗ рд╣рд╛рдЪ рд░рдВрдЬрдХ рднрд╛рдЧ рдЕрд╕рддреЛ: рддреБрдордЪрд╛ Postgres, рддреБрдордЪрд╛ API, рддреБрдордЪреА filesystem. MCP рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдкреБрдвреЗ рд▓рд╛рд╡рд▓реЗрд▓рд╛ plug. - рдХрдкреНрдкреНрдпрд╛рдВрдЪреА рдпрд╛рджреА ЁЯУЛ тАФ
TOOLS: рдирд╛рд╡ + рд╡рд░реНрдгрди + inputSchema рдЕрд╢рд╛ рддреАрди рдиреЛрдВрджреА. L03 рдЖрдард╡рд╛: рд╡рд░реНрдгрдиреЗ model рд╕рд╛рдареА рдЕрд╕рддрд╛рдд тАФ рдЖрдкрд▓реА рд╡рд░реНрдгрдиреЗ рдкреНрд░рддреНрдпреЗрдХ tool рдХрд╛рдп рдХрд░рддреЛ рддреЗ рд╕рд╛рдВрдЧрддрд╛рдд рдЖрдгрд┐add_homeworkwrite рдХрд░рддреЛ рд╣реЗрд╣реА (рдзреЛрдХреНрдпрд╛рдЪреЗ рд▓реЗрдмрд▓, L05!). - Dispatcher ЁЯФА тАФ
run_tool(name, args): рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдо рдХрд░рдгрд╛рд░реА рд╕рд╛рдзреА Python if-ladder. рдЗрдереЗ protocol рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рддреА рдПрдХрдЯреА unit-test рдХрд░реВ рд╢рдХрддрд╛. - Plumbing ЁЯФз тАФ
main(): рдПрдХ рдУрд│ рд╡рд╛рдЪрд╛, JSON parse рдХрд░рд╛, badge рддрдкрд╛рд╕рд╛ (рдЪреБрдХреАрдЪреА рдЖрд╡реГрддреНрддреА тЖТ рдЖрдкрдг рдмреЛрд▓рддреЛ рддреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрд╕рд╣-32022), L04 рдордзреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рддреАрди methods рдирд╛ рдЙрддреНрддрд░ рджреНрдпрд╛ (server/discover,tools/list,tools/call), reply рдЫрд╛рдкрд╛. Tool рдЕрдкрдпрд╢ тЖТ рдирдореНрд░isErrorcontent, рдХрдзреАрдЪ crash рдирд╛рд╣реА; рдЕрдЬреНрдЮрд╛рдд tool тЖТ рдпреЛрдЧреНрдп-32602.
рд╣рд╛рдЪ server. рдЕрдзрд┐рдХреГрдд SDKs (Python/TypeScript mcp packages) рддреБрдореНрд╣рд╛рд▓рд╛ decorators,
typed schemas, transports рдЖрдгрд┐ spec рдЪреЗ рдЙрд░рд▓реЗрд▓реЗ рдмрд╛рд░реАрдХрд╕рд╛рд░реАрдХ рднрд╛рдЧ рджреЗрддрд╛рдд тАФ рдЦрд▒реНрдпрд╛ рдХрд╛рдорд╛рд╕рд╛рдареА
рддреЗ рд╡рд╛рдкрд░рд╛ тАФ рдкрдг рддреЗ рдпрд╛рдЪ рдЪрд╛рд░ рднрд╛рдЧрд╛рдВрдЪреЗ automation рдХрд░рддрд╛рдд, рдЖрдгрд┐ рдЖрддрд╛ рддреБрдореНрд╣реА рддреЗ рднрд╛рдЧ рдкрд╛рд╣рд┐рд▓реЗ
рдЖрд╣реЗрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph file["server/school_server.py - the four parts"]
db["1 ЁЯЧДя╕П the wrapped thing<br/>DB + HOMEWORK (yours: Postgres, APIsтАж)"]
tools["2 ЁЯУЛ the shelf: TOOLS<br/>name ┬╖ description(for the model!) ┬╖ inputSchema"]
disp["3 ЁЯФА run_tool()<br/>plain Python if-ladder тАФ unit-testable"]
plumb["4 ЁЯФз main() loop<br/>line in тЖТ JSON-RPC тЖТ line out"]
end
host["ЁЯФМ any MCP host"]
host <-->|"stdio"| plumb
plumb --> disp --> db
plumb --> tools
ЁЯУЦ рдпрд╛ рдУрд│реА рд╡рд╛рдЪрд╛ (рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА рд╣рд░рд╡рдгрд╛рд░ рдирд╛рд╣реА)
- рдУрд│реА 20тАУ25: рднрд╛рдЧ 1, рдЧреБрдВрдбрд╛рд│рд▓реЗрд▓реА рдЧреЛрд╖реНрдЯ (
DB,HOMEWORK) - рдУрд│реА 27тАУ55: рднрд╛рдЧ 2, рдХрдкреНрдкрд╛ (
TOOLS) - рдУрд│реА 57тАУ71: рднрд╛рдЧ 3, dispatcher (
run_tool) - рдУрд│реА 74тАУ84: рднрд╛рдЧ 4a, рджреЛрди reply helpers (рдкреНрд░рддреНрдпреЗрдХ result рд╡рд░ badge +
resultType) - рдУрд│реА 85тАУрд╢реЗрд╡рдЯ: рднрд╛рдЧ 4b, loop тАФ рдЖрдзреА badge рддрдкрд╛рд╕рдгреА, рдордЧ рддреАрди verbs
тЭУ рдХрд╛рдп (рдЪреЛрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рддрдкрд╢реАрд▓)
- рдкреНрд░рддреНрдпреЗрдХ print рд╡рд░
flush=TrueтАФ рд╣реЗ рд╡рд┐рд╕рд░рдгрд╛рд░реЗ stdio servers рдЧреВрдврдкрдгреЗ "рдЕрдбрдХрддрд╛рдд" (рдкрд╣рд┐рд▓рд╛ classic bug: buffered replies рдХрдзреАрдЪ рдкреЛрд╣реЛрдЪрдд рдирд╛рд╣реАрдд). - рдлрдХреНрдд рдЬреЗ рд╡рд┐рдЪрд╛рд░рд▓реЗ рддреНрдпрд╛рд▓рд╛рдЪ рдЙрддреНрддрд░ рджреНрдпрд╛; рдЕрдЬреНрдЮрд╛рдд method + id тЖТ error
-32601. Notifications рдирд╛ errors рдирд╡реНрд╣реЗ, рд╢рд╛рдВрддрддрд╛ рдорд┐рд│рддреЗ. - рджреЛрди рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ errors, рдореБрджреНрджрд╛рдо: protocol error (code рд╕рд╣
error: рдЪреБрдХреАрдЪреА рдЖрд╡реГрддреНрддреА-32022, рдЕрдЬреНрдЮрд╛рдд tool-32602) рд╡рд┐рд░реБрджреНрдз tool error (isError: trueрд╕рд╣result) тАФ рджреБрд╕рд░реА model рд╕рд╛рдареА рдЖрд╣реЗ. - рдкреНрд░рддреНрдпреЗрдХ
reply()resultType: "complete"рдЖрдгрд┐ server рдЪрд╛ badge (_metaтЖТserverInfo) рдЬреЛрдбрддреЛ; list results рдордзреНрдпреЗttlMs/cacheScopeрдЬреЛрдбрд▓реЗ рдЬрд╛рддрд╛рдд, рдореНрд╣рдгрдЬреЗ hosts рдХрдкреНрдкрд╛ cache рдХрд░реВ рд╢рдХрддрд╛рдд. - Tool errors
{"content":[тАж], "isError": true}рдореНрд╣рдгреВрди тАФ model рдЕрдкрдпрд╢ рд╡рд╛рдЪреВ рд╢рдХрддреЛ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддреЛ (agent рдЪрд╛ retry loop, AI рдХреЛрд░реНрд╕ L11, рдпрд╛рд╡рд░рдЪ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ!). - Schemas рдореНрд╣рдгрдЬреЗ рдХрд░рд╛рд░:
"enum": ["3A","3B"]рдореНрд╣рдгрдЬреЗ model рд▓рд╛ рдХрд╛рдпрджреЗрд╢реАрд░ values рд╕рд╛рдВрдЧрд┐рддрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд тАФ рдХрдореА рдЪреБрдХреАрдЪреЗ calls, рдЪрд╛рдВрдЧрд▓реЗ рд╡рд░реНрддрди. рд╕рдореГрджреНрдз schemas рдореНрд╣рдгрдЬреЗ model рд▓рд╛ рджрд┐рд╢рд╛ рджреЗрдгреНрдпрд╛рдЪрд╛ рд╕реНрд╡рд╕реНрдд рдорд╛рд░реНрдЧ. - рдЗрдереВрди рдкреБрдврдЪреНрдпрд╛ рдЦрд▒реНрдпрд╛ рд╕реБрдзрд╛рд░рдгрд╛: рдЕрдзрд┐рдХреГрдд SDK, report cards рд╕рд╛рдареА
resources/list(L03 рдЪрд╛ рдЧреГрд╣рдкрд╛рда!), env-var secrets, рдЖрдгрд┐ рдорд░реНрдпрд╛рджрд┐рдд DB account (least privilege тАФ AWS рдХреЛрд░реНрд╕ L03).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "рдЖрдкрд▓реНрдпрд╛ X рд╕рд╛рдареА MCP server рдмрд╛рдВрдзрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ" рд╣реЗ рдЖрддрд╛ рдЕрд░реНрдзреНрдпрд╛ рдЙрджреНрдпреЛрдЧрд╛рдд sprint ticket рдЖрд╣реЗ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреНрдпрд╛рдЪрд╛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЕрдВрджрд╛рдЬ рджреЗрдК рд╢рдХрддрд╛: plug рдореНрд╣рдгрдЬреЗ рдПрдХ рджрд┐рд╡рд╕ (SDK рдиреЗ рдХрд╛рд╣реА рддрд╛рд╕); рдЦрд░реЗ рдХрд╛рдо рднрд╛рдЧ 1 (рдХрд╛рдп рдЙрдШрдб рдХрд░рд╛рдпрдЪреЗ) рдЖрдгрд┐ рднрд╛рдЧ 2 рдЪреА рд╡рд░реНрдгрдиреЗ + рдзреЛрдХреНрдпрд╛рдЪреА рд▓реЗрдмрд▓реЗ рдЖрд╣реЗ (рд░рдЪрдирд╛, L03/L05). рдЬреЗ teams рд╣реЗ рдмрд░реЛрдмрд░ рдХрд░рддрд╛рдд рддреЗ рдЕрд╕реЗ servers рджреЗрддрд╛рдд рдЬреЗ agents рдЦрд░реЛрдЦрд░ рдмрд░реЛрдмрд░ рд╡рд╛рдкрд░рддрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рдЦрд░реЛрдЦрд░ рд╡рд╛рдврд╡рд╛
# 1) prove the baseline:
python3 client/mini_client.py
# 2) YOUR first tool тАФ add to TOOLS in server/school_server.py:
# {"name":"list_homework","description":"Show the homework list (read-only).",
# "inputSchema":{"type":"object","properties":{}}}
# тАжand to run_tool():
# if name == "list_homework":
# return f"Homework: {json.dumps(HOMEWORK) or '[]'}"
# 3) rerun the client тАФ your tool appears in discovery, callable:
python3 client/mini_client.py --drive
# model calls> list_homework {}
рддреБрдордЪрд╛ рдкрд╣рд┐рд▓рд╛ MCP server рдмрджрд▓: shipped. ЁЯФм
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
list_homework рдЬреЛрдбрд▓реНрдпрд╛рдирдВрддрд░ discovery рдЪрд╛рд░ tools рджрд╛рдЦрд╡рддреЗ рдЖрдгрд┐ --drive тЖТ list_homework {} homework list рдЫрд╛рдкрддреЛ. fly_to_moon {} тЭМ server error -32602: Unknown tool рджреЗрддреЛ (protocol error), рддрд░ lookup_grade {"student":"nobody"} isError рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд result рджреЗрддреЛ (tool рдмреЛрд▓рддреЛ рдЖрд╣реЗ).
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдЦрд▒реНрдпрд╛ MCP server рдЪрд╛ рдХрдкреНрдкрд╛ рдЖрдгрд┐ dispatcher рддреНрдпрд╛рдЪреНрдпрд╛ plumbing рд▓рд╛ рд╣рд╛рдд рди рд▓рд╛рд╡рддрд╛ рдмрджрд▓рд▓рд╛ тАФ рдЖрдгрд┐ spec рдиреЗ рдард░рд╡рд▓реЗрд▓реНрдпрд╛ рджреЛрдиреНрд╣реА рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ errors рдкрд╛рд╣рд┐рд▓реНрдпрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
flush=Trueрд╡рд┐рд╕рд░рдгреЗ тАФ classic "server рдЕрдбрдХрддреЛ" bug: replies buffer рдордзреНрдпреЗрдЪ рдкрдбреВрди рд░рд╛рд╣рддрд╛рдд- debug output stdout рд╡рд░ рдЫрд╛рдкрдгреЗ тАФ stdout рдореНрд╣рдгрдЬреЗрдЪ wire; stderr рд╡рд░ log рдХрд░рд╛
- notifications рдирд╛ (
idрдирд╕рд▓реЗрд▓реЗ messages) рдЙрддреНрддрд░ рджреЗрдгреЗ тАФ рддреНрдпрд╛рдВрдирд╛ рд╢рд╛рдВрддрддрд╛ рдорд┐рд│рддреЗ, рдХрдзреАрдЪ reply рдирд╛рд╣реА - tool рдордзреВрди exceptions рдмрд╛рд╣реЗрд░ рдлреЗрдХрдгреЗ тАФ
isError: truecontent рдкрд░рдд рджреНрдпрд╛ рдореНрд╣рдгрдЬреЗ model рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдК рд╢рдХрддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЕрдзрд┐рдХреГрдд SDKs (Python/TypeScript рд╕рд╛рдареА
mcp) рд╣реЗ рдЪрд╛рд░ рднрд╛рдЧ automate рдХрд░рддрд╛рдд рдЖрдгрд┐ transports, schemas рдЖрдгрд┐ auth рдЬреЛрдбрддрд╛рдд тАФ рдЦрд▒реНрдпрд╛ servers рд╕рд╛рдареА рддреЗ рд╡рд╛рдкрд░рд╛. рддреЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд рдЕрд╕реЗ рд░рдЪрдиреЗрдЪреЗ рдХрд╛рдо рдореНрд╣рдгрдЬреЗ рднрд╛рдЧ 1 рдЖрдгрд┐ 2: рдХрд╛рдп рдЙрдШрдб рдХрд░рд╛рдпрдЪреЗ, рдЖрдгрд┐ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рд▓реЗрдмрд▓рд╛рдВрд╕рд╣ рд╡рд░реНрдгрдиреЗ.
тПня╕П рдкреБрдвреЗ
Socket рдЪреА рджреБрд╕рд░реА рдмрд╛рдЬреВ: mini_client.py рд╡рд╛рдЪрдгреЗ тАФ рдЖрдгрд┐ рд╕рддреНрддрд╛ models рдХрдбреЗ рдирд╡реНрд╣реЗ рддрд░ hosts рдХрдбреЗ рдХрд╛ рдЕрд╕рддреЗ.
git checkout lesson-07-build-a-client