MCP 协议解读:MCP-Server 通信原理(SSE)

MCP 协议 SSE 通信原理解读

MCP协议解读:MCP Server通信原理(SSE) image 20250426

MCP 协议解读:MCP-Server 通信原理(SSE)

MCP 协议的核心设计,是围绕「一个长连接,两类接口」构建的高效通信模型。本文将结合流程图,带你全面理解 MCP-Server 的通信机制与底层实现。

什么是 MCP 的 SSE 通信模型?

MCP 协议在基于 SSE(Server-Sent Events)实现时,可以归纳为:

  • 1 个长连接:客户端通过 SSE 建立服务端到客户端的单向消息流;
  • 2 个接口
    • GET /sse:用于建立长连接并接收服务端消息;
    • POST /message:客户端发送请求、响应或通知。

优势:连接稳定、延迟低、天然支持事件流,适用于 AI 工具类应用中持续会话与异步结果返回等场景。

接口详解

1. GET /sse:建立 SSE 长连接

客户端通过该接口与服务端建立 SSE 连接,服务端创建并关联以下对象:

  • SseEmitter:用于控制消息推送;
  • McpServerSession:维护当前会话的上下文状态。
val sessions = ConcurrentHashMap<String, McpServerSession>()  // 会话状态存储
val emitters = ConcurrentHashMap<String, SseEmitter>()         // SSE 连接存储

2. POST /message:客户端主动发消息

支持三种消息类型:

  • Request:如请求工具列表、调用模型;
  • Response:客户端对服务端通知的响应;
  • Notification:客户端状态上报(如心跳 ping)。

SSE 通信全流程详解

下面的流程图展示了客户端和 MCP-Server 从连接到通信的全过程:
MCP协议解读:MCP Server通信原理(SSE) mcp sse uml 20250425

实际工作过程总结

  1. 连接建立
    • 客户端请求 /sse
    • 服务端初始化 SseEmitterMcpServerSession,返回可用的消息接口地址。
  2. 会话初始化
    • 客户端通过 /message 发送 InitializeRequest,告知能力与标识;
    • 服务端处理后通过 SSE 返回 InitializeResponse
  3. 资源管理
    • 客户端发起如 tools/list 请求;
    • 服务端从会话中查找状态,调用工具处理器并通过 SSE 返回结果。
  4. 调用工具
    • 客户端拼接 prompt 后发起 tools/call
    • 服务端查找处理器执行逻辑,并通过 SSE 返回执行结果。
  5. 连接维持
    • 客户端周期性发送 ping
    • 服务端返回 pong,用于保持连接活跃。
  6. 连接关闭
    • 客户端主动断开;
    • 服务端清理对应的连接与会话状态。

总结

从早期的 stdio 单机协议演进到 SSE 网络协议,是自然的扩展。但在实践中,SSE 仍存在以下问题:

  1. 不支持断线重连(缺乏恢复机制);
  2. 服务端需长时间维护高并发连接,资源压力大;
  3. 服务端消息只能单向推送,缺乏灵活性。

目前由于 mcp-java-sdk 暂未支持新版 Streamable HTTP 协议,我们仍采用 SSE 实现。但随着生态演进,MCP 社区已逐步升级至 Streamable HTTP 通信机制,在下一个版本中,我们也将进行相应迁移,解决当前 SSE 的局限。


这儿的文章都会同步发送到:极客工具 XTool

🌟 极客工具:共享开源力量,成就超级个体

<think>根据提供的依赖和配置,分析可能存在的问题: 1. 依赖版本问题:使用里程碑版本(1.0.0-M6)可能存在不稳定或配置变化 2. 配置项缺失:虽然配置了mcp.server的基本信息,但缺少AI模型配置(如openai、ollama等) 3. 端点路径问题:默认SSE端点路径可能不是/sse,需要确认或自定义 4. 自动配置条件:可能因为缺少必要的配置导致自动配置未激活 解决方案: 1. 检查依赖:确保所有相关依赖的版本兼容,特别是Spring Boot和Spring AI的版本匹配 2. 补充模型配置:必须指定一个AI模型后端,例如OpenAI或Ollama 3. 查看日志:启动应用时检查自动配置日志,确认MCP服务端是否被激活 4. 确认端点:查看文档或源码,确定默认的SSE端点路径(可能是/mcp/sse或其他) 具体步骤: 步骤1:添加必要的模型配置,例如使用OpenAI: spring: ai: openai: api-key: <your-api-key> model: gpt-3.5-turbo 步骤2:在application.yml中显式启用MCP服务端(如果默认未启用): spring: ai: mcp: server: enabled: true 步骤3:检查启动日志,搜索关键词"MCP"或"SSE",确认端点注册信息 步骤4:尝试访问默认端点(可能是/mcp/sse): curl -v http://localhost:8088/mcp/sse 如果问题仍然存在,考虑添加一个测试控制器验证WebFlux是否正常工作。 注意:由于使用的是里程碑版本,可能存在bug或配置变更,建议查阅对应版本的文档。 根据以上分析,提出相关问题。</think>根据您提供的依赖配置和YAML配置,存在几个关键问题需要解决: ### 问题分析 1. **依赖版本不匹配** `spring-ai-mcp-server-webflux-spring-boot-starter:1.0.0-M6` 是**里程碑版本(M版本)**,而您的配置中声明了`version: 1.0.0`。两者版本不一致会导致自动配置失败。 2. **关键配置缺失** MCP服务端需要明确的AI模型配置(二选一): ```yaml # 缺少以下关键配置之一: spring: ai: openai: api-key: YOUR_API_KEY # 或 ollama: base-url: http://localhost:11434 ``` 3. **端点路径未明确** MCP默认使用 `/mcp/sse` 路径而非 `/sse`,未在配置中指定自定义路径: ```yaml spring: ai: mcp: server: endpoint: /sse # 需要添加此配置 ``` 4. **依赖作用域问题** 若使用Spring Boot 3.x,需要确认是否添加了WebFlux基础依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` ### 完整修复方案 #### 1. 修正依赖版本(pom.xml) ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId> <!-- 选择正式版本 --> <version>1.0.0</version> <!-- 或匹配配置的版本 --> <!-- <version>${spring.ai.version}</version> --> </dependency> ``` #### 2. 补充完整配置(application.yml) ```yaml server: port: 8088 spring: application: name: cwl-mcp-server ai: # 必须添加AI模型配置(二选一) openai: api-key: sk-xxxxxxxxxxxxxx # 你的OpenAI密钥 model: gpt-4-turbo # 或使用本地模型 # ollama: # base-url: http://localhost:11434 # model: llama3 mcp: server: name: cwl-mcp-server version: 1.0.0 endpoint: /sse # 明确指定端点路径 enabled: true # 显式启用 ``` #### 3. 验证步骤 1. 清理并重新构建项目: ```bash mvn clean package ``` 2. 检查启动日志中的关键信息: ```log [MCP-Server] : SSE endpoint registered at /sse [MCP-Server] : Connected to AI model: gpt-4-turbo ``` 3. 测试SSE连接: ```bash curl -N http://localhost:8088/sse ``` 预期返回持续事件流: ``` event: message data: {"content":"Hello from MCP"} ``` ### 常见错误排查 若仍不成功,检查: 1. 启动日志中是否有 `ReactiveWebServerInitialized` 事件 2. 是否存在多个Web服务器冲突(如同时存在Tomcat和Netty) 3. 防火墙是否阻止了SSE长连接
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值