模型上下文协议(MCP)


文档摘要

模型上下文协议(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)都能发现并调用它们,无需定制胶水。

模型上下文协议(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)都能发现并调用它们,无需定制胶水。到 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)。

学习目标

阅读完本节,你应当能够:

  1. 说清 MCP 要解决的 N×M 集成矩阵问题。
  2. 列举 MCP 服务端暴露的三大原语(tools/resources/prompts)及其含义。
  3. 区分 host、client、server 三个角色。
  4. 描述 initialize 握手与能力协商流程。
  5. FastMCP 写一个最小服务端(三装饰器注册三原语)。
  6. 理解 MCP 不是什么(不是 RAG、不是 Agent 框架、不绑定 Anthropic)。

一、问题与直觉

你上线一个聊天机器人,需要三个工具:数据库查询、日历 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 服务端只暴露三样东西:

  1. Tools(工具)——模型可调用的函数(类比 OpenAI 的 tools、Anthropic 的 tool_use)。每个有名字、描述、JSON Schema 输入、处理函数。
  2. Resources(资源)——模型或用户可请求的只读内容(文件、数据库行、API 响应),用 URI 寻址。
  3. Prompts(提示)——用户可作为快捷方式调用的可复用模板提示。

线协议与角色

  • 线协议:JSON-RPC 2.0,走 stdio、WebSocket 或 streamable HTTP。每条消息是 {"jsonrpc":"2.0","method":"...","params":{...},"id":N}。发现方法 tools/listresources/listprompts/list;调用方法 tools/callresources/readprompts/get
  • host vs client vs server:host 是 LLM 应用(如 Claude Desktop);client 是 host 内负责与某一个 server 通信的子组件;server 是你的代码。一个 host 可同时挂载多个 server。

握手

每个会话以 initialize 开场:client 发协议版本与自身能力;server 回版本、名字、支持的能力集(tools/resources/prompts/logging/roots)。之后一切按协商的能力进行。

最小 MCP 服务端(FastMCP)

官方 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)。

五、练习

  1. 跑通最小服务端:用 FastMCP 写一个带 1 个 tool + 1 个 resource + 1 个 prompt 的服务端,在 Claude Desktop 配置并验证三原语都能被发现与调用。
  2. 资源 vs 工具的边界:把「查询数据库」分别实现为 resource(URI 寻址)和 tool(函数调用),对比两者的调用方式与适用场景。
  3. 握手抓包:用 stdio 模式跑服务端,打印 initialize 的请求与响应,找出协议版本与能力集字段。
  4. 多 server 挂载:在一个 host 里同时挂载两个 MCP server,验证 host 能分别发现各自的 tools。

本节要点回顾

  1. 解决 N×M:MCP 把「每个 host × 每个 server 定制协议」压成「一套 JSON-RPC 规范」,集成成本从 N×M 降到 N+M。
  2. 三大原语:tools(可调用函数)、resources(只读内容,URI 寻址)、prompts(可复用模板提示)。
  3. 线协议:JSON-RPC 2.0 over stdio/WebSocket/streamable HTTP;发现用 */list,调用用 */call*/read*/get
  4. 三角色:host(LLM 应用)、client(host 内子组件,一对一通信)、server(你的代码);一个 host 可挂多 server。
  5. 握手:initialize 协商协议版本与能力集,后续按能力进行。
  6. FastMCP:三装饰器(@tool/@resource/@prompt)注册三原语,类型注解自动转 JSON Schema。
  7. 边界:MCP 不是 RAG(是传输)、不是 Agent 框架(是管道)、不绑定 Anthropic(开放规范)。

下一节,我们看提示缓存——如何让长系统提示不再每次全价计费。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U