SpringBoot集成MCP:从零构建企业级AI服务接口
1. 为什么需要SpringBoot集成MCP?
最近两年AI技术突飞猛进,很多企业都在思考如何将大模型能力快速集成到现有系统中。但直接调用大模型API存在几个痛点:接口不统一、业务逻辑耦合严重、无法复用现有系统能力。这时候MCP(Model Context Protocol)协议就派上用场了。
MCP就像AI世界里的"通用翻译器",它定义了一套标准交互协议,让不同AI模型都能用相同方式调用你的业务系统。举个例子,当用户对AI说"帮我查昨天的订单",AI会通过MCP协议自动转换成系统能理解的查询请求,整个过程对用户完全透明。
我在实际项目中发现,用SpringBoot集成MCP后,传统业务系统可以快速获得以下能力:
- 自然语言交互:用户可以用日常语言操作系统
- 无缝模型切换:今天用GPT-4,明天换Claude 3,业务代码完全不用改
- 现有能力复用:直接暴露SpringBoot服务方法给AI调用
2. 环境准备与基础配置
2.1 创建SpringBoot项目
首先访问 Spring Initializr 创建项目,需要勾选以下依赖:
- Spring Web (用于HTTP接口)
- Spring AI (核心AI支持)
- MCP Server (协议支持)
如果你习惯用命令行,可以用这个curl命令快速生成项目:
curl https://start.spring.io/starter.tgz \ -d dependencies=web,ai,mcp-server \ -d packageName=com.example.mcp \ -d name=mcp-demo \ -d javaVersion=17 \ | tar -xzvf -2.2 配置MCP服务器
在application.properties中添加基础配置:
# 启用MCP服务 spring.ai.mcp.server.enabled=true # 服务名称(重要!客户端靠这个识别服务) spring.ai.mcp.server.name=my-mcp-service # 使用同步模式(适合大多数场景) spring.ai.mcp.server.type=SYNC # 关闭STDIO模式(我们用HTTP) spring.ai.mcp.server.stdio=false这里有个坑要注意:服务名称spring.ai.mcp.server.name一定要全局唯一,否则多个服务注册时会冲突。我建议采用"业务领域+环境"的命名方式,比如"order-service-prod"。
3. 开发第一个MCP工具
3.1 定义工具方法
我们以查询天气为例,创建一个基础服务:
@Service public class WeatherService { @Tool(name = "queryWeather", description = "查询城市天气,返回温度、湿度和天气状况") public WeatherData getWeather( @ToolParam(description = "城市名称") String city) { // 模拟数据,实际项目可以接入第三方API return new WeatherData(city, 25, 65, "晴"); } public record WeatherData( String city, int temperature, int humidity, String condition) {} }关键点说明:
@Tool注解标记这是一个MCP工具description要清晰描述功能,AI靠这个理解方法用途@ToolParam描述参数含义
3.2 注册工具到MCP
创建配置类将服务暴露为MCP工具:
@Configuration public class McpConfig { @Bean ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); } }4. 协议转换与接口暴露
4.1 理解MCP通信流程
当AI调用你的服务时,完整的协议转换过程是这样的:
- 用户输入:"上海天气怎么样?"
- AI识别意图,生成MCP格式请求:
{ "action": "queryWeather", "params": {"city": "上海"} }- MCP客户端将请求转发给你的SpringBoot服务
- 你的服务返回结构化数据:
{ "city": "上海", "temperature": 25, "humidity": 65, "condition": "晴" }- AI将数据转换为自然语言回复:"上海当前晴天,气温25℃,湿度65%"
4.2 支持多种传输协议
MCP支持多种传输方式,在application.properties中配置:
# 使用HTTP SSE协议(推荐) spring.ai.mcp.server.protocol=SSE # 或者使用Streamable-HTTP # spring.ai.mcp.server.protocol=STREAMABLE不同协议的对比如下:
| 协议类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| STDIO | 本地调试 | 简单直接 | 不适合生产环境 |
| SSE | 实时交互 | 低延迟 | 需要长连接 |
| Streamable-HTTP | 通用场景 | 兼容性好 | 略复杂 |
5. 高级功能实战
5.1 数据库操作工具
将Spring Data JPA方法暴露为AI工具:
@Service public class OrderService { @Autowired private OrderRepository repository; @Tool(description = "根据订单状态查询订单列表") public List<Order> queryOrders( @ToolParam(description = "订单状态:CREATED/PAID/DELIVERED") String status) { return repository.findByStatus(OrderStatus.valueOf(status)); } @Tool(description = "创建新订单") public Order createOrder( @ToolParam(description = "商品ID列表") List<Long> productIds, @ToolParam(description = "用户ID") Long userId) { // 业务逻辑... } }5.2 异常处理技巧
MCP调用可能出现的错误需要特殊处理:
@ControllerAdvice public class McpExceptionHandler { @ExceptionHandler(McpToolException.class) public ResponseEntity<ErrorResponse> handleToolException(McpToolException e) { // 转换为AI能理解的错误格式 return ResponseEntity.badRequest() .body(new ErrorResponse( e.getToolName(), e.getErrorCode(), "调用失败: " + e.getMessage() )); } public record ErrorResponse( String tool, String code, String message) {} }6. 调试与优化
6.1 使用MCP Inspector调试
Spring AI提供了可视化调试工具,添加依赖:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-inspector</artifactId> </dependency>访问 http://localhost:8080/mcp-inspector 可以看到:
- 已注册的工具列表
- 实时请求日志
- 协议转换详情
6.2 性能优化建议
- 批处理工具:将高频调用的工具合并
@Tool(description = "批量查询订单信息") public List<Order> batchQueryOrders( @ToolParam(description = "订单ID列表") List<Long> orderIds) { return repository.findAllById(orderIds); }- 启用缓存:对耗时的查询结果缓存
@Cacheable("weather") @Tool(description = "查询城市天气") public WeatherData getWeather(String city) { // ... }- 异步工具:长时间任务使用异步模式
@Async @Tool(description = "生成月度报表") public CompletableFuture<Report> generateReport( @ToolParam(description = "月份") String month) { // ... }7. 生产环境部署
7.1 容器化部署
推荐使用Docker部署,这里是个Dockerfile示例:
FROM eclipse-temurin:17-jdk COPY target/mcp-demo.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]构建和运行命令:
docker build -t mcp-service . docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod mcp-service7.2 安全配置
生产环境必须添加安全措施:
# 启用认证 spring.ai.mcp.server.auth.enabled=true # JWT密钥 spring.ai.mcp.server.auth.jwt.secret=your-strong-secret # 允许的客户端ID spring.ai.mcp.server.auth.allowed-client-ids=client1,client28. 真实案例分享
去年我们给某电商系统接入了MCP,改造后的效果:
- 客服工单处理效率提升60%
- 新AI功能上线时间从2周缩短到2天
- 订单查询接口调用量下降30%(用户直接问AI)
关键实现代码片段:
@Tool(description = "综合查询订单信息") public OrderDetail getOrderDetail( @ToolParam(description = "订单号") String orderNo, McpSyncServerExchange exchange) { // 记录审计日志 exchange.loggingNotification( LoggingMessageNotification.builder() .level(LoggingLevel.INFO) .data("查询订单: " + orderNo) .build()); // 业务查询 Order order = orderService.findByNo(orderNo); List<Logistics> logistics = logisticsService.queryByOrder(orderNo); return new OrderDetail(order, logistics); }这个案例让我深刻体会到,好的技术方案应该是让AI适应现有系统,而不是推翻重来。SpringBoot+MCP的组合完美实现了这一点。
