使用说明
Spring AI MCP 服务器演示 - 电子商务订单管理
概述
这个项目展示了如何将Spring AI与模型上下文协议(MCP)集成,以创建用于REST API操作的自然语言接口。该演示展示了一个电子商务订单管理系统,开发者可以使用自然语言提示来创建客户、产品和订单,而不是手动构建复杂的API请求。
问题陈述
在企业开发中,测试功能往往需要通过按特定顺序进行多次API调用来设置复杂数据。这个过程是:
- 对开发者来说很耗时
- 在处理复杂请求负载时容易出错
- 需要深入理解API合约和业务逻辑
- 难以维护和记录
解决方案:MCP服务器集成
MCP服务器允许开发者使用自然语言来:
- 创建包含完整地址信息的客户
- 添加产品,并填写价格和库存详情
- 下单购买多种产品
- 查询现有数据
建筑学
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MCP Client │ │ MCP Server │ │ Spring Boot │
│ (Claude/Other) │◄──►│ (This Demo) │◄──►│ REST APIs │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ PostgreSQL │
│ Database │
└─────────────────┘
技术栈
- Spring Boot 3.2.0 - 主应用程序框架
- Spring AI 1.0.0-M4(可译为“Spring AI 1.0.0 版本M4”或根据上下文简化为“Spring AI M4版”) - 人工智能集成与MCP服务器
- PostgreSQL 15 - 数据库
- Gradle(注:这是一个专有名词,通常不翻译,直接保留原样,但在此处为符合中文表达习惯,可简单说明其为“一个构建工具/系统”的概念,不过实际翻译中仍常用“Gradle”本身) - 构建工具
- Docker - 集装化
- OpenAI GPT-3.5-turbo - 语言模型
API终端点
客户管理
POST /api/customers- 创建一个新客户GET /api/customers/{id}- 通过ID获取客户GET /api/customers/email/{email}- 通过电子邮件获取客户信息GET /api/customers- 获取所有客户
产品管理
POST /api/products- 创建一个新产品GET /api/products/{id}- 通过ID获取产品GET /api/products/category/{category}- 按类别获取产品GET /api/products/search?name={name}- 按名称搜索产品GET /api/products/sku/{sku}- 通过SKU获取产品GET /api/products- 获取所有产品
订单管理
POST /api/orders- 创建一个新订单GET /api/orders/{id}- 按ID获取订单GET /api/orders/customer/{customerId}- 按客户获取订单PUT /api/orders/{id}/status?status={status}- 更新订单状态GET /api/orders- 获取所有订单
可用的MCP工具
MCP服务器提供了以下用于自然语言交互的工具:
- 创建客户 - 创建包含地址信息的客户
- 创建产品 - 添加产品并设置价格和库存
- 创建订单 - 下单购买多种产品
- 获取客户 - 获取客户信息
- 获取产品 - 根据各种标准查找产品
- 获取订单 - 获取订单详情和历史记录
快速入门
先决条件
- Java 17 或更高版本
- Docker 和 Docker Compose
- OpenAI API密钥(用于MCP客户端集成)
1. 克隆并设置
git clone <repository-url>
cd spring-ai-mcp-server-demo
2. 环境配置
创建一个 .env 项目根目录下的文件:
OPENAI_API_KEY=your-openai-api-key-here
3. 使用 Docker Compose 运行
# Start the application and database
docker-compose up --build
# The application will be available at http://localhost:8080
# PostgreSQL will be available at localhost:5432
4. 替代方案:本地开发
# Start PostgreSQL (if not using Docker)
docker run --name ecommerce-postgres -e POSTGRES_DB=ecommerce_demo -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres:15
# Run the application
./gradlew bootRun
使用示例
传统API方法
创建一个完整的订单场景需要多次API调用:
# 1. Create customer
curl -X POST http://localhost:8080/api/customers \
-H "Content-Type: application/json" \
-d '{
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com",
"phone": "+1-555-0123",
"address": {
"street": "123 Main St",
"city": "New York",
"state": "NY",
"zipCode": "10001",
"country": "USA"
}
}'
# 2. Create products
curl -X POST http://localhost:8080/api/products \
-H "Content-Type: application/json" \
-d '{
"name": "MacBook Pro",
"description": "Apple MacBook Pro 16-inch",
"price": 2499.99,
"category": "Electronics",
"sku": "MBP-16-001",
"stockQuantity": 10
}'
# 3. Create order
curl -X POST http://localhost:8080/api/orders \
-H "Content-Type: application/json" \
-d '{
"customerId": 1,
"orderItems": [
{
"productId": 1,
"quantity": 1
}
]
}'
MCP自然语言处理方法
通过MCP集成,同样的场景变为:
"Create a customer named John Doe with email john.doe@example.com, phone +1-555-0123, and address at 123 Main St, New York, NY 10001, USA. Then add a MacBook Pro product priced at $2499.99 with SKU MBP-16-001 and 10 units in stock. Finally, create an order for John Doe with 1 MacBook Pro."
MCP 客户端设置
选项1:Claude桌面集成
- 安装Claude桌面应用程序
- 在您的Claude桌面配置中添加以下内容:
{
"mcpServers": {
"ecommerce-demo": {
"command": "java",
"args": ["-jar", "/path/to/ecommerce-mcp-demo.jar"],
"env": {
"OPENAI_API_KEY": "your-api-key"
}
}
}
}
选项2:本地MCP客户端
- 安装MCP客户端工具:
npm install -g @modelcontextprotocol/cli
- 连接到MCP服务器:
mcp connect http://localhost:8080/mcp
测试MCP集成
示例自然语言指令
-
客户创造:
- 创建一个名为爱丽丝·史密斯的客户,邮箱为alice@example.com,地址位于加利福尼亚州旧金山
-
产品管理:
- “添加一款无线鼠标产品,售价29.99美元,库存50件”
- “查找电子产品类别中的所有产品”
-
订单处理:
- “为Alice Smith创建一个订单,包含2个无线鼠标”
- “给我显示所有客户邮箱为alice@example.com的订单”
-
复杂场景:
- “构建一个完整的电子商务场景:在西雅图创建一个名为Bob Johnson的客户,添加一台售价1999美元的游戏笔记本电脑,并下单购买1台”
发展
项目结构
src/
├── main/
│ ├── java/com/example/ecommerce/
│ │ ├── controller/ # REST controllers
│ │ ├── dto/ # Data transfer objects
│ │ ├── entity/ # JPA entities
│ │ ├── mcp/ # MCP server implementation
│ │ ├── repository/ # Data repositories
│ │ ├── service/ # Business logic
│ │ └── config/ # Configuration classes
│ └── resources/
│ └── application.yml # Application configuration
├── test/ # Test files
└── build.gradle # Build configuration
添加新的MCP工具
- 在(某处)创建一个新方法
EcommerceMcpServer.java - 使用……进行注释
@McpTool - 定义参数为
@McpTool.Parameter - 实现业务逻辑
- 返回一个包含成功状态和数据的Map
示例:
@McpTool(
name = "new_tool",
description = "Description of what this tool does"
)
public Map<String, Object> newTool(
@McpTool.Parameter(description = "Parameter description") String param) {
// Implementation
return Map.of("success", true, "data", result);
}
监控与日志记录
该应用程序包括以下方面的全面日志记录:
- MCP工具调用
- API请求/响应周期
- 数据库操作
- 错误处理
日志可在控制台输出中查看,并且可以进行配置 application.yml。
安全考虑事项
- API密钥应安全存储(环境变量)
- 对所有终端点实现了输入验证
- 数据库连接使用连接池
- 可以为Web客户端访问配置CORS(跨源资源共享)
演出
- 数据库操作的连接池
- 实体关系的懒加载
- 使用JPA实现高效查询模式
- 使用Docker容器化以确保一致性能
故障排除
常见问题
-
数据库连接失败:
- 确保 PostgreSQL 正在运行
- 检查连接参数
application.yml - 验证数据库是否存在
-
MCP客户端连接问题:
- 检查应用程序是否正在8080端口上运行
- 验证MCP服务器配置
- 检查OpenAI API密钥的有效性
-
构建失败:
- 确保已安装 Java 17 或更高版本
- 检查 Gradle 包装器的权限
- 验证所有依赖项是否可用
日志和调试
通过添加(相应设置)来启用调试日志记录 application.yml:
logging:
level:
com.example.ecommerce: DEBUG
org.springframework.ai: DEBUG
贡献;做出贡献
- 为仓库创建分支(或:克隆仓库)
- 创建一个特性分支
- 做出你的更改
- 为新功能添加测试
- 提交一个拉取请求
许可证
此项目采用MIT许可证授权——详见LICENSE文件。
支持
如需咨询或获取支持:
- 在仓库中创建一个问题
- 查看故障排除部分
- 查阅Spring AI的文档
未来改进/增强
- [ ] 添加更复杂的业务逻辑场景
- [ ] 实施身份验证和授权
- [ ] 添加全面的测试覆盖率
- [ ] 创建基于Web的MCP客户端界面
- [ ] 添加对批量操作的支持
- [ ] 实现缓存以提高性能
- [ ] 添加指标和监控
- 使用Swagger/OpenAPI创建API文档