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

news/2025/9/23 9:36:46/文章来源:https://www.cnblogs.com/jmcui/p/19106610

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.mzph.cn/news/912071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中 String、StringBuilder 和 StringBuffer 的区别? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

常用的 HTTP 请求方法和区别

常用的 HTTP 请求方法最核心和常用的方法有以下几个:GET用途:请求指定的资源。只用于获取数据,不应产生任何“副作用”(如修改数据)。特点:请求的参数直接附加在 URL 后面(查询字符串 Query String),有长度限…

什么叫网站优化怎么用vs做网站开发

背景 美团点评作为全球最大的生活服务平台,承接超过千万的POI,服务于数量庞大的活跃用户。在海量数据的前提下,定位运营业务、准确找到需要数据的位置,并快速提供正确、一致、易读的数据就变得异常困难,这些困难主要体…

网站左侧导航栏设计交换链接是什么意思

目录 什么是渗透测试 渗透测试的重要性 渗透测试的前置技能 开始入门学习路线 什么是渗透测试 渗透测试,通常被视为模拟黑客的一种安全评估行为,其目的在于全面挖掘目标网站或主机的潜在安全漏洞。与真实的黑客攻击不同,渗透测试旨在发现…

个人建网站做站长手机做免费个人网站

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

网站cms模板那些网站可以做行测题

随着城市建设的不断发展和交通运输的快速增长,渣土车作为建筑行业中不可或缺的运输工具,承担着大量的渣土运输任务。然而,由于渣土车在运输过程中存在超速、违规变道、碾压行人等交通安全问题,给道路交通和行人安全带来了严重的隐…

网站容易出现的问题什么叫网站前台

一、session 1、客户端发送请求,服务器将登录信息存储在 Session 中,Session 依赖于 Cookie(cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。Cookie实际上是一小段的文本信息。)&…

高平网站建设沉默是金什么意思

目录 引言 1 FastSAM介绍 1.1 FastSAM诞生 1.2 模型算法 1.3 实验结果 2 FastSAM运行环境构建 2.1 conda环境构建 2.2 运行环境安装 2.3 模型下载 3 FastSAM运行 3.1 命令行运行 3.1.1 Everything mode 3.1.2 Text prompt 3.1.3 Box prompt (xywh) 3.1.4 Points p…

网站运营推广主要做什么的泰安房产网站

目的 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接口的响应速度,刚开始考虑是用mybatis的二级缓存,发现坑不少,于是决定自己搞 要关注的问题点 操作数据必须是唯一索引 如果更新数据不是唯一索引&#…

jquery网站开发查找网站域名

概要介绍 时间序列数据是一种表示物理设备,系统、应用过程或行为随时间变化的数据,广泛应用于物联网,工业物联网,基础运维系统等场景。阿里云TSDB 时间序列数据库可以解决大规模时序数据的可靠写入,降低数据存储成本&…

建设监理继续教育网站响应式网站手机端

近日,浙江智臾科技有限公司(以下简称“智臾科技”)正式签署 CLA 贡献者许可协议,加入龙蜥社区(OpenAnolis)。 智臾科技主创团队从 2012 年开始投入研发 DolphinDB。DolphinDB 作为一款基于高性能时序数据库…

网站如何改版厦门手机网站建设

一. 六大日志 慢查询日志:记录所有执行时间超过long_query_time的查询,方便定位并优化。 # 查询当前慢查询日志状态 SHOW VARIABLES LIKE slow_query_log; #启用慢查询日志 SET GLOBAL slow_query_log ON; #设置慢查询文件位置 SET GLOBAL slow_query_log_file …

建设网站包维护粤嵌培训4个月收费

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂,重启是一件非常麻烦的事 或者你在和前端同事联调,有一点小问题 你改完就要重启 前端还得等你,非常不友好 那…

网站图标素材图片深圳响应式设计企业网站

这篇文章主要是为了记录一下操作,这个假期又要给这套RAC扩容磁盘。 我这套Solaris的小机我还不总操作这玩意,和LINUX有点小差别,整理记录一下,要不每次都是现翻。 存储端划LUN映射到主机 登录到3PAR存储控制台,创建…

免费试用平台网站源码济南做网站优化哪家好

在使用hbase时出错,错误如下图: 错误原因: 返回去检查启动的Hadoop与zookeeper,发现zookeeper的状态不对,重新启动了一下zookeeper,确保所有机器的zookeeper都启动起来了就可以了。

娄底网站推广自己能网站建设

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:ssm 【…

网站运营年度推广方案羊了个羊开发公司

一,什么是JWT JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案 JWT总的来说是用来解决session的共享的问题的 1,JWT的原理 JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给…

wordpress站群代oa系统网站建设

概述:以上内容详细介绍了在 C# 中实现不改变原 List 值的多层嵌套复制方法,包括使用 AutoMapper、Json.NET、以及对象序列化的步骤和示例。这些方法提供了灵活而高效的方式,可以根据项目需求选择最适合的深度复制方式。 1. 使用 AutoMapper …

直播营销的优势有哪些北京路口优化

先说POSIX的吧: mq_open,sem_open,shm_open着三个函数用于创建或者打开一个IPC通道。 由此可见,消息队列的读写权限是任意的,然而信号灯就没有,…

C#和Lua相互访问 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …