MCP 模型上下文协议:AI 应用互操作的 Type-C 时代

  • ~13.85K 字
  1. 1. 📖 3分钟速览版
    1. 1.1. 🔌 MCP 是什么?
    2. 1.2. 💎 为什么需要 MCP?
    3. 1.3. 🎯 适用场景
  2. 2. 🧠 深度剖析版
  3. 3. 1. MCP 协议深度解析
    1. 3.1. 🎯 1.1 核心概念
      1. 3.1.1. 设计哲学
      2. 3.1.2. 类比理解
    2. 3.2. 🏗️ 1.2 架构设计
      1. 3.2.1. 三层架构
      2. 3.2.2. 核心组件
    3. 3.3. 🔄 1.3 工作流程
      1. 3.3.1. 关键步骤说明
  4. 4. 2. MCP vs 其他方案
    1. 4.1. 📊 2.1 方案对比
    2. 4.2. 🎯 2.2 选择建议
  5. 5. 3. Spring AI MCP 实战
    1. 5.1. 🎯 3.1 为什么选择 Spring AI?
    2. 5.2. 🛠️ 3.2 快速开始
      1. 5.2.1. Step 1: 项目初始化
      2. 5.2.2. Step 2: 添加依赖
      3. 5.2.3. Step 3: 实现工具服务
      4. 5.2.4. Step 4: 配置 MCP Server
      5. 5.2.5. Step 5: application.yml 配置
      6. 5.2.6. Step 6: 打包与运行
    3. 5.3. 🎮 3.3 客户端连接测试
      1. 5.3.1. 使用 Cherry Studio
      2. 5.3.2. 使用 Claude Desktop
    4. 5.4. 🚀 3.4 进阶:SSE 模式部署
      1. 5.4.1. 修改配置
      2. 5.4.2. 健康检查端点
      3. 5.4.3. 客户端连接配置
  6. 6. 4. 生产环境最佳实践
    1. 6.1. 🔒 4.1 安全配置
    2. 6.2. 📊 4.2 监控与可观测性
    3. 6.3. ⚡ 4.3 性能优化
  7. 7. 5. 故障排查指南
    1. 7.1. 🔧 5.1 常见问题
      1. 7.1.1. 问题1:工具未被发现
      2. 7.1.2. 问题2:Stdio 模式无响应
      3. 7.1.3. 问题3:SSE 模式连接断开
  8. 8. 6. 实战案例
    1. 8.1. 🏢 案例:企业级知识库 MCP Server
      1. 8.1.1. 需求背景
      2. 8.1.2. 实现方案
      3. 8.1.3. 部署架构
      4. 8.1.4. 效果对比
  9. 9. 7. 工具与资源
    1. 9.1. ✅ MCP 检查清单
      1. 9.1.1. 需求确认
      2. 9.1.2. 技术选型
      3. 9.1.3. 开发准备
      4. 9.1.4. 测试验证
      5. 9.1.5. 部署上线
    2. 9.2. 📚 推荐资源
  10. 10. 💬 常见问题(FAQ)
    1. 10.1. Q1: MCP 和 LangChain Tools 有什么本质区别?
    2. 10.2. Q2: MCP 的性能开销大吗?
    3. 10.3. Q3: 如何调试 MCP 工具?
    4. 10.4. Q4: MCP 支持流式响应吗?
    5. 10.5. Q5: 企业内网可以部署 MCP 吗?
  11. 11. ✨ 总结
    1. 11.1. 🎯 MCP 的价值
    2. 11.2. 🚀 下一步行动

🎯 一句话定位:让 AI 应用像 USB 设备一样即插即用的通用协议标准

💡 核心价值:解决 AI 工具生态的”巴别塔”问题——每个 AI 应用都说不同的语言,MCP 让它们统一说”普通话”。


📖 3分钟速览版

📊 点击展开 MCP 核心概念

🔌 MCP 是什么?

graph LR
    A[AI应用] -->|MCP协议| B(工具生态)
    B --> C[数据库]
    B --> D[API服务]
    B --> E[文件系统]
    B --> F[自定义工具]

    style A fill:#e3f2fd
    style B fill:#fff3e0
    style C fill:#c8e6c9
    style D fill:#c8e6c9
    style E fill:#c8e6c9
    style F fill:#c8e6c9

通俗类比

  • 🔌 MCP = USB Type-C(统一接口标准)
  • 🛠️ AI Tools = 外设(鼠标、键盘、硬盘)
  • 🤖 LLM Apps = 电脑(即插即用)

💎 为什么需要 MCP?

问题 没有 MCP 有 MCP
🔌 接口混乱 每个工具自定义接口 统一标准接口
🔄 重复开发 每个应用重复实现工具 一次开发,到处使用
🛡️ 安全风险 各自实现安全机制 统一安全标准
📈 生态割裂 工具无法跨应用使用 工具市场共享

🎯 适用场景

1
2
3
4
5
6
7
8
9
10
✅ 推荐:
├─ 需要集成多个外部工具的 AI 应用
├─ 需要让工具在多个 AI 应用间复用
├─ 需要统一的安全和管理机制
└─ 企业级 AI 应用部署

❌ 不推荐:
├─ 单一简单工具(直接 function call 更快)
├─ 一次性脚本(MCP 有学习成本)
└─ 极低延迟要求(MCP 有通信开销)

🧠 深度剖析版

1. MCP 协议深度解析

🎯 1.1 核心概念

MCP(Model Context Protocol) 是 Anthropic 于 2024 年 11 月开源的 AI 应用互操作协议。

设计哲学

graph TD
    A[AI应用碎片化] --> B[每个应用重复造轮子]
    A --> C[工具无法跨应用复用]
    A --> D[安全标准不统一]

    E[MCP统一协议] --> F[工具一次开发]
    E --> G[跨应用复用]
    E --> H[统一安全标准]

    F --> I[✅ 生态繁荣]
    G --> I
    H --> I

    style A fill:#ffcdd2
    style E fill:#c8e6c9
    style I fill:#a5d6a7

类比理解

层次 传统方式 MCP 方式 好处
接口 各自为政 统一标准 🔌 即插即用
实现 重复开发 一次编写 ⚡️ 提升效率
生态 孤岛效应 共享市场 📈 规模效应
类比 充电线乱象 USB Type-C 🎯 用户体验

🏗️ 1.2 架构设计

三层架构

graph TD
    subgraph Host[🤖 Host Layer - AI应用]
        H1[Claude]
        H2[Cursor]
        H3[自定义应用]
    end

    subgraph Transport[📡 Transport Layer - 传输层]
        T1[STDIO
进程通信] T2[SSE
HTTP流] end subgraph Server[🛠️ Server Layer - 工具服务器] S1[文件系统] S2[数据库] S3[API服务] S4[自定义工具] end H1 --> T1 H2 --> T2 H3 --> T1 T1 --> S1 T1 --> S2 T2 --> S3 T2 --> S4 style Host fill:#e3f2fd style Transport fill:#fff3e0 style Server fill:#e8f5e9

核心组件

组件 职责 类比
Host(宿主) AI 应用,消费工具 电脑
Client(客户端) 从 Server 获取工具 驱动程序
Server(服务器) 提供工具和资源 USB 设备
Transport(传输) 通信管道 USB 线缆

🔄 1.3 工作流程

sequenceDiagram
    participant H as Host (AI应用)
    participant C as MCP Client
    participant T as Transport
    participant S as MCP Server

    H->>C: 1. 发起连接
    C->>T: 2. 建立传输通道
    T->>S: 3. 协议握手
    S-->>T: 4. 返回能力清单
    T-->>C: 5. 工具列表
    C-->>H: 6. 可用工具

    H->>C: 7. 调用工具
    C->>T: 8. JSON-RPC请求
    T->>S: 9. 执行工具
    S-->>T: 10. 返回结果
    T-->>C: 11. 响应数据
    C-->>H: 12. 工具输出

关键步骤说明

  1. 初始化(Initialize):协商协议版本、能力
  2. 发现(Discover):Server 暴露可用工具/资源列表
  3. 调用(Invoke):Client 通过 JSON-RPC 调用工具
  4. 响应(Response):Server 返回结果或错误

2. MCP vs 其他方案

📊 2.1 方案对比

维度 MCP LangChain Tools OpenAI Function Call 自定义 API
标准化 ✅ 开放标准 ⚠️ 框架特定 ⚠️ 厂商特定 ❌ 各自为政
跨平台 ✅ 全平台 ⚠️ Python/JS ❌ 仅 OpenAI ❌ 自定义
工具复用 ✅ 跨应用 ❌ 框架内 ❌ 单模型 ❌ 单应用
学习曲线 ⚠️ 中等 ✅ 低 ✅ 低 ❌ 高
生态成熟度 🟡 早期 🟢 成熟 🟢 成熟 🔵 取决于你

🎯 2.2 选择建议

1
2
3
4
5
6
7
8
9
📋 决策树:

需要跨应用复用工具?
├─ 是 → 🎯 使用 MCP

└─ 否 → 只用单一框架?
├─ LangChain → 用 LangChain Tools
├─ OpenAI → 用 Function Call
└─ 都不是 → 考虑自研(学习成本高)

3. Spring AI MCP 实战

🎯 3.1 为什么选择 Spring AI?

1
2
3
4
5
6
7
8
✅ Spring AI 优势:
├─ 🇨🇳 国内开发者友好(中文文档完善)
├─ 🏢 企业级特性(配置管理、安全、监控)
├─ 🔌 Spring 生态集成(Boot、Security)
└─ 📊 生产就绪(可观测性、健康检查)

⚠️ 注意:
└─ MCP 支持处于 Milestone 阶段(1.0.0-M6)

🛠️ 3.2 快速开始

Step 1: 项目初始化

1
2
3
4
5
6
7
8
9
10
11
12
# 使用 Spring Initializr 创建项目
curl https://start.spring.io/starter.zip \
-d dependencies=web \
-d type=maven-project \
-d language=java \
-d bootVersion=3.3.0 \
-d groupId=com.example \
-d artifactId=mcp-demo \
-o mcp-demo.zip

unzip mcp-demo.zip
cd mcp-demo

Step 2: 添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- pom.xml -->
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring AI MCP Server -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
</dependencies>

<!-- 添加 Spring Milestone 仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

Step 3: 实现工具服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.mcp.service;

import org.springframework.ai.mcp.server.tool.Tool;
import org.springframework.stereotype.Service;

/**
* MCP 工具服务示例
*
* @author MamimiJa Nai
*/
@Service
public class WeatherService {

/**
* 获取指定城市的天气信息
*
* @param city 城市名称
* @return 天气描述
*/
@Tool(
name = "get_weather",
description = "获取指定城市的当前天气信息,包括温度、天气状况和湿度"
)
public String getWeather(String city) {
// 实际项目中应该调用真实天气 API
return String.format(
"🌍 %s 的天气:晴天,温度 22°C,湿度 45%%",
city
);
}

/**
* 获取城市列表
*
* @return 支持的城市列表
*/
@Tool(
name = "list_cities",
description = "获取所有支持天气查询的城市列表"
)
public String listCities() {
return """
📍 支持的城市:
- 北京
- 上海
- 广州
- 深圳
- 杭州
""";
}
}

Step 4: 配置 MCP Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.mcp.config;

import com.example.mcp.service.WeatherService;
import org.springframework.ai.mcp.server.ToolCallbackProvider;
import org.springframework.ai.mcp.server.config.McpServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* MCP 服务器配置
*
* @author MamimiJa Nai
*/
@Configuration
public class McpServerConfig {

/**
* 注册工具回调提供者
*/
@Bean
public ToolCallbackProvider toolCallbackProvider(
WeatherService weatherService,
McpServerProperties properties) {

return ToolCallbackProvider.builder()
.toolObjects(weatherService) // 注册工具服务
.serverProperties(properties) // MCP 服务器属性
.build();
}
}

Step 5: application.yml 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
spring:
application:
name: weather-mcp-server

ai:
mcp:
server:
# 是否启用 MCP 服务器
enabled: true

# 服务器名称
name: ${spring.application.name}

# 服务器版本
version: 1.0.0

# 执行模式:SYNC(同步)或 ASYNC(异步)
type: SYNC

# 传输模式:stdio(标准输入输出)或 sse(HTTP流)
mode: stdio

# 日志级别
log-level: info

# 日志配置(调试时建议开启 DEBUG)
logging:
level:
org.springframework.ai.mcp: DEBUG

Step 6: 打包与运行

1
2
3
4
5
6
7
# 打包
mvn clean package -DskipTests

# 运行(stdio 模式)
java -jar target/mcp-demo-0.0.1-SNAPSHOT.jar

# 或者在 IDE 中直接运行主类

🎮 3.3 客户端连接测试

使用 Cherry Studio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1️⃣ 安装 Cherry Studio
下载:https://github.com/CherryHQ/cherry-studio/releases

2️⃣ 配置 MCP 服务器
设置 → MCP 服务器 → 添加本地服务器

3️⃣ 配置参数
├─ 名称:weather-mcp-server
├─ 命令:java -jar /path/to/mcp-demo.jar
└─ 类型:stdio

4️⃣ 测试工具
新建对话 → 选择带扳手图标的模型 → 输入:
"帮我查一下北京的天气"

5️⃣ 查看结果
模型应该会调用 get_weather 工具并返回结果

使用 Claude Desktop

创建配置文件 ~/Library/Application Support/Claude/claude_desktop_config.json

1
2
3
4
5
6
7
8
9
10
11
{
"mcpServers": {
"weather-server": {
"command": "java",
"args": [
"-jar",
"/path/to/mcp-demo-0.0.1-SNAPSHOT.jar"
]
}
}
}

🚀 3.4 进阶:SSE 模式部署

修改配置

1
2
3
4
5
6
spring:
ai:
mcp:
server:
mode: sse # 改为 SSE 模式
port: 8081 # SSE 服务端口

健康检查端点

1
2
3
4
5
6
7
# 检查 MCP 服务器状态
curl http://localhost:8081/actuator/health

# 预期响应
{
"status": "UP"
}

客户端连接配置

1
2
3
4
5
6
7
{
"mcpServers": {
"weather-server": {
"url": "http://localhost:8081/mcp/sse"
}
}
}

4. 生产环境最佳实践

🔒 4.1 安全配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class McpSecurityConfig {

/**
* 配置工具访问权限
*/
@Bean
public ToolCallbackProvider secureToolProvider(
WeatherService weatherService) {

return ToolCallbackProvider.builder()
.toolObjects(weatherService)
// 添加访问控制
.accessControl((tool, principal) -> {
// 只允许特定角色访问
return principal.hasRole("AI_USER");
})
.build();
}
}

📊 4.2 监控与可观测性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# application.yml
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
metrics:
export:
prometheus:
enabled: true

# 自定义指标
spring:
ai:
mcp:
server:
metrics:
enabled: true

监控指标

  • mcp.tool.invocation.count - 工具调用次数
  • mcp.tool.execution.time - 工具执行时间
  • mcp.error.count - 错误次数

⚡ 4.3 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Service
public class OptimizedWeatherService {

@Tool(name = "get_weather_fast")
@Cacheable(value = "weather", key = "#city") // 添加缓存
public String getWeather(String city) {
// 实现逻辑
}

@Tool(name = "get_weather_batch")
public Map<String, String> getWeatherBatch(List<String> cities) {
// 批量处理,减少调用次数
return cities.stream()
.collect(Collectors.toMap(
city -> city,
this::getWeather
));
}
}

5. 故障排查指南

🔧 5.1 常见问题

问题1:工具未被发现

1
2
3
4
5
6
7
8
9
10
11
12
13
❌ 症状:客户端无法看到工具列表

🔍 可能原因:
├─ @Tool 注解未添加
├─ ToolCallbackProvider 未正确配置
├─ Service 未被 Spring 扫描到
└─ 依赖版本冲突

✅ 解决方案:
1. 检查 @Tool 注解的 name 和 description
2. 确认 @Bean 配置正确
3. 添加 @ComponentScan 扫描包
4. 统一 Spring AI 版本

问题2:Stdio 模式无响应

1
2
3
4
5
6
7
8
9
10
11
❌ 症状:启动后客户端连接超时

🔍 可能原因:
├─ Java 进程未启动
├─ 日志输出到 stderr 而非 stdout
└─ 缓冲区未刷新

✅ 解决方案:
1. 使用 `java -jar` 而非 IDE 运行
2. 检查日志级别是否为 DEBUG
3. 添加 System.out.flush()

问题3:SSE 模式连接断开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❌ 症状:连接频繁断开重连

🔍 可能原因:
├─ 超时时间过短
├─ Nginx 代理配置问题
└─ 网络不稳定

✅ 解决方案:
spring:
ai:
mcp:
server:
sse:
heartbeat: 30s # 心跳间隔
timeout: 60s # 超时时间

6. 实战案例

🏢 案例:企业级知识库 MCP Server

需求背景

1
2
3
4
5
6
7
8
9
📋 场景:
├─ 企业有多个 AI 应用(客服、培训、文档)
├─ 需要统一的文档查询工具
└─ 要求:安全、可控、可审计

🎯 目标:
├─ 一次开发,多应用复用
├─ 统一权限管理
└─ 完整的审计日志

实现方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Service
public class KnowledgeBaseService {

@Tool(
name = "search_docs",
description = "在企业知识库中搜索相关文档"
)
@PreAuthorize("hasRole('EMPLOYEE')") # 权限控制
@AuditLog # 审计日志
public List<Document> searchDocuments(
@ToolParam(description = "搜索关键词") String query,
@ToolParam(description = "最大结果数", defaultValue = "5") int limit
) {
// 1. 参数验证
validateQuery(query);

// 2. 调用搜索服务
List<Document> results = searchService.search(query, limit);

// 3. 过滤敏感信息
return filterSensitiveInfo(results);
}

@Tool(name = "get_doc_summary")
public String getDocumentSummary(
@ToolParam(description = "文档ID") String docId
) {
// 实现逻辑
}
}

部署架构

graph TD
    A[客服AI应用] -->|MCP| B[KB MCP Server]
    C[培训AI应用] -->|MCP| B
    D[文档AI应用] -->|MCP| B

    B --> E[(知识库ES)]
    B --> F[权限服务]
    B --> G[审计日志]

    style B fill:#fff3e0
    style E fill:#e3f2fd
    style F fill:#f3e5f5
    style G fill:#ffebee

效果对比

指标 改进前 改进后 提升
开发时间 3周/应用 1周(一次) ⬇️ 67%
维护成本 ⬇️ 80%
工具复用 0% 100%
安全审计 分散 统一

7. 工具与资源

✅ MCP 检查清单

📋 开发前检查清单

需求确认

  • 确认需要跨应用复用工具
  • 确认工具可以标准化描述
  • 评估 MCP 学习成本可接受

技术选型

  • 选择传输模式(stdio / SSE)
  • 选择 AI 框架(Spring AI / LangChain)
  • 确认客户端支持(Claude / 自研)

开发准备

  • 搭建 Spring Boot 项目
  • 添加 Spring AI MCP 依赖
  • 配置 IDE 运行环境

测试验证

  • 编写工具单元测试
  • 使用客户端连接测试
  • 验证工具调用流程

部署上线

  • 配置生产环境参数
  • 设置监控告警
  • 准备回滚方案

📚 推荐资源

类型 名称 链接
📖 官方文档 MCP 官方规范 https://modelcontextprotocol.io
📖 官方文档 Spring AI 文档 https://docs.spring.io/spring-ai
🛠️ 工具 Cherry Studio https://github.com/CherryHQ/cherry-studio
🛠️ 工具 Claude Desktop https://claude.ai/download
💬 社区 MCP Discord https://discord.gg/mcp
📺 视频 MCP 入门教程 YouTube 搜索 “MCP tutorial”

💬 常见问题(FAQ)

Q1: MCP 和 LangChain Tools 有什么本质区别?

A: 核心区别在于跨框架复用

1
2
3
4
5
6
7
8
9
10
LangChain Tools:
└─ 只能在 LangChain 生态内使用
└─ 切换到其他框架需要重写

MCP:
└─ 协议级别标准化
└─ 一次开发,所有框架可用
├─ Claude Desktop
├─ 自研应用
└─ 未来任何支持 MCP 的应用

Q2: MCP 的性能开销大吗?

A: 有一定开销,但通常可接受:

1
2
3
4
5
6
7
8
9
10
11
📊 性能对比:

直接调用: ~1ms
LangChain Tools: ~5ms
MCP (stdio): ~10-20ms
MCP (SSE): ~20-50ms

💡 建议:
├─ 高频工具:考虑缓存或批量处理
├─ 低频工具:MCP 开销可忽略
└─ 极低延迟要求:避免使用 MCP

Q3: 如何调试 MCP 工具?

A: 三步调试法:

1
2
3
4
5
6
7
8
9
10
11
12
1️⃣ 启用 DEBUG 日志
logging.level.org.springframework.ai.mcp: DEBUG

2️⃣ 使用 MCP Inspector
npx @modelcontextprotocol/inspector

3️⃣ 添加自定义日志
@Tool(name = "test")
public String test() {
log.info("Tool called!");
return "ok";
}

Q4: MCP 支持流式响应吗?

A: 目前有限支持:

1
2
3
4
5
6
7
8
9
✅ 支持:
├─ 资源流式读取
└─ 通知流式发送

⚠️ 限制:
└─ 工具调用本身是请求-响应模式

💡 替代方案:
└─ 工具返回流ID,客户端再通过资源接口读取

Q5: 企业内网可以部署 MCP 吗?

A: 完全可以,而且推荐:

1
2
3
4
5
6
7
8
9
✅ 内网部署优势:
├─ 数据不出内网
├─ 延迟更低
└─ 可控性更强

📋 部署方案:
├─ HTTP 内网代理
├─ VPN + stdio
└─ 私有 MCP Hub

✨ 总结

🎯 MCP 的价值

1
2
3
4
5
6
7
8
9
10
🌟 核心价值:
├─ 📈 生态繁荣:工具共享市场
├─ ⚡️ 提升效率:避免重复造轮子
├─ 🔒 安全标准:统一的安全机制
└─ 🌍 跨平台:语言和框架无关

⚠️ 注意:
├─ 有学习成本
├─ 有性能开销
└─ 生态还在早期

🚀 下一步行动

1
2
3
4
5
6
7
8
9
10
11
📝 学习路径:
1. ⏱️ 30分钟:阅读官方文档
2. 🛠️ 2小时:完成 Hello World
3. 🏢 1天:实现真实工具
4. 🚀 1周:部署生产环境

💻 推荐实践:
├─ 从简单工具开始(天气、搜索)
├─ 先用 stdio 模式(更简单)
├─ 充分测试后再上生产
└─ 关注官方社区更新

💻 用 MCP 连接 AI 世界,🔌 让工具像 USB 一样即插即用

📅 最后更新:2025-04-24 | 👤 作者:MamimiJa Nai | 🏷️ 技术栈:Spring AI 1.0.0-M6

打赏
打赏提示信息