之前发了个 “《SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)》”。然后,有人问:SpringBoot3 能不能用 SolonMCP?

其实 SpringBoot3 可以使用 Spring AI 或者 Spring AI Alibaba(都有 MCP 功能)。

既然问了,就再发一个文。另外 SpringBoot3 使用 SolonMPC 和 SpringBoot2 的情况,差不多。只一个依赖包有不同。

1、SolonMCP 简介

SolonMCP(全称:solon-ai-mcp)是 solon ai 的一个扩展。支持内嵌到 jfinal,vert.x,springboot2,springboot3 等框架使用。

Maven 主要依赖包:

<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-ai-mcp</artifactId>
</dependency>

具体的示例参考:

2、MCP 服务端开发

2.1、添加入口类 webapp.HelloApp

@SpringBootApplication
public class HelloApp {
public static void main(String[] args) {
SpringApplication.run(HelloApp.class, args);
}

2.2、添加个空接口 webapp.mcpserver.IMcpServerEndpoint

用于识别端点组件类

public interface IMcpServerEndpoint { }

2.3、添加 webapp.mcpserver.McpServerConfig

拖管 solon 的生命周期。收集 IMcpServerEndpoint 组件,并转为 McpServerEndpointProvider

@Configuration
public class McpServerConfig {
@PostConstruct
public void start() {
Solon.start(McpServerConfig.class, new String[]{"--cfg=mcpserver.yml"});
} @PreDestroy
public void stop() {
if (Solon.app() != null) {
Solon.stopBlock(false, Solon.cfg().stopDelay());
}
} @Bean
public McpServerConfig init(List<IMcpServerEndpoint> serverEndpoints) {
for (IMcpServerEndpoint serverEndpoint : serverEndpoints) {
//这里注意一下,如果有代理的话需要用 AnnotationUtils 获取注解
McpServerEndpoint anno = AnnotationUtils.findAnnotation(serverEndpoint.getClass(), McpServerEndpoint.class); if (anno == null) {
continue;
} McpServerEndpointProvider serverEndpointProvider = McpServerEndpointProvider.builder()
.from(serverEndpoint.getClass(), anno)
.build(); serverEndpointProvider.addTool(new MethodToolProvider(serverEndpoint));
serverEndpointProvider.addResource(new MethodResourceProvider(serverEndpoint));
serverEndpointProvider.addPrompt(new MethodPromptProvider(serverEndpoint)); serverEndpointProvider.postStart(); //可以再把 serverEndpointProvider 手动转入 SpringBoot 容器
} //为了能让这个 init 能正常运行
return this;
} @Bean
public FilterRegistrationBean mcpServerFilter() {
FilterRegistrationBean<SolonServletFilter> filter = new FilterRegistrationBean<>();
filter.setName("SolonFilter");
filter.addUrlPatterns("/mcp/*");
filter.setFilter(new SolonServletFilter());
return filter;
}
}

2.4、添加 webapp.mcpserver.tool.McpServer(实现 Handler、IPlugin 接口)

这里是重点了,添加 mcp server 端点(支持多个端点)。这里是正常的 SpringBoot 组件开发了。

@Component //注意这个注解别用错了(solon 里也有同名的)
@McpServerEndpoint(name="demo1", sseEndpoint = "/mcp/demo1/sse")
public class McpServerTool implements IMcpServerEndpoint {
//
// 建议开启编译参数:-parameters (否则,最好再配置参数的 name)
//
@ToolMapping(description = "查询天气预报")
public String getWeather(@Param(description = "城市位置") String location) {
return "晴,14度";
} @ResourceMapping(uri = "config://app-version", description = "获取应用版本号")
public String getAppVersion() {
return "v3.2.0";
} @ResourceMapping(uri = "db://users/{user_id}/email", description = "根据用户ID查询邮箱")
public String getEmail(@Param(description = "用户Id") String user_id) {
return user_id + "@example.com";
} @PromptMapping(description = "生成关于某个主题的提问")
public Collection<ChatMessage> askQuestion(@Param(description = "主题") String topic) {
return Arrays.asList(
ChatMessage.ofUser("请解释一下'" + topic + "'的概念?")
);
}
}

2.5、编译后运行

或者开发时,直接运行 HelloApp:main 方法

3、MCP 客户端开发

客户端简单些

public class McpClientTest {
public static void main(String[] args) throws Exception {
McpClientProvider toolProvider = McpClientProvider.builder()
.apiUrl("http://localhost:8080/mcp/sse")
.build(); //工具调用
Map<String, Object> map = Collections.singletonMap("location", "杭州");
String rst = toolProvider.callToolAsText("getWeather", map).getContent();
System.out.println(rst);
assert "晴,14度".equals(rst); //资源读取
resourceContent = toolProvider.readResourceAsText("config://app-version").getContent();
System.out.println(resourceContent);
}
}

4、MCP 客户端作为 LLM(ChatModel) 的工具集使用

也比较简单。使用 ollama 做为 llm 提供者,方便本地测试。

public class McpClientTest {
private static final String apiUrl = "http://127.0.0.1:11434/api/chat";
private static final String provider = "ollama";
private static final String model = "qwen2.5:1.5b"; //"llama3.2";//deepseek-r1:1.5b; public static void main(String[] args) throws Exception {
//构建 mcp client
McpClientProvider toolProvider = McpClientProvider.builder()
.apiUrl("http://localhost:8080/mcp/sse")
.build(); //构建 llm 接口
ChatModel chatModel = ChatModel.of(apiUrl)
.provider(provider)
.model(model)
.defaultToolsAdd(toolProvider) //添加默认工具(这是 mcp client)
.build(); //请求
ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
.call(); System.out.println(resp.getMessage());
}
}

5、SpringBoot3 和 SpringBoot2 使用 SolonMCP 有什么区别?

仅一个 servlet 的依赖包不同(由 java-ee 改名引起的)。SpringBoot3 使用 solon-web-servlet-jakarta 依赖包;SpringBoot2 则使用 solon-web-servlet-jakarta 依赖包。

SpringBoot3 使用 SolonMCP 开发 MCP的更多相关文章

  1. Android响应式界面开发要点

    现在很多项目需要到达同一个Apk既可以在Phone上跑也尅在tablet上跑,即界面要适应不同尺寸和类型的需要而自动调整.这个即为响应式设计.在web开发商响应式设计已经是个常谈的内容了,而对于and ...

  2. JavaWeb学习总结(一)—JavaWeb开发入门及环境搭建

    一.基本概念 1.1.软件体系结构 1.C/S:Client/Servlet,例如QQ就是CS结构需要编写服务器端程序和客户端程序.缺点:更新需要两端,总要求客户下载新的客户端程序优点:安全性比较好2 ...

  3. python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包

    开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...

  4. Nordic nRF51/nRF52开发环境搭建

    本文将详述Nordic nRF51系列(包括nRF51822/nRF51802/nRF51422等)和nRF52系列(包括nRF52832/nRF52810/nRF52840)开发环境搭建. 1. 强 ...

  5. 企业搜索引擎开发之连接器connector(二十六)

    连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...

  6. DA14580_583_DK_II开发板入门笔记

    本文链接:http://www.cnblogs.com/obarong/p/8521893.html 1.介绍 开发板资料 参考文件: DA1458XDK蓝牙开发板用户须知1.3.pdf DA1458 ...

  7. 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略

    转自:http://blog.csdn.net/gao5528/article/details/6256119 三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略(K5系列产品篇) 一年 ...

  8. Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议

    Nacos是阿里巴巴开源的服务发现与配置管理项目,本次发布的1.1.4版本,主要带来的是与Istio的对接功能,使用的是Istio最新的MCP协议.本文将介绍包括这个功能在内的新版本发布的功能. 升级 ...

  9. SpringBoot3.x原生镜像-Native Image尝鲜

    前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了.在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framewor ...

  10. SpringBoot3正式版将于11月24日发布:都有哪些新特性?

    从 2018 年 2 月 28 号发布 Spring Boot 2.0 版本开始,整个 2.X 版本已经经过了 4 年多的时间,累计发布了 95 个不同的版本,而就在前不久,2.X 系列的也已经迎来了 ...

随机推荐

  1. SpringBoot实现HandlerInterceptor拦截器的接口没有需要重写的方法也不报错是怎么回事

    以前实现HandlerInterceptor接口,总会提示需要实现3个方法(preHandle.postHandle.afterCompletion).现在没有出现提示.原因:这是Java8的新特性- ...

  2. DeepSeek-R1的“思考”艺术,你真的了解吗?

    大家好~,这里是AI粉嫩特攻队!今天咱们来聊聊一个有趣的话题--DeepSeek-R1到底什么时候会"思考",什么时候又会选择"偷懒"? 最近有朋友问我:&qu ...

  3. 飞牛 fnos 使用docker部署NapCat-QQ对接autman教程

    NapCatQQ介绍 无需图形环境,在Linux上表现出色,与现有Hook框架有本质区别,性能与内存占用优于基于Hook的框架. 配置简单,支持浏览器远程配置. NTQQ功能适配快速,持续跟进QQ最新 ...

  4. 大数据之路Week08_day02 (Flume架构介绍和安装)

    Flume架构介绍和安装 写在前面在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中,也 ...

  5. 【ABAQUS 二次开发笔记】一次获得多个积分点的输出到dat

    当使用shell单元进行composite laminate 建模时,可以为每一指定Intergration point 的个数,默认是3个.(abaqus有很多variable可以在intergra ...

  6. 腾讯云锐驰型轻量服务器搭建开源远程桌面软件RustDesk中继服务器小记

    RustDesk是一个基于Rust编写的全平台开源远程桌面软件,其最大的特点为开箱即用,且数据完全自主掌控,甚至可以依托此项目定制化开发自己专属的远程桌面软件. 一.前言 由于我个人经常性出差,对远程 ...

  7. OpenGL ES与GLSL ES各版本对应说明

    OpenGL ES 3.2 OpenGL ES 3.2 and OpenGL ES Shading Language 3.20 OpenGL ES 3.1 OpenGL ES 3.1 and Open ...

  8. Oracle存储过程里操作BLOB的字节数据的办法

    一.缘由 BLOB是指二进制大对象,也就是英文Binary Large Object的缩写. 在很多时候,我们是通过其他编程语言(如Java)访问BLOB的字节数据,进行字节级的操作的. 但是有些时候 ...

  9. NSIS打包脚本模板

    ; Script generated by the HM NIS Edit Script Wizard. ; HM NIS Edit Wizard helper defines !define PRO ...

  10. MYSQL架构介绍

    专栏持续更新中- 本专栏针对的是掌握MySQL基本操作后想要对其有深入了解并且有高性能追求的读者. 第一篇文章主要是对MySQL架构的主要概括,让读者脑海中有个对MySQL大体轮廓,很多地方没有展开细 ...