spring-ai 学习系列(5)-MCP(webflux sse)
前面学习了stdio模式的MCP使用,可以看到这种方式局限性比较大,mcp host/mcp client/mcp server通常要在同1台机器上,使用进程间通讯。更常见的做法是,大家各自部署自己的mcp server,就象常规后端http api一样,想部署在哪都行,只要http能访问即可。
一、调整pom依赖

1 <dependency>
2 <groupId>org.springframework.ai</groupId>
3 <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
4 <version>1.0.0</version>
5 </dependency>
MCP Server的代码相对stdio模式而言,完全不用改!
二、调整yaml
spring:
ai:
mcp:
server:
type: async
启动MCP Server,如果访问http://localhost:8080/sse看到类似以下界面,说明启动成功

三、MCP Client
public static void main(String[] args) {
WebFluxSseClientTransport webFluxSseTransport = new WebFluxSseClientTransport(WebClient.builder().baseUrl("http://localhost:8080"));
McpSyncClient mcpClient = McpClient.sync(webFluxSseTransport).build();
McpSchema.InitializeResult initialize = mcpClient.initialize();
System.out.println("initialize=>" + initialize);
Object ping = mcpClient.ping();
System.out.println("ping=>" + ping);
McpSchema.ListToolsResult toolsList = mcpClient.listTools();
System.out.println(toolsList);
McpSchema.CallToolResult orderStatus = mcpClient.callTool(
new McpSchema.CallToolRequest("queryOrderStatus",
Map.of("orderNo", "25070601")));
System.out.println(orderStatus);
mcpClient.closeGracefully();
}
Client运行后,会看到类似输出:
20:50:03.897 [reactor-http-nio-2] INFO io.modelcontextprotocol.client.McpAsyncClient -- Server response with Protocol: 2024-11-05, Capabilities: ServerCapabilities[completions=CompletionCapabilities[], experimental=null, logging=LoggingCapabilities[], prompts=PromptCapabilities[listChanged=true], resources=ResourceCapabilities[subscribe=false, listChanged=true], tools=ToolCapabilities[listChanged=true]], Info: Implementation[name=mcp-server, version=1.0.0] and Instructions null
initialize=>InitializeResult[protocolVersion=2024-11-05, capabilities=ServerCapabilities[completions=CompletionCapabilities[], experimental=null, logging=LoggingCapabilities[], prompts=PromptCapabilities[listChanged=true], resources=ResourceCapabilities[subscribe=false, listChanged=true], tools=ToolCapabilities[listChanged=true]], serverInfo=Implementation[name=mcp-server, version=1.0.0], instructions=null]
ping=>{}
ListToolsResult[tools=[Tool[name=queryOrderStatus, description=根据订单号查询订单状态, inputSchema=JsonSchema[type=object, properties={orderNo={type=string, description=订单号,格式为8位数字,比如:25070601}}, required=[orderNo], additionalProperties=false, defs=null, definitions=null]]], nextCursor=null]
CallToolResult[content=[TextContent[audience=null, priority=null, text="订单号:25070601,订单状态:已发货"]], isError=false] Process finished with exit code 0
四、在MCP Host中使用MCP Server

仍然以Cherry Studio为例,添加MCP server后,点保存(前提:MCP Server应对的url http://localhost:8080/sse 必须能正常访问)
注:点保存时,cherry studio会向 http://localhost:8080/sse,发送几次请求(参考上一节的分析),可用wireshark之类的抓包工具验证
- 第1次是get 请求

/sse会返回1个sessionId值99e64481-8190-4e17-ba64-05404b9131 (相当于与mcp server建立了长连接,后面的所有post请求,都会用到这个sessionId)
- 第2次post请求 initialize

json请求如下:

1 {
2 "method": "initialize",
3 "params": {
4 "protocolVersion": "2025-03-26",
5 "capabilities": {},
6 "clientInfo": {
7 "name": "Cherry Studio",
8 "version": "1.4.8"
9 }
10 },
11 "jsonrpc": "2.0",
12 "id": 0
13 }
initialize
- 第3次post请求 notifications/initialized
{
"method": "notifications/initialized",
"jsonrpc": "2.0"
}
- 第4/5/6次post请求 ping(即:连ping 3次, 这里可能是我本机网络不好,cherry studio重试了几次,每次请求后,id值返回会+1,下一次请求时,入参里的id,必须是上次返回的id值)
{
"method": "ping",
"jsonrpc": "2.0",
"id": 1
}
- 第7次post请求 resources/list
{
"method": "resources/list",
"jsonrpc": "2.0",
"id": 6
}
- 第8次post请求 tools/list
{
"method": "tools/list",
"jsonrpc": "2.0",
"id": 4
}
- 第9次post请求 prompts/list
{
"method": "prompts/list",
"jsonrpc": "2.0",
"id": 5
}
大家有兴趣的话,可以自行用postman或apipost之类的工具,一步步手动发送post请求,模拟这个过程,观察/sse的页面输出

互此,cherry studio已知道了mcp sever的所有信息,后面的会话中,就能使用该工具了。

文中代码:https://github.com/yjmyzz/spring-ai-sample/tree/day04
spring-ai 学习系列(5)-MCP(webflux sse)的更多相关文章
- Spring Boot 学习系列(10)—SpringBoot+JSP的使
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...
- Spring Boot 学习系列(03)—jar or war,做出你的选择
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...
- Spring Boot 学习系列(序)—Spring Boot
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...
- Spring Boot 学习系列(06)—采用log4j2记录日志
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...
- Spring Boot 学习系列(05)—自定义视图解析规则
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...
- Spring Boot 学习系列(09)—自定义Bean的顺序加载
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...
- Spring Boot 学习系列(07)—properties文件读取
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...
- Spring Boot 学习系列(04)—分而治之,多module打包
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...
- Spring Boot 学习系列(01)—从0到1,只需两分钟
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...
随机推荐
- 什么是AC自动机?如何实现?
什么是AC自动机? 是基于 Trie树 和 KMP失配指针 的一种高效多模式匹配算法.AC自动机能够一次构建,随后在遍历文本时同时匹配多个敏感词. AC自动机算法的典型应用是敏感词匹配,在各大社交媒体 ...
- ansible实战-2023
环境信息:cat /etc/ansible/hosts[webserver]192.168.31.18 ansible_ssh_user=root ansible_ssh_pass=123456 ht ...
- vue3 基础-应用app和组件基本概念
这篇主要对 vue 最基础的应用程序 Application 和组件 Components 进行一个简要和直观的认知, 具体要分析的代码如下: <!DOCTYPE html> <ht ...
- skip
哇酷哇酷,和你的春天一样稍纵即逝的夏天 藏什么藏呢 自卑吗 你以为是缺点的 恰恰让我喜欢 但要短确实很短 说难是很难 而且烂 恰到好处吧 好男人也没的身手! 为了足以被好男人拯救 我在练习 结果是腿废 ...
- K8stools工具
简介 K8stools 是一个 Kubernetes 日常运维辅助工具集,旨在提升运维效率,辅助平台治理与资源优化.功能涵盖资源分析.趋势评估.异常检测.行为采集.成本估算等常见场景,适用于 DevO ...
- 9 easybr指纹浏览器https代理认证教程
目的 在高匿名浏览环境中,代理是关键组件之一.相比普通 HTTP 代理,HTTPS 代理(HTTP over TLS) 支持加密传输,在保障隐私.防止中间人攻击方面更具优势. Chromium 浏览器 ...
- FastAPI安全认证:从密码到令牌的魔法之旅
title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdrag ...
- 学 Java 还是 Go 语言?这事儿很简单!
相信很多学编程的同学都在纠结这个问题:学 Java 还是 Go 语言? 先给出省流结论,简单粗暴,就 4 个字:选 Java! 好,本期结束! 网上的讨论五花八门,有人说 Java 过时了,Go 才是 ...
- 主流负载均衡器LVS、Nginx、HAProxy介绍
一.简单介绍 1.1 LVS LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器,LVS由用户空间的ipvsadm和内核空间的ipvs组成,ipvsadm用来定义规则, ...
- 使用wxWidgets进行跨平台GUI开发(附1)
补充说明wxWidgets在Windows下使用CMake的配置 wxWidgets官方提供了一个在Windows下使用CMake来构建wxWidgets库的方法,这样便于你自己用CMake构建项目. ...