模型上下文协议(MCP) 本节摘要:2025 年前,每个 LLM 应用都要为自己的每个工具发明一套 schema——给 Claude 写 JSON,给 ChatGPT 重写,给 Cursor 再写一遍,成了一个 N×M 的集成噩梦。模型上下文协议(Model Context Protocol,MCP)把这个矩阵压平:一套基于 JSON-RPC 的规范,一个服务端暴露工具(tools)、资源(resources)、提示(prompts),任何合规的 host(Claude Desktop、ChatGPT、Cursor、Claude Code、Zed)都能发现并调用它们,无需定制胶水。
本节摘要:2025 年前,每个 LLM 应用都要为自己的每个工具发明一套 schema——给 Claude 写 JSON,给 ChatGPT 重写,给 Cursor 再写一遍,成了一个 N×M 的集成噩梦。模型上下文协议(Model Context Protocol,MCP)把这个矩阵压平:一套基于 JSON-RPC 的规范,一个服务端暴露工具(tools)、资源(resources)、提示(prompts),任何合规的 host(Claude Desktop、ChatGPT、Cursor、Claude Code、Zed)都能发现并调用它们,无需定制胶水。到 2026 年初,MCP 已成为三大厂(Anthropic、OpenAI、Google)及所有主流 Agent 框架的默认工具与上下文协议。本节讲透它的三大原语、握手流程、与 RAG/Agent 框架的边界,并用 FastMCP 写一个最小服务端。
对应原课程:Phase 11 · Lesson 14 ·
model-context-protocol(原英文phases/11-llm-engineering/14-model-context-protocol/docs/en.md)。
阅读完本节,你应当能够:
initialize 握手与能力协商流程。你上线一个聊天机器人,需要三个工具:数据库查询、日历 API、文件读取。你为 Claude 写三套 JSON schema。然后销售要在 ChatGPT 里用同样的工具——你为 OpenAI 的 tools 参数重写。再加 Cursor、Zed、Claude Code——又三遍重写,每家 JSON 约定还有微妙差异。一周后 Anthropic 加了个新字段,你得更新六份 schema。
这是 2025 年前的现实:每个 host(跑 LLM 的东西)和每个 server(暴露工具与数据的东西)都用定制协议。扩展意味着 N×M 集成矩阵。
MCP 把这个矩阵压平:一套基于 JSON-RPC 的规范,一个 server 暴露 tools/resources/prompts,任何合规 host 都能发现并调用。到 2026 年初,MCP 是三大厂及主流 Agent 框架的默认协议。
一个 MCP 服务端只暴露三样东西:
tools、Anthropic 的 tool_use)。每个有名字、描述、JSON Schema 输入、处理函数。{"jsonrpc":"2.0","method":"...","params":{...},"id":N}。发现方法 tools/list、resources/list、prompts/list;调用方法 tools/call、resources/read、prompts/get。每个会话以 initialize 开场:client 发协议版本与自身能力;server 回版本、名字、支持的能力集(tools/resources/prompts/logging/roots)。之后一切按协商的能力进行。
官方 Python SDK 的 FastMCP 用装饰器注册处理函数:
from mcp.server.fastmcp import FastMCP mcp = FastMCP("demo-server") @mcp.tool() def add(a: int, b: int) -> int: """两整数相加。""" return a + b @mcp.resource("config://app") def app_config() -> str: """返回应用当前 JSON 配置。""" return '{"env": "prod", "region": "us-east-1"}' @mcp.prompt() def code_review(language: str, code: str) -> str: """审查代码的正确性与风格。""" return f"你是资深 {language} 审查者。审查:\n\n{code}" if __name__ == "__main__": mcp.run(transport="stdio")
三个装饰器注册三大原语,类型注解自动变成 host 看到的 JSON Schema。在 Claude Desktop 或 Claude Code 里把 server 入口指向这个文件即可运行。
💡 MCP 不是什么:① 不是检索 API——RAG(第 06 节)仍决定拉什么,MCP 只是把检索结果作为 resources 暴露的传输层;② 不是 Agent 框架——MCP 是管道,LangGraph/PydanticAI/OpenAI Agents SDK 等框架在它之上;③ 不绑定 Anthropic——规范与参考实现都在
modelcontextprotocol组织下开源。
| 维度 | 定制工具 schema(前 MCP) | MCP |
|---|---|---|
| 集成成本 | N(host)× M(server) | N + M |
| 跨 host 复用 | 每家重写 | 写一次,处处可用 |
| 发现机制 | 无,硬编码 | tools/list 等动态发现 |
| 生态 | 割裂 | 统一(open spec) |
本节产出 outputs/skill-mcp-server-design.md——MCP 服务端设计清单:三原语如何划分(tools 放动作、resources 放只读数据、prompts 放模板)、传输怎么选(stdio 本地/host 同机、streamable HTTP 远程)、安全注意(工具投毒、OAuth 2.1 见第 13 章 tools-and-protocols)。
initialize 的请求与响应,找出协议版本与能力集字段。*/list,调用用 */call、*/read、*/get。initialize 协商协议版本与能力集,后续按能力进行。@tool/@resource/@prompt)注册三原语,类型注解自动转 JSON Schema。下一节,我们看提示缓存——如何让长系统提示不再每次全价计费。