前面学习了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)的更多相关文章

  1. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  2. Spring Boot 学习系列(03)—jar or war,做出你的选择

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...

  3. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

  4. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

  5. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  6. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  7. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  8. Spring Boot 学习系列(07)—properties文件读取

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...

  9. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  10. Spring Boot 学习系列(01)—从0到1,只需两分钟

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...

随机推荐

  1. 什么是AC自动机?如何实现?

    什么是AC自动机? 是基于 Trie树 和 KMP失配指针 的一种高效多模式匹配算法.AC自动机能够一次构建,随后在遍历文本时同时匹配多个敏感词. AC自动机算法的典型应用是敏感词匹配,在各大社交媒体 ...

  2. ansible实战-2023

    环境信息:cat /etc/ansible/hosts[webserver]192.168.31.18 ansible_ssh_user=root ansible_ssh_pass=123456 ht ...

  3. vue3 基础-应用app和组件基本概念

    这篇主要对 vue 最基础的应用程序 Application 和组件 Components 进行一个简要和直观的认知, 具体要分析的代码如下: <!DOCTYPE html> <ht ...

  4. skip

    哇酷哇酷,和你的春天一样稍纵即逝的夏天 藏什么藏呢 自卑吗 你以为是缺点的 恰恰让我喜欢 但要短确实很短 说难是很难 而且烂 恰到好处吧 好男人也没的身手! 为了足以被好男人拯救 我在练习 结果是腿废 ...

  5. K8stools工具

    简介 K8stools 是一个 Kubernetes 日常运维辅助工具集,旨在提升运维效率,辅助平台治理与资源优化.功能涵盖资源分析.趋势评估.异常检测.行为采集.成本估算等常见场景,适用于 DevO ...

  6. 9 easybr指纹浏览器https代理认证教程

    目的 在高匿名浏览环境中,代理是关键组件之一.相比普通 HTTP 代理,HTTPS 代理(HTTP over TLS) 支持加密传输,在保障隐私.防止中间人攻击方面更具优势. Chromium 浏览器 ...

  7. FastAPI安全认证:从密码到令牌的魔法之旅

    title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdrag ...

  8. 学 Java 还是 Go 语言?这事儿很简单!

    相信很多学编程的同学都在纠结这个问题:学 Java 还是 Go 语言? 先给出省流结论,简单粗暴,就 4 个字:选 Java! 好,本期结束! 网上的讨论五花八门,有人说 Java 过时了,Go 才是 ...

  9. 主流负载均衡器LVS、Nginx、HAProxy介绍

    一.简单介绍 1.1 LVS LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器,LVS由用户空间的ipvsadm和内核空间的ipvs组成,ipvsadm用来定义规则, ...

  10. 使用wxWidgets进行跨平台GUI开发(附1)

    补充说明wxWidgets在Windows下使用CMake的配置 wxWidgets官方提供了一个在Windows下使用CMake来构建wxWidgets库的方法,这样便于你自己用CMake构建项目. ...