当前位置: 首页 > news >正文

如何使用Spring AI框架开发mcp接口并发布成微服务

Spring AI提供了一套简洁的机制,可以将Java方法暴露为AI模型可调用的工具。以下是完整的开发指南:

1. 环境准备

首先添加Spring AI依赖到你的项目中:

<!-- pom.xml -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>0.8.1</version> <!-- 使用最新版本 -->
</dependency>

2. 基础工具开发

2.1 创建工具类

import org.springframework.ai.tool.Tool;
import org.springframework.ai.tool.P;
import org.springframework.stereotype.Component;@Component
public class BusinessTools {// 简单工具示例@Tool(name = "calculate", description = "执行数学计算")public double calculate(@P(description = "第一个操作数") double a,@P(description = "运算符(+,-,*,/)") String op,@P(description = "第二个操作数") double b) {return switch (op) {case "+" -> a + b;case "-" -> a - b;case "*" -> a * b;case "/" -> a / b;default -> throw new IllegalArgumentException("不支持的运算符: " + op);};}
}

2.2 注册工具

import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**通过MethodToolCallbackProvider自动注册服务类中的工具方法*/
@Configuration
public class ToolConfiguration {@Beanpublic ToolCallbackProvider businessTools(BusinessTools tools) {return MethodToolCallbackProvider.builder().toolObjects(tools) // 注册包含@Tool注解的bean.build();}
}

3. 复杂工具开发

3.1 使用DTO作为参数

// 定义DTO
public record OrderRequest(String customerId,List<String> productIds,String shippingAddress) {}// 在工具类中添加方法
@Tool(name = "createOrder", description = "创建新订单")
public OrderResult createOrder(@P(description = "订单请求") OrderRequest request) {// 实际业务逻辑return orderService.create(request);
}

3.2 异步工具

@Tool(name = "generateReport", description = "生成业务报表")
public CompletableFuture<Report> generateReport(@P(description = "报表类型") ReportType type,@P(description = "日期范围") String dateRange) {return CompletableFuture.supplyAsync(() -> {// 长时间运行的报表生成逻辑return reportService.generate(type, dateRange);});
}

4. 工具调用控制

4.1 添加权限控制

@Tool(name = "deleteUser", description = "删除用户账户")
public String deleteUser(@P(description = "用户名") String username) {// 检查权限Authentication auth = SecurityContextHolder.getContext().getAuthentication();if (!auth.getAuthorities().contains("ROLE_ADMIN")) {throw new AccessDeniedException("无权执行此操作");}return userService.delete(username);
}

4.2 输入验证

@Tool(name = "reserveRoom", description = "预订会议室")
public ReservationResult reserveRoom(@P(description = "会议室ID") @Min(1) int roomId,@P(description = "开始时间(yyyy-MM-dd HH:mm)") @Future String startTime,@P(description = "持续时间(分钟)") @Min(15) @Max(240) int duration) {// 方法参数会自动验证return reservationService.reserve(roomId, startTime, duration);
}

5. 集成AI模型

5.1 配置AI客户端

import org.springframework.ai.chat.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AiConfig {@Beanpublic ChatClient chatClient(ToolCallbackProvider toolCallbackProvider) {return new OpenAiChatClient.Builder().apiKey("your-api-key").toolCallbackProvider(toolCallbackProvider) // 注册工具.build();}
}

5.2 创建控制器

import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/ai")
public class AiController {private final ChatClient chatClient;public AiController(ChatClient chatClient) {this.chatClient = chatClient;}@PostMapping("/chat")public String chat(@RequestBody String userMessage) {Prompt prompt = new Prompt(userMessage);ChatResponse response = chatClient.call(prompt);return response.getResult().getOutput().getContent();}
}

6. 转换成微服务

6.1 添加启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class McpServerApplication {public static void main(String[] args) {SpringApplication.run(McpServerApplication.class, args);}
}

6.2 添加application.yml

spring.ai.mcp.server.name=my-ai-server
spring.ai.mcp.server.version=0.0.1
server.port=9090

最佳实践

  1. 命名规范:使用动词-名词组合(如createOrdercalculateSum)
  2. 参数描述:为每个参数提供清晰的自然语言描述
  3. 错误处理:定义明确的错误响应格式
  4. 性能考虑:长时间运行的操作实现为异步
  5. 文档化:为每个工具添加详细的JavaDoc注释
  6. 安全审计:记录所有工具调用日志

通过以上步骤,你可以有效地将Java方法暴露为AI可调用微服务,构建智能化的业务应用,也可提供给dify、bisheng等智能体调用。

http://www.dtcms.com/a/305190.html

相关文章:

  • C51 中断
  • 笔试——Day22
  • 【Android】日期选择器
  • 镁金属接骨螺钉注册检测:骨科植入安全的科学基石
  • 【面试】软件测试面试题
  • ICT模拟零件测试方法--电阻测试
  • 集成电路学习:什么是WDT看门狗定时器
  • Java中的异常判断以及文件中的常用方法及功能
  • UCLAMP0501P.TCT SEMTECH:超低电容TVS二极管 0.25pF+20kV防护!
  • Python与Spark
  • 26考研11408数据结构
  • yolo11安卓端部署检测图片
  • Docker用Web应用实例深入容器
  • Docker初学者需要了解的几个知识点(三):Docker引擎与Docker Desktop
  • prometheus_client 调用统计
  • 2025年中科院与JCR期刊分区深度对比(第一期):TON中科院分区3区不变,JCR分区升至Q1;TOSEM重回中科院1区!
  • Wan2.1
  • openEuler性能测试常用工具-fio开源压力测试工具
  • 05动手学深度学习(下)
  • EnergyMath芯详科技 EMS4100/MES4000/MES3900
  • sqlite3---维护命令、回调函数
  • 用命令查看Android设备的 Linux 内核版本,了解其对应的硬件支持各种特性
  • gRPC性能陷阱:低延迟网络下的客户端瓶颈揭秘
  • k8s搭建nfs共享存储
  • 前端代码打包与压缩完全指南
  • div 封装日历
  • 使用echarts绘制立体柱状图
  • Export useForm doesn‘t exist in target module
  • 深度解读|美创科技参编国家标准《数字水印技术实现指南》
  • docker的安装和配置流程