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)
  1. 客户端向 /sse 端点发起GET请求,建立SSE连接
  2. 服务器生成唯一的 sessionId
  3. 服务器创建 WebMvcMcpSessionTransport 和 McpServerSession
  4. 服务器通过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: 连接建立完成
  1. 客户端通过消息端点发送 initialize 请求
  2. 服务器处理 initialize 请求并返回响应
  3. 客户端发送 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 中:

  1. 从 McpAsyncServer 获取已注册的工具列表
  2. 构造 McpSchema 响应
  3. 返回给客户端

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 中:

  1. 解析 CallToolRequest 参数
  2. 在已注册的工具中查找匹配的工具
  3. 调用工具的处理函数
  4. 返回 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 中:

  1. 从 McpAsyncServer 获取已注册的资源列表
  2. 构造 ListResourcesResult 响应
  3. 返回给客户端

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 中:

  1. 解析 ReadResourceRequest 参数
  2. 在已注册的资源中查找匹配的资源处理器
  3. 调用资源的读取处理函数
  4. 返回 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 中:

  1. 从 McpAsyncServer 获取已注册的提示列表
  2. 构造 ListPromptsResult 响应
  3. 返回给客户端

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 中:

  1. 解析 GetPromptRequest 参数
  2. 在已注册的提示中查找匹配的提示处理器
  3. 调用提示的处理函数
  4. 返回 GetPromptResult 响应

4. 内部处理机制

4.1 消息路由

所有通过 /messages 端点发送的请求都会经过以下处理流程:

  1. WebMvcSseServerTransportProvider.handleMessage 接收HTTP请求
  2. 解析JSON-RPC消息
  3. 调用对应 McpServerSession.handle 方法
  4. 根据消息类型(请求、通知、响应)进行分发
  5. 根据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 中:

  1. 检查是否为初始化请求
  2. 如果不是初始化请求,则根据method字段查找对应的处理器
  3. 调用 invoke 方法通过WebClient调用内部 /api/mcp/invoke 接口
  4. 将结果封装成JSON-RPC响应返回给客户端

4.3 会话管理

MCP通过以下机制管理客户端会话:

  1. 会话创建:每个SSE连接对应一个唯一的sessionId
  2. 会话存储:使用 ConcurrentHashMap 存储活动会话
  3. 会话超时:通过 DelayedSession 和 DelayQueue 实现60分钟超时机制
  4. 会话清理:连接断开或超时时自动清理会话

5. 总结

MCP协议通过以下方式工作:

  1. 连接建立:客户端通过SSE建立持久连接,服务器分配会话ID并通过endpoint事件告知消息端点
  2. 初始化:客户端发送initialize请求和initialized通知完成协议握手
  3. 功能调用:所有tools、resources和prompts相关操作都通过 /messages 端点进行
  4. 内部处理:服务器通过WebClient调用内部 /api/mcp/invoke 接口处理具体业务逻辑
  5. 响应返回:通过SSE将响应发送回客户端
  6. 会话管理:通过会话ID管理多个客户端连接,支持超时机制

这种设计使得MCP既能够提供丰富的功能接口,又能够保证连接的稳定性和安全性。

以上基于 Spring-Ai 实现的 MCP 协议进行分析。

posted @ 2025-09-23 09:34  JMCui  阅读(493)  评论(0)    收藏  举报