1. 概述
Model Context Protocol (MCP) 是一种标准化协议,允许应用程序向AI助手提供上下文信息,包括工具、资源和提示等。该协议基于JSON-RPC 2.0规范,支持双向通信。
2. MCP连接建立流程
2.1 初始连接
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant T as WebMvcSseServerTransportProviderC->>T: GET /sse (建立SSE连接)T->>T: 生成sessionIdT->>T: 创建WebMvcMcpSessionTransport和McpServerSessionT-->>C: endpoint事件 (包含消息端点URL)
- 客户端向
/sse
端点发起GET请求,建立SSE连接 - 服务器生成唯一的 sessionId
- 服务器创建 WebMvcMcpSessionTransport 和 McpServerSession
- 服务器通过SSE发送 endpoint 事件,告知客户端消息端点URL
2.2 初始化握手
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionC->>S: POST /messages (initialize请求)S->>SS: handle方法处理initialize请求SS->>SS: 调用initRequestHandlerSS-->>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 - 列出可用工具
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerC->>S: POST /messages (tools/list请求)S->>SS: handle方法处理请求SS->>SS: 路由到toolsListRequestHandlerSS->>AS: 获取已注册的工具列表AS->>SS: 返回工具列表SS->>SS: 构造ListToolsResult响应SS->>S: 返回JSONRPCResponseS-->>C: 工具列表响应
在 toolsListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的工具列表
- 构造 McpSchema 响应
- 返回给客户端
3.1.2 tools/call - 调用具体工具
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerparticipant WC as WebClientC->>S: POST /messages (tools/call请求)S->>SS: handle方法处理请求SS->>SS: 路由到toolsCallRequestHandlerSS->>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 - 列出可用资源
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerC->>S: POST /messages (resources/list请求)S->>SS: handle方法处理请求SS->>SS: 路由到resourcesListRequestHandlerSS->>AS: 获取已注册的资源列表AS->>SS: 返回资源列表SS->>SS: 构造ListResourcesResult响应SS->>S: 返回JSONRPCResponseS-->>C: 资源列表响应
在 resourcesListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的资源列表
- 构造 ListResourcesResult 响应
- 返回给客户端
3.2.2 resources/read - 读取具体资源
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerparticipant WC as WebClientC->>S: POST /messages (resources/read请求)S->>SS: handle方法处理请求SS->>SS: 路由到resourcesReadRequestHandlerSS->>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 - 列出可用提示
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerC->>S: POST /messages (prompts/list请求)S->>SS: handle方法处理请求SS->>SS: 路由到promptsListRequestHandlerSS->>AS: 获取已注册的提示列表AS->>SS: 返回提示列表SS->>SS: 构造ListPromptsResult响应SS->>S: 返回JSONRPCResponseS-->>C: 提示列表响应
在 promptsListRequestHandler 中:
- 从 McpAsyncServer 获取已注册的提示列表
- 构造 ListPromptsResult 响应
- 返回给客户端
3.3.2 prompts/get - 获取具体提示
sequenceDiagramparticipant C as MCP客户端participant S as MCP服务器participant SS as McpServerSessionparticipant AS as McpAsyncServerparticipant WC as WebClientC->>S: POST /messages (prompts/get请求)S->>SS: handle方法处理请求SS->>SS: 路由到promptsGetRequestHandlerSS->>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 工具调用内部处理
对于工具调用,实际的处理流程如下:
sequenceDiagramparticipant SS as McpServerSessionparticipant WC as WebClientparticipant BE as 后端服务SS->>WC: POST /api/mcp/invokeWC->>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 协议进行分析。