本系列:00 什么是 MCP · 01 协议与心智模型(本文) · 02 Python 框架选型 · 03 部署与调用 · 04 重任务与优化 · 05 从 0 开发 · 06 进阶示例 · 07 阿里云案例
1. 为什么要单独建立「心智模型」
开发 MCP Server 时,常见两类问题混在一处排查:协议没握手 vs 业务逻辑报错。把问题拆成三层,排错路径会清晰很多:
| 层次 | 你关心什么 | 典型故障 |
|---|---|---|
| 协议层 | 传输、握手、JSON-RPC 消息 | Host 未连接、404 session、Origin 403 |
| 原语层 | Tools / Resources / Prompts 如何暴露与调用 | 工具列表为空、模型选错原语 |
| 业务层 | Python 函数、数据库、外部 API | 参数错误、超时、权限不足 |
段末注释:Model Context Protocol(模型上下文协议,MCP)是 AI 应用与外部工具/数据之间的开放连接标准;JSON-RPC(JavaScript Object Notation Remote Procedure Call)为 MCP 消息编码格式。
2. 三层心智模型
1 | flowchart TB |
记忆口诀:传输管「怎么连」,原语管「暴露什么」,业务管「具体干什么」。下文默认协议版本为 2025-11-25(当前稳定实践主干)。
3. 协议层:版本、生命周期与传输
3.1 协议版本
MCP 使用日期字符串标识版本(如 2025-11-25)。客户端与服务器在 initialize 阶段协商版本与能力;Streamable HTTP 下,后续请求应携带 MCP-Protocol-Version 头。
| 版本 | 地位 | 要点 |
|---|---|---|
2024-11-05 |
历史 | 含已弃用的 HTTP+SSE 传输 |
2025-03-26 |
过渡 | 引入 Streamable HTTP |
2025-11-25 |
当前实践主干 | Tasks、结构化输出、传输安全强化等 |
2026-07-28 |
RC / 演进中 | 无会话、无 initialize 握手等(见 §7) |
3.2 典型生命周期(2025-11-25)
1 | sequenceDiagram |
- 连接建立:stdio 由 Host 拉起子进程;HTTP 由 Client POST 到 MCP 端点。
- 初始化:交换协议版本、各自
capabilities(支持 Tools / Tasks / Sampling 等)。 - 发现:
tools/list、resources/list、prompts/list等。 - 执行:
tools/call、resources/read、prompts/get等。 - 结束:stdio 关闭管道;HTTP 可 DELETE 会话(若使用有会话模式)。
3.3 标准传输(仅两种)
| 传输 | 连接方式 | 适用 |
|---|---|---|
| stdio | Host 启动子进程,经 stdin/stdout 交换 JSON-RPC(换行分隔) | 本地 IDE、桌面端、开发调试 |
| Streamable HTTP | 独立 HTTP 进程,POST/GET 到单一 MCP 端点,可 SSE 流式 | 远程部署、多客户端、生产环境 |
重要:协议版本 2025-03-26 起,远程部署应使用 Streamable HTTP;旧版 HTTP+SSE(2024-11-05)已弃用,仅作向后兼容。日志应写 stderr(stdio)或结构化 logging(HTTP),禁止向 stdout 输出非 MCP 消息。
部署与 Host 配置细节见:MCP开发-03.部署方式与调用配置。
段末注释:Server-Sent Events(服务器发送事件,SSE)是一种 HTTP 单向推送机制;Streamable HTTP 可在需要时用 SSE 承载多条服务器消息。
4. 原语层:Server 暴露什么
MCP Server 通过三类原语向模型提供能力,语义不同,选型也不同:
| 原语 | 类比 | 典型用途 | 客户端操作 |
|---|---|---|---|
| Tools | POST / 函数调用 | 执行动作、改状态、跑计算 | tools/call |
| Resources | GET / 只读文档 | 提供上下文、配置、结果摘要 | resources/read |
| Prompts | 模板 / 宏 | 可复用、参数化的交互模板 | prompts/get |
1 | flowchart LR |
实践建议:
- 会改变外部状态或有副作用 → Tool,并在描述中写清。
- 大段只读上下文(文档、schema、上次结果摘要)→ Resource,避免塞进 Tool 返回文本。
- 固定工作流模板(如「按此格式审查代码」)→ Prompt。
进阶代码示例见:MCP开发-06.进阶示例-Resources与Tasks。
5. 能力协商:Server 与 Client 各能做什么
5.1 服务端常见能力
| 能力 | 说明 |
|---|---|
| tools | 暴露可调用工具 |
| resources | 暴露 URI 可读资源 |
| prompts | 暴露提示模板 |
| logging | 向 Client 发送日志消息 |
| completions | 资源/提示的补全建议 |
5.2 客户端常见能力(Server 可反向请求)
| 能力 | 说明 |
|---|---|
| sampling | Server 请求 Host 内的 LLM 生成(如子 Agent) |
| roots | 告知 Server 可访问的文件/目录根 |
| elicitation | Server 向用户请求补充参数(表单式交互) |
开发 Server 时,应假设 Client 能力因 Host 而异:Desktop IDE 可能支持 elicitation,纯 HTTP 网关可能不支持 sampling。
6. 通用工具:Progress、Cancellation、Tasks
除三类原语外,规范还提供跨请求工具,对长任务与可观测性尤其重要。
6.1 Progress(进度通知)
Tool 执行过程中,Server 可通过 notifications/progress 上报进度(百分比、状态文案)。Client 在请求中提供 progressToken 时,Token 在任务全生命周期有效。
Python SDK 中常见写法(概念示例):
1 | from mcp.server.fastmcp import Context, FastMCP |
6.2 Cancellation(取消)
Client 可发送 notifications/cancelled,Server 应协作式停止工作(杀子进程、撤销队列任务等)。取消语义是尽力而为,不保证立即中断。
6.3 Tasks(SEP-1686:call-now, fetch-later)
Tasks 解决同步 tools/call 阻塞导致的超时问题:Server 立即返回 taskId 与 working 状态,Client 通过 tasks/get 轮询、tasks/result 取结果、tasks/cancel 请求取消。
1 | stateDiagram-v2 |
| 方法 | 用途 |
|---|---|
tasks/get |
查询状态;完成时可能内联 result |
tasks/result |
阻塞直到终态并返回结果 |
tasks/list |
列出任务(可按状态过滤) |
tasks/cancel |
请求取消(终态任务会拒绝) |
重任务架构与实现模式见:MCP开发-04.重服务与长任务开发。
段末注释:SEP(Specification Enhancement Proposal,规范增强提案)是 MCP 协议变更的正式提案流程;SEP-1686 定义了 Tasks 原语。
7. 安全基线(Streamable HTTP)
远程 Server 至少应满足:
- Origin 校验:非法
Origin返回 403,防 DNS rebinding。 - 本地绑定:开发环境优先
127.0.0.1,避免0.0.0.0无意暴露。 - TLS:生产环境 HTTPS。
- 认证:OAuth 2.1 等扩展(视场景);勿在 Tool 参数中硬编码密钥。
- 最小权限:Tools 只暴露必要操作;敏感读走 Resource + 授权。
8. 2026 演进路线(预览,非默认实践)
以下基于 2026-07-28 规范 RC 与 SEP-2567,正式版预计 2026-07-28 发布,实施时以最终 spec 为准。
| 变更 | 影响 |
|---|---|
| 移除协议级 Session | 不再依赖 MCP-Session-Id;请求可独立路由,利于负载均衡 |
| 移除 initialize 握手 | 版本与能力随请求携带;Client 可缓存 tools/list(带 ttlMs) |
Mcp-Method / Mcp-Name 头 |
网关可按操作路由,无需解析 body |
| 显式 state handles | 有状态 Tool 由 Server 签发 handle,模型在后续调用中传参 |
迁移提示(现在可做):
- 新部署优先
stateless_http=True(Python SDK),与未来无会话模型对齐。 - 若使用多实例 + 粘性 Session,应规划升级窗口;2026 版将简化网关与扩缩容。
- 教程代码仍以 2025-11-25 + initialize 为准,升级时对照官方 changelog。
9. 与后续篇章的衔接
| 你想… | 阅读 |
|---|---|
| 选 Python 框架 | 02 Python 框架选型 |
| 决定 stdio 还是 HTTP、怎么配 Host | 03 部署与调用 |
| 跑大计算、长任务 | 04 重服务与长任务 |
| 写第一个 Tool | 05 从 0 开发 |
| Tools + Resources + Tasks 完整示例 | 06 进阶示例 |
| 生产案例(阿里云 Argo + OSS/NAS) | 07 阿里云案例 |