上集回顾:老张用@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