通读笔记 — Learn Model Context Protocol with TypeScript
原书 12 个正文章(text/03–14),导航章(01 前言/02 序言/15–17 促销+索引)跳过不引。 作者 Christoffer Noring(Packt, 2025-11-21)。书内代码仓:PacktPublishing/Learn-Model-Context-Protocol-with-TypeScript。
Ch1 Introducing the MCP (text/03, ~9.9k)
- 历史线 SOAP→REST→GraphQL(N+1 问题)→gRPC(HTTP/2+Protobuf),各自的问题(:55-125)。
- 为什么需要标准:开发者「太会编程」,什么都能胶水起来,但代价高(:165-189);prompt 成为新交互方式,LLM 与应用能力要不要分开(:141-153)。
- MCP 定义:官方说法「USB-C port for AI applications」(:317-329);mcp.json 列出服务器,client 即接(:203-217)。
- 可能性:Blender MCP(GitHub ahujasid/blender-mcp)、GitHub/Playwright/Google Maps MCP;modelcontextprotocol/servers 列表(:237-291)。
- 「If you know how to prompt, you're Neo」(:265)。
- 本章很浅,纯动机章。可引:历史线一句话、USB-C 比喻、glue 代价。
Ch2 Explaining the MCP (text/04, ~53k) — 全书最重的协议章
- 方法:不靠架构图,带你徒手实现协议(不用 SDK)。JSON-RPC 消息四字段 jsonrpc/id/method/params(:21-48)。
- Transport 接口 TypeScript 定义 start/send/close/onclose/onerror/onmessage(:122-133);MCP transport agnostic(:98)。
- STDIO 实现:readline 服务器 + spawn 子进程客户端(:179-341);运行输出样例(:406-409)。
- 握手三步:initialize(带 protocolVersion 2024-11-05 + capabilities + clientInfo)→ 服务器回 capabilities(logging/prompts/resources/tools)+ serverInfo → client 发 notifications/initialized;之前发别的要报错(:486-690)。
- 实现要点:once 监听 + Promise 包装流回调,connect() 伪码到真码(:698-990);服务器侧 initialized 状态机(:1036-1149)。
- features:tools/list、tools/call 响应结构 content.items 文本块(:1446-1496);Promise+流整合 _handleMessageResponse/_makeRequest/_serializeMessage(:1354-1399, 1821-1876)。
- 运行输出实例(initialize response 全文,Tools response ExampleTool)(:1416-1442)。
- Notifications:双向,notifications/cancelled、notifications/progress;schema 引用 2025-03-26(:1659-1699);onnotification 变量模式(:1719-1772)。
- Sampling:服务器反向请求客户端 LLM(:1913-1945);请求字段 messages/modelPreferences(hints/costPriority/speedPriority/intelligencePriority)/systemPrompt/includeContext/temperature/maxTokens(:1963-1993);响应 model/stopReason/role/content(:2011-2039);电商产品描述场景,sampling/createMessage 实例(:2041-2083);实现 ExternalService 事件→server 发 sampling→client onsampling→callLLM(mock)→回包(:2091-2346);human in the loop(:2350-2356)。
- SSE transport:/messages + /sse 两个路由,GET 长连接,text/event-stream(:2368-2404)。
- Streamable HTTP:单一 /mcp 路由 POST,服务器可选 JSON 或 SSE 应答,client 要 accept 两种(:2416-2476)。
- 关键出处短语:
USB-C在 ch1;握手在notifications/initialized(:688);sampling 定义I don't know how to do this(:1923)。 - 注意:书基于 protocolVersion 2024-11-05 示例 + 2025-03-26 schema;我们 mcp-spec 拆解是 2026-07-28(无状态化)。书里有状态握手 vs 新规范每请求自带身份——重要②类锚对照点。
Ch3 Building and Testing Servers (text/05, ~27.5k)
- 三件套概念:Resources(静态数据/上下文,类简化 RAG,:130-223;固定名 vs ResourceTemplate 模板 settings://{type});Tools(函数,Zod schema,:225-269);Prompts(模板消息,:271-302)。
- 运行时列表:TS/Python/.NET/Java/Kotlin/Rust/Go(:310)。
- 测试三法:Inspector(npx @modelcontextprotocol/inspector,UI+CLI,--cli --method)、cURL(仅 HTTP 系)、单测(书中竟用 pytest/FastMCP Python 例子,:524-530——TS 书的瑕疵)。
- First server 五步:package.json(@modelcontextprotocol/sdk ^1.8.0, zod, bin/scripts)、tsconfig(ES2022/Node16)、McpServer 实例、server.tool(multiply)/server.resource(get_greeting greeting://{name})/server.prompt(review-code)、main 里 STDIOServerTransport + server.connect(:558-943)。
- Inspector CLI 输出实例:tools/list 返回 inputSchema/outputSchema(multiply);tools/call 2*4=8 带 structuredContent;resources/list 空 vs resources/templates/list(模板资源不在普通列表!,:1128-1146);resources/read greeting://chris→Hello, chris!;prompts/list/get(:997-1213)。
- 作业:电商 STDIO server(get-orders/place-order/add-to-cart/products 等 11 个工具+product_catalog 资源,:1231-1359)。
- 瑕疵:书名 TS 但测试例子用 Python;prompt 名 review-code vs review_code 不一致。
Ch4 Building SSE Servers (text/06, ~17.5k)
- SSE 已废弃:「SSE transport has been deprecated in favor of Streamable HTTP transport per May 2025」(:23);但 2000+ 野生服务器还在用(:25)。
- SSE 概念:text/event-stream、EventSource、单向 server→client、长连接(:53-83);MCP 里拆两个端点 /sse(握手长连)+ /messages(消息路由)(:85-105)。
- Express 实现:SSEServerTransport('/messages', res),transports.sse[sessionId] 表,res.on("close") 清理,POST /messages 按 query sessionId 找 transport.handlePostMessage(:131-150, 405-445)。
- 测试:Inspector 要选 Transport Type=SSE + URL;cURL 三步——GET /sse 拿 event: endpoint 带 session_id → POST /messages?session_id 发 notifications/initialized → POST tools/list,响应出现在第一个终端(:248-290, 638-710)。
- add 工具 5+10=15 走查(:489-636)。