【MCP实战】Spring Boot 3.3 + MCP 协议:让AI Agent调用你的内部API,2天落地智能客服 文章目录写在前面上一篇搭了Spring Boot AI Agent的CRUD自动生成框架。有读者问怎么让Agent不只是写代码而是真正调用公司内部系统这就得说MCP协议了。MCPModel Context Protocol是Anthropic在2024年底开源的协议目的就一个让AI能标准化地调用任何外部工具。 数据库查询、API调用、文件操作——统统用一套协议搞定。目前已经是AI Agent接入企业系统的实际标准。这篇文章教你三件事MCP协议到底怎么工作的用Spring Boot实现一个MCP Server如何把公司内部API注册为MCP Tool让AI调用实战2天搭建一个能查订单、改状态、发通知的智能客服环境Spring Boot 3.3.0 JDK 21 Maven。MCP协议版本2024-11-05。一、先搞清楚MCP解决了什么问题在没有MCP之前让AI调用你的内部系统是地狱模式。你有一个订单查询API、一个库存API、一个通知API。想让AI Agent帮用户查我的订单状态如果发货了发个通知——这需要AI能调用这三个API。传统做法是每次换一个AI平台就重新写一套适配代码。你用OpenAI的Function Calling写了一遍换到Claude又得写一遍换成国产AI又得写一遍。代码散落在各个AI平台的SDK里维护成本巨高。MCP的解法是一套标准你的系统只需要实现一个MCP Server任何支持MCP协议的AI客户端都能直接调用。 不再和特定AI平台绑定。你的系统作为一个MCP Server暴露Tools可调用的功能AI Agent作为MCP Client来调用。二、搭建MCP Server15分钟出原型新建Spring Boot项目pom.xml加MCP依赖。注意截至2026年7月Spring AI的MCP支持还在快速迭代中以官方最新文档为准。xmlorg.springframework.boot spring-boot-starter-web org.springframework.ai spring-ai-mcp-server 1.0.0-M3 spring-milestones https://repo.spring.io/milestone 三、定义你的第一个MCP Tool Tool是MCP的核心概念——就是AI能调用的一个功能。每个Tool有三个要素名称AI用来识别该调哪个、描述AI用来理解这个Tool能干什么、参数SchemaAI用来知道该传什么参数。先写一个最简单的订单查询Tooljavapackage com.example.mcpserver.tool;import org.springframework.ai.tool.annotation.Tool;import org.springframework.ai.tool.annotation.ToolParam;import org.springframework.stereotype.Component;Componentpublic class OrderQueryTool {Tool(description 根据订单ID查询订单详情包括订单状态、商品列表、收货地址、物流信息) public OrderInfo queryOrder( ToolParam(description 订单ID格式为ORD开头加数字如ORD12345) String orderId) { // 实际项目里这里调数据库或远程API // 为了演示用模拟数据 if (!orderId.startsWith(ORD)) { throw new IllegalArgumentException(订单ID格式错误应为ORD开头); } OrderInfo order new OrderInfo(); order.setOrderId(orderId); order.setStatus(已发货); order.setTotalAmount(299.00); order.setTrackingNumber(SF1234567890); order.setDeliveryAddress(广东省深圳市南山区科技园); order.setItems(List.of( new OrderItem(罗技鼠标 G502, 199.00, 1), new OrderItem(机械键盘 IKBC C87, 100.00, 1) )); return order; }}关键注解说明Tool 声明这是一个MCP Tooldescription是AI用来理解这个Tool功能的ToolParam 声明参数description告诉AI该传什么格式的数据description的质量直接决定了AI能不能正确调用你的Tool——写详细点没坏处四、加上业务操作Tool查询只是第一步。让AI能修改订单状态、发送通知javapackage com.example.mcpserver.tool;import org.springframework.ai.tool.annotation.Tool;import org.springframework.ai.tool.annotation.ToolParam;import org.springframework.stereotype.Component;Componentpublic class OrderActionTool {Tool(description 修改订单状态。支持的status值PAID-已支付, SHIPPED-已发货, DELIVERED-已签收, CANCELLED-已取消。 注意已发货和已签收的订单不能取消已完成订单状态不能回退) public String updateOrderStatus( ToolParam(description 订单ID) String orderId, ToolParam(description 新状态) String status, ToolParam(description 操作原因用于审计日志) String reason) { // 业务规则校验 String currentStatus queryCurrentStatus(orderId); if (CANCELLED.equals(status) (SHIPPED.equals(currentStatus) || DELIVERED.equals(currentStatus))) { return 操作失败已发货或已签收的订单不能取消。当前状态 currentStatus; } // 实际调数据库更新此处省略 // orderRepository.updateStatus(orderId, status, reason); return 订单 orderId 状态已更新为 status 原因 reason; } Tool(description 给订单关联的用户发送通知。type支持SMS-短信, EMAIL-邮件, APP-应用内推送。 发送前需要确认用户已允许接收该类通知) public String sendNotification( ToolParam(description 订单ID) String orderId, ToolParam(description 通知类型) String type, ToolParam(description 通知内容不超过200字) String content) { // 检查用户通知偏好 // 实际调通知服务发送 return 已通过 type 向订单 orderId 的用户发送通知 content; } private String queryCurrentStatus(String orderId) { // 实际查数据库 return PAID; }}五、配置MCP Server端点在application.yml中配置MCP Serveryamlspring:ai:mcp:server:name: “智能客服系统”version: “1.0.0”protocol-version: “2024-11-05”enabled: truetransport: SSE # Server-Sent Events方式支持流式响应sse-endpoint: /mcp/ssesse-message-endpoint: /mcp/messages启动项目后MCP Server会自动暴露这些端点。AI客户端就可以通过它们发现并调用你注册的所有Tools。六、验证用MCP Inspector测试你的ToolSpring AI提供的MCP Inspector调试工具可以直接在浏览器测试Tool是否正确注册java// 启动类加个健康检查端点RestControllerRequestMapping(“/health”)public class HealthController {GetMapping(/tools) public MapString, Object listTools() { // 返回已注册的Tool列表方便调试 return Map.of( tools, List.of( Map.of(name, queryOrder, description, 查询订单详情), Map.of(name, updateOrderStatus, description, 修改订单状态), Map.of(name, sendNotification, description, 发送用户通知) ), mcpServer, 运行中, endpoint, /mcp/sse ); }}启动后访问 http://localhost:8080/health/tools 能看到已注册的三个Tool确认MCP Server正常工作。七、接入AI Agent让AI调用你的ToolMCP Server搭好后任何支持MCP协议的AI客户端都能连上来。以Claude Desktop为例在它的MCP配置里加一行json{“mcpServers”: {“智能客服”: {“url”: “http://your-server:8080/mcp/sse”}}}配置完成后你打开Claude Desktop它就能看到你的工具了。对话测试用户帮我查一下订单ORD12345的状态Claude[自动调用你MCP Server上的queryOrder Tool]返回订单ORD12345状态已发货物流单号SF1234567890用户发货了是吧那帮我发个短信通知用户Claude[自动调用sendNotification Tool]已通过SMS向订单ORD12345的用户发送通知八、踩坑记录坑1Tool描述写得不够详细AI不会调。如果你的Tool description只写了查询订单AI不知道什么场景该调它、传什么参数。详细的描述应该告诉AI这个Tool干什么用、什么场景下该用、参数格式是什么、返回值包含哪些字段。坑2参数校验要在Tool内部做。AI可能传各种奇怪的参数进来。空字符串、乱七八糟的ID格式、不存在的订单号——必须在你自己的Tool代码里做充分的参数校验和错误返回。坑3敏感操作需要确认机制。像取消订单退款这种操作不应让AI自动执行。在Tool的实现里加一个确认步骤——比如让AI先展示操作的详细信息得到用户确认后再执行。javaTool(description “发起退款操作。注意这是一个敏感操作执行前必须在对话中向用户确认退款金额和原因”)public String refund(ToolParam String orderId, ToolParam Double amount, ToolParam String reason) {// AI会在调用前先向用户确认因为description里写了log.warn(“退款操作orderId{}, amount{}, reason{}”, orderId, amount, reason);// 实际调用退款服务return “退款申请已提交预计3-5个工作日到账”;}九、总结搞完这三步你就有了一套可复用的MCP能力。第一步用Spring AI MCP把公司内部API包装成标准Tool。第二步任何支持MCP的AI客户端都能直接调用不再绑定特定平台。第三步安全操作加确认机制敏感数据不出内网。后续可以扩展的方向数据库直连Tool让AI自己拼SQL不用预定义的查询方法和参数化调用、权限集成接入SSOTool内部读取当前用户权限决定返回哪些数据、多Agent协作一个Agent负责查订单另一个负责客服话术用MCP串联。如果这篇对你有用点赞收藏支持一下。