把 Java WebApi 快速转为 Mcp-Server(使用 Solon AI MCP)

solon-ai-mcp,提供了各种 mcp 相关能力,支持 java8, java11, java17, java21, java24 。是 solon-ai 项目的重要组成部分,也可以嵌入到 springboot2, springboot3, jfinal, vert.x 等项目中使用。

依赖包:

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-mcp</artifactId>
    <version>最新版</version>
</dependency>

1、看一个简单的 web 控制器

此控制器有两个方法:get_weather,获取天气;get_rainfall,获取降雨量。后面基于它进行快速改造演示。

@Mapping("/web/api")
@Controller
public class McpServerTool {
    @Mapping("get_weather")
    public String get_weather(String location) {
        return "晴,14度";
    }
    
    @Mapping("get_rainfall")
    public String get_rainfall(String location) {
        return "555毫米";
    }
}

2、改造方案1:复用 mvc 注解,并添加 @McpServerEndpoint 注解

在 mvc 注解基础上,给方法和参数添加描述信息 description 信息(只适合 solon-web 项目,它的注解带有 description 属性)。再添加 @McpServerEndpoint 注解

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
@Mapping("/web/api")
@Controller
public class McpServerTool {
    @Mapping(path="get_weather", description = "查询天气预报")
    public String get_weather(@Param(description = "城市位置") String location) {
        return "晴,14度";
    }
    
    @Mapping(path="get_rainfall", description = "查询城市降雨量")
    public String get_rainfall(@Param(description = "城市位置") String location) {
        return "555毫米";
    }
}

这个方案的提醒说明:

  • @Mapping (通用注解)相当于 ai 的 @ToolMapping(专用注解)
  • @Param (通用注解)相当于 ai 的 @ToolParam(专用注解)
  • 必须申明 description 属性(否则会异常提示)

3、改造方案2:在控制器上,添加完整的 Mcp 相关注解

这个方案也适合 springboot2-web、sprngboot3-web、spring-mvc 或 jfinal 等项目,原控制器的代码不用动(原来有没有注解,不影响)。就像添加 swagger 注解那样,添加 mcp 相关注解即可。

注解简单说明(? 表示可选属性):

注解描述
@ToolMapping(name?, description, returnDirect?, resultConverter?) 工具映射
@ToolParam(name?, description, required?)工具的参数申明

改造后的代码:

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
@Mapping("/web/api")
@RestController
public class McpServerTool {
    @ToolMapping(description = "查询天气预报")
    @GetMapping("get_weather")
    public String get_weather(@ToolParam(description = "城市位置") String location) {
        return "晴,14度";
    }
    
    @ToolMapping(description = "查询城市降雨量")
    @GetMapping("get_rainfall")
    public String get_rainfall(@ToolParam(description = "城市位置") String location) {
        return "555毫米";
    }
}

4、也可以转为本地的大模型工具提供者使用(ToolProvider)

上两个方案去掉 @McpServerEndpoint 注解,就不会发布为 MCP 服务端点。使用 MethodToolProvider 加载它,就能成为本地的工具提供者。

MethodToolProvider toolProvider = new MethodToolProvider(new McpServerTool());

var chatModel = ChatModel.of(...)
                .defaultToolsAdd(toolProvider) //添加默认工具
                .build();

chatModel.prompt("杭州今天的天气怎么样?")
              .call();

5、附代码仓库

solon-ai(源码)

solon-ai-mcp-embedded-examples(嵌入示例)

原创作者: noear 转载于: https://www.cnblogs.com/noear/p/18848757
### 关于 Solon AI MCP Server 的技术信息 Solon AI 是一个基于 Java 的轻量级框架,旨在简化微服务架构下的开发流程。`solon-ai-mcp-server` 是其生态系统中的一个重要模块,主要用于支持模型控制协议(Model Control Protocol, MCP)。以下是关于 `solon-ai-mcp-server` 的一些技术和使用方面的详细介绍: #### 1. **Maven 依赖** 要集成 `solon-ai-mcp-server` 到项目中,可以通过 Maven 添加以下依赖项: ```xml <dependency> <groupId>org.noear</groupId> <artifactId>solon-ai-mcp</artifactId> </dependency> ``` 此依赖提供了基础功能以构建和运行 MCP 服务器[^1]。 #### 2. **基本配置** 为了启用并正确配置 `solon-ai-mcp-server`,需要在项目的 `application.properties` 文件中设置如下参数: ```properties spring.ai.mcp.server.enabled=true spring.ai.mcp.server.name=my-solon-mcp-server spring.ai.mcp.server.version=1.0.0 spring.ai.mcp.server.type=ASYNC spring.ai.mcp.server.sse-message-endpoint=/mcp/stream-messages ``` 这些属性定义了 MCP 服务器的行为模式以及消息流的处理方式[^3]。 #### 3. **启动与初始化** 通过继承或扩展默认的服务类,开发者能够快速创建自定义逻辑的服务实例。例如: ```java import org.noear.solon.annotation.Component; import org.noear.solon.core.Aop; @Component public class MyCustomService extends AbstractMcpservice { @Override public String processRequest(String input) { // 自定义业务逻辑 return "Processed: " + input; } } ``` 在此基础上,确保应用上下文中已注册该组件以便被自动扫描加载[^4]。 #### 4. **客户端交互** 虽然当前讨论重点在于服务端部分,但了解如何设计兼容性强的客户端同样重要。Python 实现了一个简单的例子展示怎样连接到远程部署好的 MCP Server 并发送请求获取响应数据[^2]: ```python import requests url = 'http://localhost:8080/mcp/api' payload = {'text': 'hello world'} headers = {'Content-Type': 'application/json'} response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` 以上脚本演示了向本地运行的服务发起 POST 请求的过程,并解析返回的结果作为 JSON 格式输出显示给用户查看。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值