上集回顾老张用Tool注解让AI学会了干活查订单、查库存都不在话下。但新问题来了企业要接CRM、ERP、WMS三个系统每个都要手写工具类太麻烦了。一、故事继续工具开发的噩梦周一早上老张看着需求文档发呆需求清单 □ 接入CRM系统客户信息、销售数据 □ 接入ERP系统订单、库存、财务 □ 接入WMS系统仓库管理、物流追踪 □ 接入OA系统请假审批、报销流程老张的困境“每个系统都要写一套Tool方法还要处理不同的认证、接口、数据结构…这得写到什么时候”同事小王路过瞥了一眼“张哥你out了现在流行MCP协议一个协议搞定所有系统。”二、技术引入什么是MCP2.1 MCP是什么MCP Model Context Protocol模型上下文协议传统方式MCP方式每个系统手写工具类统一协议接入自定义认证方式OAuth标准化各自为战工具发现自动注册重复造轮子生态共享老张的理解“MCP就像USB接口——任何设备插上就能用不用再买专用线。”2.2 MCP的两端┌─────────────────────────────────────────┐ │ AI应用客户端 │ │ ChatClient MCP Client │ │ ↓ │ │ 自动发现工具 → 调用 → 返回结果 │ └─────────────────────────────────────────┘ ↓ MCP协议 ┌─────────────────────────────────────────┐ │ 企业系统服务端 │ │ MCP Server Tool │ │ ↓ │ │ 暴露工具 → 接受调用 → 返回结果 │ └─────────────────────────────────────────┘三、第一步搭建MCP服务端3.1 添加依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server/artifactId/dependency3.2 创建MCP ServerConfigurationpublicclassMcpServerConfig{BeanpublicMcpServerFeatures.AutoServerRegistrationorderMcpServer(OrderToolsorderTools){returnMcpServerFeatures.AutoServerRegistration.builder().toolCallbacks(orderTools).build();}}3.3 工具定义复用第7集的ToolComponentpublicclassOrderTools{Tool(description查询订单状态)publicStringqueryOrder(ToolParamStringorderId){// ... 实现逻辑}}老张的发现“原来Tool注解可以复用MCP只是帮我们把工具打包成标准协议。”四、第二步连接多个系统4.1 CRM系统MCPComponentpublicclassCrmTools{Tool(description查询客户信息)publicStringgetCustomerInfo(ToolParamStringcustomerId){// 调用CRM APICustomercustomercrmClient.get(customerId);returnformatCustomer(customer);}Tool(description创建销售线索)publicStringcreateLead(ToolParamStringname,ToolParamStringcompany,ToolParamStringphone){// 创建线索LeadleadcrmClient.createLead(name,company,phone);return线索创建成功IDlead.getId();}}4.2 ERP系统MCPComponentpublicclassErpTools{Tool(description查询库存)publicStringqueryInventory(ToolParamStringproductId){// 调用ERP APIInventoryinverpClient.getInventory(productId);returnString.format(库存%d件,inv.getStock());}Tool(description创建采购订单)publicStringcreatePurchaseOrder(ToolParamStringsupplierId,ToolParamListOrderItemitems){// 创建采购单PurchaseOrderpoerpClient.createPO(supplierId,items);return采购单创建成功po.getOrderNo();}}4.3 统一注册ConfigurationpublicclassMcpServerRegistry{BeanpublicListMcpServerFeatures.AutoServerRegistrationmcpServers(OrderToolsorderTools,CrmToolscrmTools,ErpToolserpTools){returnList.of(McpServerFeatures.AutoServerRegistration.builder().toolCallbacks(orderTools).build(),McpServerFeatures.AutoServerRegistration.builder().toolCallbacks(crmTools).build(),McpServerFeatures.AutoServerRegistration.builder().toolCallbacks(erpTools).build());}}五、第三步客户端调用5.1 MCP客户端配置ConfigurationpublicclassMcpClientConfig{BeanpublicMcpClientmcpClient(){returnMcpClient.builder().serverUri(http://localhost:8081)// MCP服务器地址.build();}}5.2 自动工具发现ServicepublicclassIntelligentAgent{AutowiredprivateChatClientchatClient;AutowiredprivateMcpClientmcpClient;publicStringchat(StringuserId,Stringquestion){// 自动发现并加载所有MCP工具ListToolCallbacktoolsmcpClient.getToolCallbacks();returnchatClient.prompt().user(question).tools(tools)// ← 自动注入所有工具.call().content();}}老张的感叹“一个协议所有系统自动接入比手写Tool优雅多了。”六、MCP的额外优势6.1 标准化认证# MCP客户端配置spring:ai:mcp:client:server-url:http://mcp-server:8080auth:type:oauth2token-url:https://auth.example.com/tokenclient-id:ai-clientscopes:-read-write6.2 工具描述标准化{name:queryOrder,description:查询订单状态,inputSchema:{type:object,properties:{orderId:{type:string,description:订单号}},required:[orderId]}}AI能直接理解这个Schema不需要额外解释。七、效果对比维度传统方式MCP方式接入新系统2-3天2小时工具维护分散在各模块集中管理认证管理各自实现统一OAuth生态共享无可复用现成Server八、下一集预告老张用MCP接入了所有系统但代码还是有点乱每次都要手写检索、记忆、工具的逻辑。第9集《Spring AI的Advisor链式架构》将讲述如何用AOP式的链式结构让AI系统像Spring MVC一样优雅。 完整代码GitHub分支https://github.com/yinclei/SpringAITutorial/chapter08-mcp-protocol 互动环节老兵问答你的企业有哪些系统需要接入AIA. CRM系统B. ERP/财务系统C. 供应链/WMSD. OA/审批系统E. 以上都有下周五晚9点我们继续作者Java老兵搞AI | 关注我看Java如何玩转AI