MCP 模型上下文协议:四、概念地图 · 八个概念与五个组件
🇬🇧 English version: mcp-guide/03-concept-map.md | 📦 GitHub: https://github.com/geekchow/mcp-explain
你在哪里: 六个阶段中的第三阶段------下潜之前先画地图。读完本文你会知道: 每一个 MCP 核心概念、每一个关键组件(各自掌管什么、知道什么、刻意不做什么 ),以及它们如何端到端协作。这里还没有内部细节------那是第五阶段。
合格标准: 读完你应该能在白板上把整个架构画出来,并说清每个方框存在的理由。
3.1 领域映射:从问题到概念
MCP 把 01-why 里那个杂乱的现实问题,映射到了八个概念上。请自上而下读:每个概念只用到它上面已经定义过的词。
| 现实问题中的要素 | MCP 概念 | 一句话定义 | 为什么要这个抽象 |
|---|---|---|---|
| "人真正在用的那个 AI 应用" | 宿主 Host | 拥有用户交互、模型对话和安全决策的那个程序 | 总得有人对人类负责。把这个角色命名出来,能让审批与凭据策略集中在一处,而不是散落在每个集成里 |
| "对一个集成的一条连接" | 客户端 Client | 宿主内部的协议连接器,与恰好一个服务器维持恰好一个会话 | 1:1 配对意味着一个行为异常的服务器看不到也污染不了另一个服务器的会话;隔离是结构性的,不是靠纪律 |
| "拥有能力的团队所发布的那个集成" | 服务器 Server | 一个独立程序,通过 MCP 暴露某一个领域的能力 | 解耦发布节奏:支付团队发布支付服务器,完全不用碰 Claude Code |
| "一段协商好特性的连续对话" | 会话与生命周期 | 从 initialize 到运行再到关闭的一段跨度,其中协议版本与能力集是双方约定好的 | 两个独立演进版本的程序,必须在第一次真正调用之前就对彼此支持什么达成一致,否则每次调用都得做特性探测 |
| "一个有后果的动作" | 工具 Tool | 一个具名的、带 JSON Schema 类型的操作,模型可以调用它;附带人类可读的描述与安全标注 | 模型需要类型才能调对 ,需要文字才能选对;宿主需要标注才知道该拦什么 |
| "供阅读的参考材料" | 资源 Resource | 以 URI 标识的、可寻址的只读内容(如 schema://orders/tables),可列举、可读取 |
把"读这个"和"做这个"分开,宿主才能缓存它、用户才能显式挂载它、并且跳过审批------读不是动作 |
| "一种已知好用的提问方式" | 提示 Prompt | 服务器提供的、具名的、可带参数的消息模板,以命令形式呈现给用户 | 服务器作者比模型更清楚自己领域里的正确问法;提示让这份专业知识随集成一起发布 |
| "服务器需要客户端回给它点什么" | 客户端原语: 采样、征询、根目录 | 服务器→客户端的请求:跑一次模型补全(采样 )、向用户要一个结构化输入(征询 )、列出用户的工作目录(根目录) | 让模型和人类都留在宿主那一侧。服务器永远不用持有模型 API 密钥,也永远不用自己画界面 |
还有两个派生概念,后面会遇到,但别和上面八个核心概念混淆:通知 notification (没有 id 因而无需回复的 JSON-RPC 消息,用于 list_changed、进度、取消、日志)和能力 capability(在 initialize 时交换的标志位,声明双方各自支持上述哪些东西)。
#mermaid-svg-gY2nZplJDeChfQrx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gY2nZplJDeChfQrx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gY2nZplJDeChfQrx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gY2nZplJDeChfQrx .error-icon{fill:#552222;}#mermaid-svg-gY2nZplJDeChfQrx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gY2nZplJDeChfQrx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gY2nZplJDeChfQrx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gY2nZplJDeChfQrx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gY2nZplJDeChfQrx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gY2nZplJDeChfQrx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gY2nZplJDeChfQrx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gY2nZplJDeChfQrx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gY2nZplJDeChfQrx .marker.cross{stroke:#333333;}#mermaid-svg-gY2nZplJDeChfQrx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gY2nZplJDeChfQrx p{margin:0;}#mermaid-svg-gY2nZplJDeChfQrx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gY2nZplJDeChfQrx .cluster-label text{fill:#333;}#mermaid-svg-gY2nZplJDeChfQrx .cluster-label span{color:#333;}#mermaid-svg-gY2nZplJDeChfQrx .cluster-label span p{background-color:transparent;}#mermaid-svg-gY2nZplJDeChfQrx .label text,#mermaid-svg-gY2nZplJDeChfQrx span{fill:#333;color:#333;}#mermaid-svg-gY2nZplJDeChfQrx .node rect,#mermaid-svg-gY2nZplJDeChfQrx .node circle,#mermaid-svg-gY2nZplJDeChfQrx .node ellipse,#mermaid-svg-gY2nZplJDeChfQrx .node polygon,#mermaid-svg-gY2nZplJDeChfQrx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gY2nZplJDeChfQrx .rough-node .label text,#mermaid-svg-gY2nZplJDeChfQrx .node .label text,#mermaid-svg-gY2nZplJDeChfQrx .image-shape .label,#mermaid-svg-gY2nZplJDeChfQrx .icon-shape .label{text-anchor:middle;}#mermaid-svg-gY2nZplJDeChfQrx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gY2nZplJDeChfQrx .rough-node .label,#mermaid-svg-gY2nZplJDeChfQrx .node .label,#mermaid-svg-gY2nZplJDeChfQrx .image-shape .label,#mermaid-svg-gY2nZplJDeChfQrx .icon-shape .label{text-align:center;}#mermaid-svg-gY2nZplJDeChfQrx .node.clickable{cursor:pointer;}#mermaid-svg-gY2nZplJDeChfQrx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gY2nZplJDeChfQrx .arrowheadPath{fill:#333333;}#mermaid-svg-gY2nZplJDeChfQrx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gY2nZplJDeChfQrx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gY2nZplJDeChfQrx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gY2nZplJDeChfQrx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gY2nZplJDeChfQrx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gY2nZplJDeChfQrx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gY2nZplJDeChfQrx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gY2nZplJDeChfQrx .cluster text{fill:#333;}#mermaid-svg-gY2nZplJDeChfQrx .cluster span{color:#333;}#mermaid-svg-gY2nZplJDeChfQrx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gY2nZplJDeChfQrx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gY2nZplJDeChfQrx rect.text{fill:none;stroke-width:0;}#mermaid-svg-gY2nZplJDeChfQrx .icon-shape,#mermaid-svg-gY2nZplJDeChfQrx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gY2nZplJDeChfQrx .icon-shape p,#mermaid-svg-gY2nZplJDeChfQrx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gY2nZplJDeChfQrx .icon-shape .label rect,#mermaid-svg-gY2nZplJDeChfQrx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gY2nZplJDeChfQrx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gY2nZplJDeChfQrx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gY2nZplJDeChfQrx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 拥有 1..n 个
经传输层
1:1 会话
提供
提供
提供
提供
提供
提供
驱动
调用
宿主 Host
客户端 Client
服务器 Server
工具 Tools
资源 Resources
提示 Prompts
采样 Sampling
征询 Elicitation
根目录 Roots
模型循环
- 审批闸门
图注:哪个概念归谁------服务器向外提供三个原语,客户端反向提供三个。
3.2 关键组件:也是第五阶段的目录
真正干活的是五个组件。每一个在 05-deep-dives/ 里都有且仅有一篇深入文章,顺序就是它们在贯穿示例中首次登场的顺序。
1. 宿主 ------ Claude Code → 深入 01
- 掌管: 与人的关系。服务器配置与生命周期、模型对话、工具命名空间,以及------最关键的------每一次工具调用之前的审批闸门。
- 知道: 配置了哪些服务器、在什么作用域、跨所有服务器合并后的工具/资源/提示目录、用户的权限规则、到目前为止的对话。
- 刻意不做: 它自己不说 MCP。它从不写一个 JSON-RPC 帧,而是把每条连接委托给一个客户端。它也从不决定一个工具是什么意思------那是服务器的事。
2. MCP 客户端 → 深入 02
- 掌管: 与一个服务器的一个会话:initialize 握手、能力协商、按
id做请求/响应关联、通知、取消、超时,以及把客户端侧原语反向提供给服务器。 - 知道: 协商后的协议版本、服务器声明的能力、在途请求的 id、服务器公布的目录。
- 刻意不做: 复用。一个客户端只对一个服务器------绝不做跨服务器的连接池。它也不解释内容、不向用户提问,这两件事都交给宿主。
3. 传输层 → 深入 03
- 掌管: 把字节送过去,并切分成一条条离散的 JSON-RPC 消息:进程创建与管道(stdio),或 HTTP 请求、SSE 流与会话标识(Streamable HTTP)。
- 知道: 一条消息从哪开始到哪结束;对 HTTP 还知道会话 id 和用于断点续传的 last event id。
- 刻意不做: 它连一个 MCP 方法名都不理解。把 stdio 换成 HTTP,上面每一层都不用改;这种无知就是设计本身。
4. MCP 服务器 → 深入 04
- 掌管: 一个领域的能力。声明自己的工具/资源/提示、校验输入、对真实系统执行、把结果整理成模型读得懂的形状。
- 知道: 自己的目录和模式定义、与底层系统的连接、它自己选择保留的会话状态。
- 刻意不做: 决定某个动作对这个人是否被允许(它只做标注,闸门在宿主)、直接跟模型对话(它通过采样请求)、画用户界面(它通过征询请求)。
5. 授权层 → 深入 05
- 掌管: 证明是谁在调用远程服务器:OAuth 2.1 发现、带 PKCE 的授权码流程、令牌签发、受众绑定与刷新。
- 知道: 受保护资源的元数据、授权服务器的端点、以及为这个用户和这个服务器所持有的令牌。
- 刻意不做: 对 stdio 服务器它根本不存在 ------在那里,操作系统的进程边界,以及你启动服务器时给它的那套环境,就是安全模型。它对本地服务器的缺席本身就是一句设计声明。
#mermaid-svg-Wsn3tdi0wd7d5cEu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Wsn3tdi0wd7d5cEu .error-icon{fill:#552222;}#mermaid-svg-Wsn3tdi0wd7d5cEu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Wsn3tdi0wd7d5cEu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .marker.cross{stroke:#333333;}#mermaid-svg-Wsn3tdi0wd7d5cEu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Wsn3tdi0wd7d5cEu p{margin:0;}#mermaid-svg-Wsn3tdi0wd7d5cEu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster-label text{fill:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster-label span{color:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster-label span p{background-color:transparent;}#mermaid-svg-Wsn3tdi0wd7d5cEu .label text,#mermaid-svg-Wsn3tdi0wd7d5cEu span{fill:#333;color:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .node rect,#mermaid-svg-Wsn3tdi0wd7d5cEu .node circle,#mermaid-svg-Wsn3tdi0wd7d5cEu .node ellipse,#mermaid-svg-Wsn3tdi0wd7d5cEu .node polygon,#mermaid-svg-Wsn3tdi0wd7d5cEu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .rough-node .label text,#mermaid-svg-Wsn3tdi0wd7d5cEu .node .label text,#mermaid-svg-Wsn3tdi0wd7d5cEu .image-shape .label,#mermaid-svg-Wsn3tdi0wd7d5cEu .icon-shape .label{text-anchor:middle;}#mermaid-svg-Wsn3tdi0wd7d5cEu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .rough-node .label,#mermaid-svg-Wsn3tdi0wd7d5cEu .node .label,#mermaid-svg-Wsn3tdi0wd7d5cEu .image-shape .label,#mermaid-svg-Wsn3tdi0wd7d5cEu .icon-shape .label{text-align:center;}#mermaid-svg-Wsn3tdi0wd7d5cEu .node.clickable{cursor:pointer;}#mermaid-svg-Wsn3tdi0wd7d5cEu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .arrowheadPath{fill:#333333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wsn3tdi0wd7d5cEu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Wsn3tdi0wd7d5cEu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wsn3tdi0wd7d5cEu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster text{fill:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu .cluster span{color:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Wsn3tdi0wd7d5cEu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Wsn3tdi0wd7d5cEu rect.text{fill:none;stroke-width:0;}#mermaid-svg-Wsn3tdi0wd7d5cEu .icon-shape,#mermaid-svg-Wsn3tdi0wd7d5cEu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wsn3tdi0wd7d5cEu .icon-shape p,#mermaid-svg-Wsn3tdi0wd7d5cEu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Wsn3tdi0wd7d5cEu .icon-shape .label rect,#mermaid-svg-Wsn3tdi0wd7d5cEu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wsn3tdi0wd7d5cEu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Wsn3tdi0wd7d5cEu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Wsn3tdi0wd7d5cEu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 服务器(深入 04)
传输层(深入 03)
宿主 Claude Code
Bearer 令牌
校验
终端界面
- 审批提示
Agent 循环
模型 + 工具结果
工具注册表
mcp__server__tool
客户端 A 深入 02
客户端 B 深入 02
stdio
按行分帧 JSON
Streamable HTTP
POST + SSE
orders-db
工具 资源 提示
payments
工具 + 征询
授权 OAuth 2.1
深入 05
图注:五个关键组件与两种传输,按它们在贯穿示例中出场的样子排布。
3.3 协作全景
正常路径分成两个截然不同的阶段 ,把它们混为一谈是最常见的新手错误:连接与发现 在启动时发生一次;使用则每个模型轮次都发生。
Claude 模型 服务器 客户端 宿主 Claude Code 用户 Claude 模型 服务器 客户端 宿主 Claude Code 用户 #mermaid-svg-P9zO7aY8v4ciACb5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-P9zO7aY8v4ciACb5 .error-icon{fill:#552222;}#mermaid-svg-P9zO7aY8v4ciACb5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P9zO7aY8v4ciACb5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P9zO7aY8v4ciACb5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P9zO7aY8v4ciACb5 .marker.cross{stroke:#333333;}#mermaid-svg-P9zO7aY8v4ciACb5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P9zO7aY8v4ciACb5 p{margin:0;}#mermaid-svg-P9zO7aY8v4ciACb5 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9zO7aY8v4ciACb5 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-P9zO7aY8v4ciACb5 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-P9zO7aY8v4ciACb5 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-P9zO7aY8v4ciACb5 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-P9zO7aY8v4ciACb5 .sequenceNumber{fill:white;}#mermaid-svg-P9zO7aY8v4ciACb5 #sequencenumber{fill:#333;}#mermaid-svg-P9zO7aY8v4ciACb5 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-P9zO7aY8v4ciACb5 .messageText{fill:#333;stroke:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9zO7aY8v4ciACb5 .labelText,#mermaid-svg-P9zO7aY8v4ciACb5 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .loopText,#mermaid-svg-P9zO7aY8v4ciACb5 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-P9zO7aY8v4ciACb5 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-P9zO7aY8v4ciACb5 .noteText,#mermaid-svg-P9zO7aY8v4ciACb5 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-P9zO7aY8v4ciACb5 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9zO7aY8v4ciACb5 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9zO7aY8v4ciACb5 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9zO7aY8v4ciACb5 .actorPopupMenu{position:absolute;}#mermaid-svg-P9zO7aY8v4ciACb5 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-P9zO7aY8v4ciACb5 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9zO7aY8v4ciACb5 .actor-man circle,#mermaid-svg-P9zO7aY8v4ciACb5 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-P9zO7aY8v4ciACb5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 阶段一 连接与发现 (启动时一次) 阶段二 ------ 使用(每一轮) 为已配置的服务器 创建客户端 1 initialize 协议版本 + 客户端能力 2 result 协议版本 服务器能力 serverInfo 3 notifications/initialized 4 tools/list · resources/list · prompts/list 5 各类目录 6 合并后的目录 已加命名空间 7 自然语言请求 8 对话 + 工具定义 9 tool_use mcp__server__tool(参数) 10 审批闸门 标注 + 用户规则 11 发起调用 12 tools/call 13 result content + structuredContent 14 结果 15 tool_result 16 答案(或下一个工具调用) 17 渲染后的答案 18
图注:五个组件在正常路径上如何配合------发现一次,然后是一串带闸门的调用。
有两条边缘流程在这里只点名,不解剖:
- 服务器发起的轮次 ------ 服务器在处理
tools/call的过程中反向 发出请求(用elicitation/create向用户提问,或用sampling/createMessage借用模型)。在深入 04 追踪,在完整走查里重跑。 - 失败 ------ stdio 服务器在调用中途死掉,或 HTTP 服务器因令牌过期返回
401 Unauthorized。在深入 03 和深入 05 追踪。
📦 配套代码仓库
本文是一个开源指南系列的一部分。整个系列、全部图表源码,以及一个可以直接让 Claude Code 连上去的可运行 MCP 服务器,都在同一个仓库里:
→ https://github.com/geekchow/mcp-explain
| 本页源文件 | mcp-guide-zh/03-concept-map.md |
| 英文原版 | mcp-guide/03-concept-map.md |
| 可运行示例服务器 | mcp-guide/examples/orders-db-server |
| 系列起点 | mcp-guide-zh/00-overview.md |
欢迎指正------如果某个协议细节随新版本发生了变化,欢迎提 issue。