模型上下文协议(MCP)

摘要

模型上下文协议(Model Context Protocol, MCP)是一套基于 JSON-RPC 2.0 的开放标准化协议,通过定义统一的交互规范与能力原语,在大语言模型应用与外部数据、工具、业务系统之间构建标准化接入层。针对 AI Agent 外部系统对接成本高、协议碎片化的痛点,本文从协议架构、三层角色、三类原语与生命周期四个维度解析 MCP 技术规范,结合 Python SDK 示例辨析其与 Function Calling、LSP 的边界,并总结安全最佳实践。研究表明 MCP 可显著降低多系统集成成本,是构建可扩展 Agent 系统的关键基础设施。

关键词:模型上下文协议;AI Agent;JSON-RPC;工具调用


1 引言

大语言模型驱动的智能体(AI Agent)已成为人工智能落地的核心形态,其核心能力边界取决于外部系统的接入广度与深度。在传统开发模式中,Agent需针对文档系统、日历服务、数据库、业务接口等不同外部系统进行点对点API适配,不同系统的调用格式、认证机制、返回结构差异显著,导致集成代码冗余、迁移成本高、生态碎片化严重1。

模型上下文协议(Model Context Protocol,简称MCP)应运而生,它是由社区主导的开放协议,设计灵感源自语言服务器协议(Language Server Protocol, LSP),核心目标是标准化LLM应用与外部能力的接入方式,被业界称为"AI领域的USB接口"2。支持MCP的AI应用可自动发现、接入并调用符合规范的外部服务,无需重复开发适配层,大幅提升Agent系统的可扩展性与可维护性。

本文面向Agent开发者,从协议规范、架构设计、工程实现、安全实践四个层面展开论述,为Agent系统的外部能力接入提供完整的技术参考。

2 协议底层架构

MCP采用分层设计,自下而上分为传输层与数据层,基于JSON-RPC 2.0构建标准化消息交互机制。

2.1 协议分层模型

MCP的协议栈分为两层,各层职责边界清晰,可独立演进:
#mermaid-svg-u4Hi8HSTMaDVZKw5{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-u4Hi8HSTMaDVZKw5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .error-icon{fill:#552222;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .marker.cross{stroke:#333333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 p{margin:0;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster-label text{fill:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster-label span{color:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster-label span p{background-color:transparent;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .label text,#mermaid-svg-u4Hi8HSTMaDVZKw5 span{fill:#333;color:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .node rect,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node circle,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node ellipse,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node polygon,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .rough-node .label text,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node .label text,#mermaid-svg-u4Hi8HSTMaDVZKw5 .image-shape .label,#mermaid-svg-u4Hi8HSTMaDVZKw5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .rough-node .label,#mermaid-svg-u4Hi8HSTMaDVZKw5 .node .label,#mermaid-svg-u4Hi8HSTMaDVZKw5 .image-shape .label,#mermaid-svg-u4Hi8HSTMaDVZKw5 .icon-shape .label{text-align:center;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .node.clickable{cursor:pointer;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .arrowheadPath{fill:#333333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-u4Hi8HSTMaDVZKw5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u4Hi8HSTMaDVZKw5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster text{fill:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .cluster span{color:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 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-u4Hi8HSTMaDVZKw5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-u4Hi8HSTMaDVZKw5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .icon-shape,#mermaid-svg-u4Hi8HSTMaDVZKw5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .icon-shape p,#mermaid-svg-u4Hi8HSTMaDVZKw5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .icon-shape .label rect,#mermaid-svg-u4Hi8HSTMaDVZKw5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u4Hi8HSTMaDVZKw5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-u4Hi8HSTMaDVZKw5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-u4Hi8HSTMaDVZKw5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用层: Host Agent应用
数据层: JSON-RPC 2.0 协议语义
传输层: 消息传输通道
MCP Server 外部能力提供者

图1 MCP协议分层架构

  1. 传输层 :负责JSON-RPC消息的物理传输,不解析协议语义。主流实现方式包括两种3:
  • Stdio模式 :通过标准输入输出流传输,适用于本地进程间通信,部署简单、安全性高。
    • Streamable HTTP模式:基于 HTTP POST 发送请求,SSE 流式推送响应,适用于远程服务接入,支持 OAuth 2.0 认证。
  1. 数据层 :基于JSON-RPC 2.0规范定义消息结构与交互语义,是协议的核心层。包含生命周期管理、服务端能力原语、客户端能力原语、通用工具原语四大模块4。

2.2 消息格式规范

MCP所有消息严格遵循JSON-RPC 2.0规范,定义三类消息类型5:

  • 请求(Request):包含唯一ID、方法名与参数,用于发起操作。ID不可为null,同一连接内不可重复。
  • 响应(Response):携带与请求相同的ID,包含结果或错误对象,二者不可同时存在。
  • 通知(Notification):不含ID,用于无需回复的事件推送,如日志、进度更新。

请求消息基础格式示例:

json 复制代码
{
  "jsonrpc": "2.0",  "id": "req_001",
  "method": "tools/call",
  "params": {
    "name": "get_weather",
    "arguments": { "city": "Shanghai" }
  }
}

2.3 会话生命周期

MCP 在 2026-07-28 版本后转为无状态协议,每个请求在 _meta 字段中携带协议版本与能力信息,服务端可独立处理每个请求:
Server Client Host (AI App) Server Client Host (AI App) #mermaid-svg-LkFMOoyUKCH16ZOe{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-LkFMOoyUKCH16ZOe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LkFMOoyUKCH16ZOe .error-icon{fill:#552222;}#mermaid-svg-LkFMOoyUKCH16ZOe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LkFMOoyUKCH16ZOe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LkFMOoyUKCH16ZOe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LkFMOoyUKCH16ZOe .marker.cross{stroke:#333333;}#mermaid-svg-LkFMOoyUKCH16ZOe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LkFMOoyUKCH16ZOe p{margin:0;}#mermaid-svg-LkFMOoyUKCH16ZOe .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LkFMOoyUKCH16ZOe text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-LkFMOoyUKCH16ZOe .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-LkFMOoyUKCH16ZOe .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-LkFMOoyUKCH16ZOe #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-LkFMOoyUKCH16ZOe .sequenceNumber{fill:white;}#mermaid-svg-LkFMOoyUKCH16ZOe #sequencenumber{fill:#333;}#mermaid-svg-LkFMOoyUKCH16ZOe #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-LkFMOoyUKCH16ZOe .messageText{fill:#333;stroke:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LkFMOoyUKCH16ZOe .labelText,#mermaid-svg-LkFMOoyUKCH16ZOe .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .loopText,#mermaid-svg-LkFMOoyUKCH16ZOe .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .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-LkFMOoyUKCH16ZOe .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-LkFMOoyUKCH16ZOe .noteText,#mermaid-svg-LkFMOoyUKCH16ZOe .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-LkFMOoyUKCH16ZOe .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LkFMOoyUKCH16ZOe .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LkFMOoyUKCH16ZOe .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LkFMOoyUKCH16ZOe .actorPopupMenu{position:absolute;}#mermaid-svg-LkFMOoyUKCH16ZOe .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-LkFMOoyUKCH16ZOe .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LkFMOoyUKCH16ZOe .actor-man circle,#mermaid-svg-LkFMOoyUKCH16ZOe line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-LkFMOoyUKCH16ZOe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 无会话,每请求自包含 _meta Elicitation 经 Multi Round-Trip 多轮往返 无终止阶段,连接断开即结束 server/discover(版本+能力发现) supportedVersions + capabilities + ttlMs + cacheScope 缓存 Server 能力 用户/模型发起动作 tools/list(_meta 携带版本+能力+身份) tools\[\] + ttlMs + cacheScope 可用工具集 模型决定调用工具 tools/call(name + arguments + _meta) content\[\] 工具结果 elicitation/create(请求用户补充信息) 转发用户输入请求 用户输入 返回用户输入 subscriptions/listen(订阅变更通知) acknowledged(subscriptionId) notifications/tools/list_changed 通知 Host 刷新工具列表

图2 MCP无状态交互时序图(2026-07-28 新版)

此前版本(2025-11-25)为有状态协议,会话分为三个阶段6:

  1. 初始化 :initialize 请求完成能力协商,必须是会话首个交互。
  2. 运行:工具调用、资源读取、模板调用等业务交互。
  3. 关闭:任意一方发起关闭通知,完成资源释放与会话终止。

服务端典型能力包括tools、resources、prompts、logging;客户端典型能力包括sampling(2026-07-28 起弃用)、roots、elicitation6。
Server Client Host Server Client Host #mermaid-svg-JbQrGm8CTY2fyYvi{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-JbQrGm8CTY2fyYvi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JbQrGm8CTY2fyYvi .error-icon{fill:#552222;}#mermaid-svg-JbQrGm8CTY2fyYvi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JbQrGm8CTY2fyYvi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JbQrGm8CTY2fyYvi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JbQrGm8CTY2fyYvi .marker.cross{stroke:#333333;}#mermaid-svg-JbQrGm8CTY2fyYvi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JbQrGm8CTY2fyYvi p{margin:0;}#mermaid-svg-JbQrGm8CTY2fyYvi .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JbQrGm8CTY2fyYvi text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JbQrGm8CTY2fyYvi .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-JbQrGm8CTY2fyYvi .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-JbQrGm8CTY2fyYvi #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-JbQrGm8CTY2fyYvi .sequenceNumber{fill:white;}#mermaid-svg-JbQrGm8CTY2fyYvi #sequencenumber{fill:#333;}#mermaid-svg-JbQrGm8CTY2fyYvi #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-JbQrGm8CTY2fyYvi .messageText{fill:#333;stroke:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JbQrGm8CTY2fyYvi .labelText,#mermaid-svg-JbQrGm8CTY2fyYvi .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .loopText,#mermaid-svg-JbQrGm8CTY2fyYvi .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .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-JbQrGm8CTY2fyYvi .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-JbQrGm8CTY2fyYvi .noteText,#mermaid-svg-JbQrGm8CTY2fyYvi .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-JbQrGm8CTY2fyYvi .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JbQrGm8CTY2fyYvi .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JbQrGm8CTY2fyYvi .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JbQrGm8CTY2fyYvi .actorPopupMenu{position:absolute;}#mermaid-svg-JbQrGm8CTY2fyYvi .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-JbQrGm8CTY2fyYvi .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JbQrGm8CTY2fyYvi .actor-man circle,#mermaid-svg-JbQrGm8CTY2fyYvi line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-JbQrGm8CTY2fyYvi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Active Session with Negotiated Features loop Client Requests loop Server Requests loop Notifications Initialize client Initialize session with capabilities Respond with supported capabilities User- or model-initiated action Request (tools/resources) Response Update UI or respond to model Request (sampling) Forward to AI AI response Response Resource updates Status changes Terminate End session

图3 MCP会话生命周期时序图(2025-11-25版)

2.4 新旧版本对比

维度 旧版(2025-11-25) 新版(2026-07-28)
协议状态 有状态会话 无状态 ,每请求自包含 _meta
初始化 initialize 握手 + 能力协商 server/discover 发现请求(可缓存)
会话生命周期 初始化→运行→关闭 三阶段 取消,无会话概念
Sampling 客户端原语 已弃用,直接对接 LLM API
Logging 客户端原语 已弃用,改用 stderr/OpenTelemetry
传输 Stdio + HTTP+SSE Stdio + Streamable HTTP
客户端原语 Sampling/Roots/Elicitation 仅 Elicitation
新增 --- Tasks 扩展(长轮询+延迟结果)

3 核心架构与角色定义

MCP采用Host-Client-Server三层架构模型,三类角色职责解耦,构成完整的交互链路。

3.1 角色职责划分

角色 定位 运行位置 核心职责 典型实例
Host(主应用) Agent运行载体与用户入口 用户侧 管理对话会话、模型权限、连接生命周期;控制用户授权与高风险操作确认 桌面智能助手、IDE插件、企业办公Agent
Client(客户端) 协议通信连接器 Host内部 遵循MCP协议与Server通信;完成能力发现、请求转发、结果回传;一个Host可实例化多个Client对接多Server MCP SDK客户端组件
Server(服务端) 外部能力封装提供者 外部系统侧 将本地/远程系统能力封装为MCP标准原语;接收并执行调用请求 天气服务MCP Server、数据库MCP Server

完整交互链路为:用户指令 → Host → Client → MCP Server → 外部业务系统,执行结果沿原路径反向返回。
#mermaid-svg-jhnnJTUYxtZqHk7t{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-jhnnJTUYxtZqHk7t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jhnnJTUYxtZqHk7t .error-icon{fill:#552222;}#mermaid-svg-jhnnJTUYxtZqHk7t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jhnnJTUYxtZqHk7t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jhnnJTUYxtZqHk7t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jhnnJTUYxtZqHk7t .marker.cross{stroke:#333333;}#mermaid-svg-jhnnJTUYxtZqHk7t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jhnnJTUYxtZqHk7t p{margin:0;}#mermaid-svg-jhnnJTUYxtZqHk7t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster-label text{fill:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster-label span{color:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster-label span p{background-color:transparent;}#mermaid-svg-jhnnJTUYxtZqHk7t .label text,#mermaid-svg-jhnnJTUYxtZqHk7t span{fill:#333;color:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t .node rect,#mermaid-svg-jhnnJTUYxtZqHk7t .node circle,#mermaid-svg-jhnnJTUYxtZqHk7t .node ellipse,#mermaid-svg-jhnnJTUYxtZqHk7t .node polygon,#mermaid-svg-jhnnJTUYxtZqHk7t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jhnnJTUYxtZqHk7t .rough-node .label text,#mermaid-svg-jhnnJTUYxtZqHk7t .node .label text,#mermaid-svg-jhnnJTUYxtZqHk7t .image-shape .label,#mermaid-svg-jhnnJTUYxtZqHk7t .icon-shape .label{text-anchor:middle;}#mermaid-svg-jhnnJTUYxtZqHk7t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jhnnJTUYxtZqHk7t .rough-node .label,#mermaid-svg-jhnnJTUYxtZqHk7t .node .label,#mermaid-svg-jhnnJTUYxtZqHk7t .image-shape .label,#mermaid-svg-jhnnJTUYxtZqHk7t .icon-shape .label{text-align:center;}#mermaid-svg-jhnnJTUYxtZqHk7t .node.clickable{cursor:pointer;}#mermaid-svg-jhnnJTUYxtZqHk7t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jhnnJTUYxtZqHk7t .arrowheadPath{fill:#333333;}#mermaid-svg-jhnnJTUYxtZqHk7t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jhnnJTUYxtZqHk7t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jhnnJTUYxtZqHk7t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jhnnJTUYxtZqHk7t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jhnnJTUYxtZqHk7t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jhnnJTUYxtZqHk7t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster text{fill:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t .cluster span{color:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t 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-jhnnJTUYxtZqHk7t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jhnnJTUYxtZqHk7t rect.text{fill:none;stroke-width:0;}#mermaid-svg-jhnnJTUYxtZqHk7t .icon-shape,#mermaid-svg-jhnnJTUYxtZqHk7t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jhnnJTUYxtZqHk7t .icon-shape p,#mermaid-svg-jhnnJTUYxtZqHk7t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jhnnJTUYxtZqHk7t .icon-shape .label rect,#mermaid-svg-jhnnJTUYxtZqHk7t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jhnnJTUYxtZqHk7t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jhnnJTUYxtZqHk7t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jhnnJTUYxtZqHk7t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户
Host

AI应用
Client 1
Client 2
MCP Server A

天气服务
MCP Server B

数据库服务
MCP Server C

文件系统

图4 MCP三层架构交互图

3.2 Sampling机制

Sampling 允许 MCP Server 反向请求 Host 侧 LLM 完成推理任务7,使服务端无需集成 LLM SDK。注意:2026-07-28 起已弃用,新实现应直接对接 LLM 提供商 API。

3.3 其他客户端原语

  • Roots:服务端查询可操作的 URI 或文件系统边界,限定操作范围。
  • Elicitation :服务端请求用户补充信息或确认操作,通过 elicitation/create 实现。

3.4 通知机制

服务端通过 subscriptions/listen 长连接推送变更通知(工具新增、修改、临时不可用),客户端订阅后在流上接收匹配事件。

3.5 授权框架

HTTP 传输推荐 OAuth 2.0 认证(bearer token、API key、自定义请求头),Stdio 传输从环境变量获取凭据。

4 核心能力原语

MCP Server对外提供三类标准化能力原语,覆盖动作执行、上下文供给、模板复用三大场景,构成Agent外部能力的完整表达体系。

4.1 Tools(工具原语)

Tools对应可执行的函数操作,支持模型通过结构化调用修改外部系统状态,是Agent动作能力的核心载体。典型能力包括天气查询、代码执行、数据库读写、日程创建等。

工具定义采用结构化JSON Schema,标准接口包括:

  • tools/list:枚举服务端所有可用工具
  • tools/call:执行指定工具调用

基于Python官方SDK的工具定义示例8:

python 复制代码
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("WeatherServer")

@mcp.tool()
def get_weather(city: str) -> str:
    """
    查询指定城市的实时天气
    Args:
        city: 城市名称,如Shanghai、Beijing
    """
    # 实际业务逻辑:调用第三方天气API
    return f"{city} 今日天气:小雨,18-23℃,建议携带雨具"

if __name__ == "__main__":
    mcp.run()

4.2 Resources(资源原语)

Resources对应只读类上下文数据,用于向Agent提供任务所需的背景信息,不改变外部系统状态。典型资源包括项目文档、配置文件、数据库表结构、会议记录等。

资源通过统一资源标识符(URI)进行定位与访问,标准接口包括resources/list与resources/read。资源URI示例:

  • file://project/docs/readme.md(本地文档资源)
  • db://sales/order_table(数据库表结构资源)

4.3 Prompts(提示模板原语)

Prompts对应可复用的交互提示模板,封装特定场景的指令结构与输出规范,支持Agent直接调用完成标准化任务。典型模板包括代码审查模板、会议总结模板、故障分析模板等。标准接口包括prompts/list与prompts/get。

5 完整交互流程

以"查询上海明日天气并添加日历出行提醒"任务为例,MCP完整调用时序如下:
日历MCP Server 天气MCP Server MCP Client Host Agent 用户 日历MCP Server 天气MCP Server MCP Client Host Agent 用户 #mermaid-svg-WhqzvyTVnyDQwAVc{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-WhqzvyTVnyDQwAVc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WhqzvyTVnyDQwAVc .error-icon{fill:#552222;}#mermaid-svg-WhqzvyTVnyDQwAVc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WhqzvyTVnyDQwAVc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WhqzvyTVnyDQwAVc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WhqzvyTVnyDQwAVc .marker.cross{stroke:#333333;}#mermaid-svg-WhqzvyTVnyDQwAVc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WhqzvyTVnyDQwAVc p{margin:0;}#mermaid-svg-WhqzvyTVnyDQwAVc .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WhqzvyTVnyDQwAVc text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-WhqzvyTVnyDQwAVc .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-WhqzvyTVnyDQwAVc .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-WhqzvyTVnyDQwAVc #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-WhqzvyTVnyDQwAVc .sequenceNumber{fill:white;}#mermaid-svg-WhqzvyTVnyDQwAVc #sequencenumber{fill:#333;}#mermaid-svg-WhqzvyTVnyDQwAVc #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-WhqzvyTVnyDQwAVc .messageText{fill:#333;stroke:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WhqzvyTVnyDQwAVc .labelText,#mermaid-svg-WhqzvyTVnyDQwAVc .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .loopText,#mermaid-svg-WhqzvyTVnyDQwAVc .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .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-WhqzvyTVnyDQwAVc .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-WhqzvyTVnyDQwAVc .noteText,#mermaid-svg-WhqzvyTVnyDQwAVc .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-WhqzvyTVnyDQwAVc .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WhqzvyTVnyDQwAVc .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WhqzvyTVnyDQwAVc .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WhqzvyTVnyDQwAVc .actorPopupMenu{position:absolute;}#mermaid-svg-WhqzvyTVnyDQwAVc .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-WhqzvyTVnyDQwAVc .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WhqzvyTVnyDQwAVc .actor-man circle,#mermaid-svg-WhqzvyTVnyDQwAVc line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-WhqzvyTVnyDQwAVc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 查询上海明日天气,添加日历提醒 发现可用Server,调用天气工具 tools/call(get_weather, city=上海) 返回天气数据 返回结果 生成出行提醒内容 确认创建日程?(高风险操作) 确认 调用日历创建工具 tools/call(create_event, ...) 创建成功 返回结果 任务完成,日程已添加

图5 MCP调用时序图

完整流程分为五个阶段:

  1. 能力发现与任务规划:Host检索已连接的MCP Server,获取可用工具集,拆解任务步骤。
  2. 工具调用与结果返回:Client向目标Server发起调用请求,Server执行并返回数据。
  3. 信息整合与步骤推进:Agent解析返回结果,规划下一步操作。
  4. 高风险操作用户确认:涉及修改外部数据的操作,触发人机在环(Human-in-the-loop)机制。
  5. 执行操作与结果反馈:用户确认后执行最终操作,返回任务结果。

6 相关概念辨析

6.1 MCP与Function Calling

Function Calling是大语言模型的原生能力,负责生成结构化的函数调用参数;MCP是接入层协议,负责标准化外部系统的发现、接入与交互流程。二者是互补关系:Function Calling解决"模型怎么调用"的问题,MCP解决"怎么接入更多系统"的问题9。

6.2 MCP与LSP

MCP在设计理念上借鉴了LSP(语言服务器协议):LSP标准化了编辑器与语言服务的对接,MCP标准化了Agent与外部能力的对接。二者均采用客户端-服务器架构、JSON-RPC通信、能力协商机制,目标都是构建可复用的生态系统2。

6.3 MCP、Function Calling、Skill三者关系

  • Function Calling:模型底层能力,生成调用指令。
  • MCP:接入层标准,打通外部系统通道。
  • Skill:业务层能力组合,由多个工具调用与逻辑流程封装而成。

三者逻辑关系:MCP提供标准化接入通道,Function Calling实现指令生成,二者结合支撑Skill构建,最终形成Agent完成真实任务的完整能力。

7 Agent开发安全最佳实践

MCP协议本身不强制实现安全机制,安全边界与权限控制需由Host与Server共同落地,面向Agent开发的核心实践原则包括:

  1. 最小权限原则 :仅授予任务执行所需的最低权限,如只读场景不开放写入权限,严格限制Server可访问的资源范围10。
  2. 高风险操作强制确认:涉及数据修改、消息发送、资源删除等高风险操作,必须触发用户确认流程,禁止自动执行。
  3. 敏感凭证隔离:认证密钥、接口凭证等敏感信息由Client/Server层独立管理,严禁传入大模型上下文,防止提示注入泄露。
  4. 输入校验与防注入:对工具调用参数进行严格校验与清洗,防范Prompt Injection与命令注入攻击。
  5. 全链路审计日志:完整记录调用主体、目标Server、调用工具、传入参数、返回结果与执行时间,支持事后审计与问题排查。
  6. 沙箱隔离:执行代码、文件操作类工具时,运行在独立沙箱环境中,限制系统资源访问权限。

8 结论

MCP 通过标准化架构、能力原语与交互机制,解决了 AI Agent 多系统集成的碎片化问题。2026-07-28 新版取消有状态会话、改为无状态协议,进一步简化了集成复杂度。基于 MCP 构建外部能力层,可大幅降低开发与维护成本,是构建可扩展 Agent 系统的关键基础设施。


参考文献

1 Model Context Protocol. "MCP Specification." Official , 2025.

2 Model Context Protocol. "MCP Architecture Overview." Official , 2025.

3 Vectree. "Implementation Details of JSON-RPC Messaging in MCP." Vectree , 2025.

4 Model Context Protocol. "Basic Protocol Messages." Official , 2024.

5 Model Context Protocol. "JSON-RPC Message Specification." Official , 2025.

6 Model Context Protocol. "Lifecycle & Capability Negotiation." Official , 2025.

7 Model Context Protocol. "Sampling Mechanism." Official , 2025.

8 Model Context Protocol. "Build an MCP Server - Python SDK." Official , 2026.

9 Microsoft. "Semantic Kernel Adds MCP Support for Python." MS DevBlogs , 2025.

10 Model Context Protocol. "Authorization Framework." Official , 2025.

11 屿哥扒透AI. "Agent里的MCP到底是什么?" 抖音视频, 2025.

相关推荐
木圭的AI时代指南1 小时前
EmbeddingGemma 2 图片检索实测:3 款多模态向量模型在无显卡 Ubuntu 上的完整账本
ai·本地部署·向量模型·图片检索
泡海椒1 小时前
JQuick-Excel 多字段 TRANSFORM:让当前行字段、JContext 与展示列各归其位
开发语言·python·excel
JPower_mr.g2 小时前
SmartCall 音色管理技术解析:基于 SPI 的可扩展音色注册架构
java·开发语言·人工智能·ai·架构·开源
云卷云舒___________2 小时前
Gemini 4-Flash曝光?Argon现身Antigravity?Carbon新检查点?Ultra模式齐亮相? 谷歌憋大招!| 10月10日 AI日报
ai·谷歌·gemini·ai日报·aistudio·antigravity·gemini4
高洁012 小时前
智能博弈背景下中国AI国防建设的战略价值
人工智能·python·深度学习·django·tornado
han68892 小时前
selenium之实战
笔记·python·selenium·测试工具·自动化
七夜zippoe2 小时前
Agent 中间件架构:钩子链、插件注册与横切治理
ai·中间件·架构·agent·钩子链
yumgpkpm2 小时前
(CDH 7)CDP Private Cloud Base 7.3.1 → Acceldata ODP 3.3.6.4 引擎迁移风险评估表
服务器·人工智能·hadoop·python·华为·zookeeper·hbase
刘天远2 小时前
Agent成本核算实现:事件表、状态分布与Python归集
前端·数据库·人工智能·python