找回密码
 立即注册
首页 业界区 业界 SpringBoot3 使用 SolonMCP 开发 MCP

SpringBoot3 使用 SolonMCP 开发 MCP

羽桑 2025-6-2 23:46:01
之前发了个 “《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 主要依赖包:
  1. <dependency>
  2.     <groupId>org.noear</groupId>
  3.     solon-ai-mcp</artifactId>
  4. </dependency>
复制代码
具体的示例参考:

  • https://gitee.com/opensolon/solon-ai-mcp-embedded-examples/tree/main/solon-ai-embedded-springboot3
  • https://gitee.com/opensolon/solon-ai-mcp-embedded-examples/tree/main/solon-ai-embedded-springboot3-newstyle
2、MCP 服务端开发

2.1、添加入口类 webapp.HelloApp
  1. @SpringBootApplication
  2. public class HelloApp {
  3.     public static void main(String[] args) {
  4.         SpringApplication.run(HelloApp.class, args);
  5.     }
复制代码
2.2、添加个空接口 webapp.mcpserver.IMcpServerEndpoint

用于识别端点组件类
  1. public interface IMcpServerEndpoint { }
复制代码
2.3、添加 webapp.mcpserver.McpServerConfig

拖管 solon 的生命周期。收集 IMcpServerEndpoint 组件,并转为 McpServerEndpointProvider
  1. @Configuration
  2. public class McpServerConfig {
  3.     @PostConstruct
  4.     public void start() {
  5.         Solon.start(McpServerConfig.class, new String[]{"--cfg=mcpserver.yml"});
  6.     }
  7.     @PreDestroy
  8.     public void stop() {
  9.         if (Solon.app() != null) {
  10.             Solon.stopBlock(false, Solon.cfg().stopDelay());
  11.         }
  12.     }
  13.     @Bean
  14.     public McpServerConfig init(List<IMcpServerEndpoint> serverEndpoints) {
  15.         for (IMcpServerEndpoint serverEndpoint : serverEndpoints) {
  16.             //这里注意一下,如果有代理的话需要用 AnnotationUtils 获取注解
  17.             McpServerEndpoint anno = AnnotationUtils.findAnnotation(serverEndpoint.getClass(), McpServerEndpoint.class);
  18.             if (anno == null) {
  19.                 continue;
  20.             }
  21.             McpServerEndpointProvider serverEndpointProvider = McpServerEndpointProvider.builder()
  22.                     .from(serverEndpoint.getClass(), anno)
  23.                     .build();
  24.             serverEndpointProvider.addTool(new MethodToolProvider(serverEndpoint));
  25.             serverEndpointProvider.addResource(new MethodResourceProvider(serverEndpoint));
  26.             serverEndpointProvider.addPrompt(new MethodPromptProvider(serverEndpoint));
  27.             serverEndpointProvider.postStart();
  28.             //可以再把 serverEndpointProvider 手动转入 SpringBoot 容器
  29.         }
  30.         //为了能让这个 init 能正常运行
  31.         return this;
  32.     }
  33.     @Bean
  34.     public FilterRegistrationBean mcpServerFilter() {
  35.         FilterRegistrationBean<SolonServletFilter> filter = new FilterRegistrationBean<>();
  36.         filter.setName("SolonFilter");
  37.         filter.addUrlPatterns("/mcp/*");
  38.         filter.setFilter(new SolonServletFilter());
  39.         return filter;
  40.     }
  41. }
复制代码
2.4、添加 webapp.mcpserver.tool.McpServer(实现 Handler、IPlugin 接口)

这里是重点了,添加 mcp server 端点(支持多个端点)。这里是正常的 SpringBoot 组件开发了。
  1. @Component //注意这个注解别用错了(solon 里也有同名的)
  2. @McpServerEndpoint(name="demo1", sseEndpoint = "/mcp/demo1/sse")
  3. public class McpServerTool implements IMcpServerEndpoint {
  4.     //
  5.     // 建议开启编译参数:-parameters (否则,最好再配置参数的 name)
  6.     //
  7.     @ToolMapping(description = "查询天气预报")
  8.     public String getWeather(@Param(description = "城市位置") String location) {
  9.         return "晴,14度";
  10.     }
  11.     @ResourceMapping(uri = "config://app-version", description = "获取应用版本号")
  12.     public String getAppVersion() {
  13.         return "v3.2.0";
  14.     }
  15.     @ResourceMapping(uri = "db://users/{user_id}/email", description = "根据用户ID查询邮箱")
  16.     public String getEmail(@Param(description = "用户Id") String user_id) {
  17.         return user_id + "@example.com";
  18.     }
  19.     @PromptMapping(description = "生成关于某个主题的提问")
  20.     public Collection<ChatMessage> askQuestion(@Param(description = "主题") String topic) {
  21.         return Arrays.asList(
  22.                 ChatMessage.ofUser("请解释一下'" + topic + "'的概念?")
  23.         );
  24.     }
  25. }
复制代码
2.5、编译后运行

或者开发时,直接运行 HelloApp:main 方法
3、MCP 客户端开发

客户端简单些
  1. public class McpClientTest {
  2.     public static void main(String[] args) throws Exception {
  3.         McpClientProvider toolProvider = McpClientProvider.builder()
  4.                 .apiUrl("http://localhost:8080/mcp/sse")
  5.                 .build();
  6.         //工具调用
  7.         Map<String, Object> map = Collections.singletonMap("location", "杭州");
  8.         String rst = toolProvider.callToolAsText("getWeather", map).getContent();
  9.         System.out.println(rst);
  10.         assert "晴,14度".equals(rst);
  11.         
  12.         
  13.         //资源读取
  14.         resourceContent = toolProvider.readResourceAsText("config://app-version").getContent();
  15.         System.out.println(resourceContent);
  16.     }
  17. }
复制代码
4、MCP 客户端作为 LLM(ChatModel) 的工具集使用

也比较简单。使用 ollama 做为 llm 提供者,方便本地测试。
  1. public class McpClientTest {
  2.     private static final String apiUrl = "http://127.0.0.1:11434/api/chat";
  3.     private static final String provider = "ollama";
  4.     private static final String model = "qwen2.5:1.5b"; //"llama3.2";//deepseek-r1:1.5b;
  5.    
  6.     public static void main(String[] args) throws Exception {
  7.         //构建 mcp client
  8.         McpClientProvider toolProvider = McpClientProvider.builder()
  9.                 .apiUrl("http://localhost:8080/mcp/sse")
  10.                 .build();
  11.         //构建 llm 接口
  12.         ChatModel chatModel = ChatModel.of(apiUrl)
  13.                 .provider(provider)
  14.                 .model(model)
  15.                 .defaultToolsAdd(toolProvider) //添加默认工具(这是 mcp client)
  16.                 .build();
  17.         
  18.         //请求
  19.         ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
  20.                 .call();
  21.         System.out.println(resp.getMessage());
  22.     }
  23. }
复制代码
5、SpringBoot3 和 SpringBoot2 使用 SolonMCP 有什么区别?

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册