Model Context Protocol (MCP) 完整协议流程详解
1. 概述
Model Context Protocol (MCP) 是一种标准化协议,允许应用程序向AI助手提供上下文信息,包括工具、资源和提示等。该协议基于JSON-RPC 2.0规范,支持双向通信。
2. MCP连接建立流程
2.1 初始连接
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant T as WebMvcSseServerTransportProvider
C->>T: GET /sse (建立SSE连接)
T->>T: 生成sessionId
T->>T: 创建WebMvcMcpSessionTransport和McpServerSession
T-->>C: endpoint事件 (包含消息端点URL)
- 客户端向
/sse端点发起GET请求,建立SSE连接 - 服务器生成唯一的 sessionId
- 服务器创建 WebMvcMcpSessionTransport 和 McpServerSession
- 服务器通过SSE发送 endpoint 事件,告知客户端消息端点URL
2.2 初始化握手
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
C->>S: POST /messages (initialize请求)
S->>SS: handle方法处理initialize请求
SS->>SS: 调用initRequestHandler
SS-->>C: initialize响应
C->>S: POST /messages (initialized通知)
S->>SS: handle方法处理initialized通知
SS->>SS: 设置会话状态为已初始化
Note over C,S: 连接建立完成
- 客户端通过消息端点发送 initialize 请求
- 服务器处理 initialize 请求并返回响应
- 客户端发送 initialized 通知完成连接建立
3. MCP核心功能调用流程
MCP定义了三种核心原语:工具(Tools)、资源(Resources)和提示(Prompts)。所有这些功能都通过 /messages 端点进行调用。
3.1 Tools工具调用
3.1.1 tools/list - 列出可用工具
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
C->>S: POST /messages (tools/list请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到toolsListRequestHandler
SS->>AS: 获取已注册的工具列表
AS->>SS: 返回工具列表
SS->>SS: 构造ListToolsResult响应
SS->>S: 返回JSONRPCResponse
S-->>C: 工具列表响应
在 toolsListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的工具列表
- 构造 McpSchema 响应
- 返回给客户端
3.1.2 tools/call - 调用具体工具
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
participant WC as WebClient
C->>S: POST /messages (tools/call请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到toolsCallRequestHandler
SS->>AS: 查找对应工具
AS->>SS: 返回工具规范
SS->>WC: 调用内部API (/api/mcp/invoke)
WC->>SS: 返回调用结果
SS->>S: 构造CallToolResult响应
S-->>C: 工具调用响应
在 toolsCallRequestHandler 中:
- 解析 CallToolRequest 参数
- 在已注册的工具中查找匹配的工具
- 调用工具的处理函数
- 返回 CallToolResult 响应
3.2 Resources资源调用
3.2.1 resources/list - 列出可用资源
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
C->>S: POST /messages (resources/list请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到resourcesListRequestHandler
SS->>AS: 获取已注册的资源列表
AS->>SS: 返回资源列表
SS->>SS: 构造ListResourcesResult响应
SS->>S: 返回JSONRPCResponse
S-->>C: 资源列表响应
在 resourcesListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的资源列表
- 构造 ListResourcesResult 响应
- 返回给客户端
3.2.2 resources/read - 读取具体资源
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
participant WC as WebClient
C->>S: POST /messages (resources/read请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到resourcesReadRequestHandler
SS->>AS: 查找匹配的资源处理器
AS->>SS: 返回资源规范
SS->>WC: 调用内部API (/api/mcp/invoke)
WC->>SS: 返回资源内容
SS->>S: 构造ReadResourceResult响应
S-->>C: 资源内容响应
在 resourcesReadRequestHandler 中:
- 解析 ReadResourceRequest 参数
- 在已注册的资源中查找匹配的资源处理器
- 调用资源的读取处理函数
- 返回 ReadResourceResult 响应
3.3 Prompts提示调用
3.3.1 prompts/list - 列出可用提示
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
C->>S: POST /messages (prompts/list请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到promptsListRequestHandler
SS->>AS: 获取已注册的提示列表
AS->>SS: 返回提示列表
SS->>SS: 构造ListPromptsResult响应
SS->>S: 返回JSONRPCResponse
S-->>C: 提示列表响应
在 promptsListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的提示列表
- 构造 ListPromptsResult 响应
- 返回给客户端
3.3.2 prompts/get - 获取具体提示
sequenceDiagram
participant C as MCP客户端
participant S as MCP服务器
participant SS as McpServerSession
participant AS as McpAsyncServer
participant WC as WebClient
C->>S: POST /messages (prompts/get请求)
S->>SS: handle方法处理请求
SS->>SS: 路由到promptsGetRequestHandler
SS->>AS: 查找匹配的提示处理器
AS->>SS: 返回提示规范
SS->>WC: 调用内部API (/api/mcp/invoke)
WC->>SS: 返回提示内容
SS->>S: 构造GetPromptResult响应
S-->>C: 提示内容响应
在 promptsGetRequestHandler 中:
- 解析 GetPromptRequest 参数
- 在已注册的提示中查找匹配的提示处理器
- 调用提示的处理函数
- 返回 GetPromptResult 响应
4. 内部处理机制
4.1 消息路由
所有通过 /messages 端点发送的请求都会经过以下处理流程:
- WebMvcSseServerTransportProvider.handleMessage 接收HTTP请求
- 解析JSON-RPC消息
- 调用对应 McpServerSession.handle 方法
- 根据消息类型(请求、通知、响应)进行分发
- 根据method字段路由到对应的处理器
4.2 工具调用内部处理
对于工具调用,实际的处理流程如下:
sequenceDiagram
participant SS as McpServerSession
participant WC as WebClient
participant BE as 后端服务
SS->>WC: POST /api/mcp/invoke
WC->>BE: 调用具体工具实现
BE->>WC: 返回工具执行结果
WC->>SS: 返回JSONRPCResponse
在 McpServerSession.handleIncomingRequest 中:
- 检查是否为初始化请求
- 如果不是初始化请求,则根据method字段查找对应的处理器
- 调用 invoke 方法通过WebClient调用内部
/api/mcp/invoke接口 - 将结果封装成JSON-RPC响应返回给客户端
4.3 会话管理
MCP通过以下机制管理客户端会话:
- 会话创建:每个SSE连接对应一个唯一的sessionId
- 会话存储:使用 ConcurrentHashMap 存储活动会话
- 会话超时:通过 DelayedSession 和 DelayQueue 实现60分钟超时机制
- 会话清理:连接断开或超时时自动清理会话
5. 总结
MCP协议通过以下方式工作:
- 连接建立:客户端通过SSE建立持久连接,服务器分配会话ID并通过endpoint事件告知消息端点
- 初始化:客户端发送initialize请求和initialized通知完成协议握手
- 功能调用:所有tools、resources和prompts相关操作都通过
/messages端点进行 - 内部处理:服务器通过WebClient调用内部
/api/mcp/invoke接口处理具体业务逻辑 - 响应返回:通过SSE将响应发送回客户端
- 会话管理:通过会话ID管理多个客户端连接,支持超时机制
这种设计使得MCP既能够提供丰富的功能接口,又能够保证连接的稳定性和安全性。
以上基于 Spring-Ai 实现的 MCP 协议进行分析。

浙公网安备 33010602011771号