第8集:MCP协议:一个协议让AI接入所有企业系统

上集回顾:老张用@Tool注解让AI学会了"干活",查订单、查库存都不在话下。但新问题来了:企业要接CRM、ERP、WMS三个系统,每个都要手写工具类,太麻烦了。


一、故事继续:工具开发的噩梦

周一早上,老张看着需求文档发呆:

复制代码
需求清单:
□ 接入CRM系统(客户信息、销售数据)
□ 接入ERP系统(订单、库存、财务)
□ 接入WMS系统(仓库管理、物流追踪)
□ 接入OA系统(请假审批、报销流程)

老张的困境:"每个系统都要写一套@Tool方法,还要处理不同的认证、接口、数据结构...这得写到什么时候?"

同事小王路过,瞥了一眼:"张哥,你out了,现在流行MCP协议,一个协议搞定所有系统。"


二、技术引入:什么是MCP?

2.1 MCP是什么?

MCP = Model Context Protocol(模型上下文协议)

传统方式 MCP方式
每个系统手写工具类 统一协议接入
自定义认证方式 OAuth标准化
各自为战 工具发现自动注册
重复造轮子 生态共享

老张的理解:"MCP就像USB接口------任何设备插上就能用,不用再买专用线。"

2.2 MCP的两端

arduino 复制代码
┌─────────────────────────────────────────┐
│           AI应用(客户端)                │
│  ChatClient + MCP Client                │
│      ↓                                  │
│  自动发现工具 → 调用 → 返回结果          │
└─────────────────────────────────────────┘
                    ↓ MCP协议
┌─────────────────────────────────────────┐
│           企业系统(服务端)              │
│  MCP Server + @Tool                     │
│      ↓                                  │
│  暴露工具 → 接受调用 → 返回结果          │
└─────────────────────────────────────────┘

三、第一步:搭建MCP服务端

3.1 添加依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>

3.2 创建MCP Server

java 复制代码
@Configuration
public class McpServerConfig {
    
    @Bean
    public McpServerFeatures.AutoServerRegistration orderMcpServer(
        OrderTools orderTools
    ) {
        return McpServerFeatures.AutoServerRegistration.builder()
            .toolCallbacks(orderTools)
            .build();
    }
}

3.3 工具定义(复用第7集的@Tool)

java 复制代码
@Component
public class OrderTools {
    
    @Tool(description = "查询订单状态")
    public String queryOrder(@ToolParam String orderId) {
        // ... 实现逻辑
    }
}

老张的发现:"原来@Tool注解可以复用!MCP只是帮我们把工具打包成标准协议。"


四、第二步:连接多个系统

4.1 CRM系统MCP

java 复制代码
@Component
public class CrmTools {
    
    @Tool(description = "查询客户信息")
    public String getCustomerInfo(@ToolParam String customerId) {
        // 调用CRM API
        Customer customer = crmClient.get(customerId);
        return formatCustomer(customer);
    }
    
    @Tool(description = "创建销售线索")
    public String createLead(
        @ToolParam String name,
        @ToolParam String company,
        @ToolParam String phone
    ) {
        // 创建线索
        Lead lead = crmClient.createLead(name, company, phone);
        return "线索创建成功,ID:" + lead.getId();
    }
}

4.2 ERP系统MCP

java 复制代码
@Component
public class ErpTools {
    
    @Tool(description = "查询库存")
    public String queryInventory(@ToolParam String productId) {
        // 调用ERP API
        Inventory inv = erpClient.getInventory(productId);
        return String.format("库存:%d件", inv.getStock());
    }
    
    @Tool(description = "创建采购订单")
    public String createPurchaseOrder(
        @ToolParam String supplierId,
        @ToolParam List<OrderItem> items
    ) {
        // 创建采购单
        PurchaseOrder po = erpClient.createPO(supplierId, items);
        return "采购单创建成功:" + po.getOrderNo();
    }
}

4.3 统一注册

java 复制代码
@Configuration
public class McpServerRegistry {
    
    @Bean
    public List<McpServerFeatures.AutoServerRegistration> mcpServers(
        OrderTools orderTools,
        CrmTools crmTools,
        ErpTools erpTools
    ) {
        return List.of(
            McpServerFeatures.AutoServerRegistration.builder()
                .toolCallbacks(orderTools).build(),
            McpServerFeatures.AutoServerRegistration.builder()
                .toolCallbacks(crmTools).build(),
            McpServerFeatures.AutoServerRegistration.builder()
                .toolCallbacks(erpTools).build()
        );
    }
}

五、第三步:客户端调用

5.1 MCP客户端配置

java 复制代码
@Configuration
public class McpClientConfig {
    
    @Bean
    public McpClient mcpClient() {
        return McpClient.builder()
            .serverUri("http://localhost:8081")  // MCP服务器地址
            .build();
    }
}

5.2 自动工具发现

java 复制代码
@Service
public class IntelligentAgent {
    
    @Autowired
    private ChatClient chatClient;
    
    @Autowired
    private McpClient mcpClient;
    
    public String chat(String userId, String question) {
        // 自动发现并加载所有MCP工具
        List<ToolCallback> tools = mcpClient.getToolCallbacks();
        
        return chatClient.prompt()
            .user(question)
            .tools(tools)  // ← 自动注入所有工具
            .call()
            .content();
    }
}

老张的感叹:"一个协议,所有系统自动接入!比手写@Tool优雅多了。"


六、MCP的额外优势

6.1 标准化认证

yaml 复制代码
# MCP客户端配置
spring:
  ai:
    mcp:
      client:
        server-url: http://mcp-server:8080
        auth:
          type: oauth2
          token-url: https://auth.example.com/token
          client-id: ai-client
          scopes:
            - read
            - write

6.2 工具描述标准化

json 复制代码
{
  "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


💬 互动环节

老兵问答:

你的企业有哪些系统需要接入AI? A. CRM系统 B. ERP/财务系统 C. 供应链/WMS D. OA/审批系统 E. 以上都有

下周五晚9点,我们继续!

作者:Java老兵搞AI | 关注我,看Java如何玩转AI

相关推荐
木棉软糖1 小时前
JDBC 读 ResultSet 读到一半,报 stream closed
java·mysql·spring
Thomas.Sir2 小时前
第28课:统一日志收集、ELK搭建 & 线上问题排查体系
elk·spring cloud
需要82613 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
XIAEE17 小时前
转生到儿童编程异世界:我用 Vue 和 Scratch 建了一座 DREAM 学院
java·spring
XIAEE17 小时前
初次使用 Node + Koa + MongoDB 搭建服务器:从零到第一个 API
java·spring
雷一言说18 小时前
Spring AI 2.0:RAG 文档分块大小策略选择
java·spring
XIAEE18 小时前
Java 世界历险记:从一行 System.out.println 到整个 Spring 宇宙
java·spring
XIAEE18 小时前
微前端狂想曲:我试图让三个不同门派的前端住进同一栋楼
java·spring
XIAEE18 小时前
Linux 生存指南:从"终端恐惧症"到"命令行老司机"
java·spring