当前位置: 首页 > news >正文

Model Context Protocol (MCP) 完整协议流程详解

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

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

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

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

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

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

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

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

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

  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 工具调用内部处理

对于工具调用,实际的处理流程如下:

sequenceDiagramparticipant SS as McpServerSessionparticipant WC as WebClientparticipant BE as 后端服务SS->>WC: POST /api/mcp/invokeWC->>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 协议进行分析。

http://www.hskmm.com/?act=detail&tid=14384

相关文章:

  • 常用的 HTTP 请求方法和区别
  • 第七届机器学习、大数据与商务智能国际会议(MLBDBI 2025)
  • 【OpenCV】11 形态学操作
  • 安装与使用trex
  • 自建 Supabase 云服务与 BeeCount 云同步详解
  • CF2134 Codeforces Round 1045 (Div. 2) 游记(VP)
  • jemter 安装
  • Day20创建对象内存分析
  • 熬夜三天!SpringCloud Gateway 动态路由失效,背后黑手竟是它……
  • cmd 执行git bash 命令
  • 安全向量模板类SiVector - 实践
  • 最佳三维文件格式,以及怎么在线浏览编辑FBX/OBJ/GLB/GLTF
  • FR报表下拉框高度(JS添加css样式方式)调整
  • 基于Python+Vue开发的新闻管理系统源码+运行步骤
  • 鸿蒙应用开发从入门到实战(十二):ArkUI组件ButtonToggle
  • Spring框架中的注解主要有哪些
  • 从视觉、文案到交互:三步彻底去除产品AI味
  • 理解WPF Stylet中Command={s:Action 方法名}的设计与实现
  • 帆软报表下拉框高度(JS添加css样式方式)调整
  • 探索 12 种 3D 文件格式:综合指南
  • 剑指offer-32、把数组排成最⼩的数
  • WPF 一个Label标签中的文字 Binding两个值
  • Session和Cookie的定义是什么?他们之间有什么区别?
  • 使用C++编写的一款射击五彩敌人的游戏 - 详解
  • CG-65 剖面细管式温度传感器 可实时监测不同土层温度动态
  • list集合根据某字段获取某个对象
  • .NET STS 版本支持 24 个月
  • 后缀数组基础 Suffix Array
  • @Param的作用
  • 后端应该对前端数据来源渠道进行验证