这是一个全面的演示项目,展示了如何使用Spring AI的Model Context Protocol (MCP) 集成功能。
此演示项目包含两个独立的模块,分别展示了MCP客户端和服务器的实现:
- spring-ai-mcp-client-demo - MCP客户端演示应用程序
- spring-ai-mcp-server-demo - MCP服务器演示应用程序
Model Context Protocol (MCP) 是一个开放标准,用于在AI应用程序和外部数据源及工具之间建立安全、可控的连接。它允许:
- 工具集成:AI模型可以调用外部工具和函数
- 资源访问:AI模型可以访问文件、数据库和其他资源
- 上下文共享:在AI应用程序之间共享上下文信息
- 安全控制:细粒度的权限控制和访问管理
spring-ai-mcp-demo/
├── pom.xml # 主模块POM文件
├── README.md # 本文档
├── spring-ai-mcp-client-demo/ # MCP客户端演示
│ ├── src/main/java/ # Java源代码
│ │ └── org/springframework/ai/mcp/client/demo/
│ │ ├── McpClientDemoApplication.java # 主应用类
│ │ ├── config/
│ │ │ └── McpClientConfiguration.java # 客户端配置
│ │ └── controller/
│ │ └── McpToolController.java # REST控制器
│ ├── src/main/resources/
│ │ └── application.yml # 配置文件
│ ├── pom.xml # 客户端POM文件
│ └── README.md # 客户端文档
└── spring-ai-mcp-server-demo/ # MCP服务器演示
├── src/main/java/ # Java源代码
│ └── org/springframework/ai/mcp/server/demo/
│ ├── McpServerDemoApplication.java # 主应用类
│ ├── config/
│ │ └── McpServerConfiguration.java # 服务器配置
│ ├── tools/
│ │ ├── MathToolsConfiguration.java # 数学工具
│ │ └── TextToolsConfiguration.java # 文本工具
│ └── resources/
│ └── SystemResourcesConfiguration.java # 系统资源
├── src/main/resources/
│ └── application.yml # 配置文件
├── pom.xml # 服务器POM文件
└── README.md # 服务器文档
- Java 17 或更高版本
- Maven 3.6 或更高版本
- Git
git clone https://github.com/spring-projects/spring-ai.git
cd spring-ai/mcp/spring-ai-mcp-demo
mvn clean compile
cd spring-ai-mcp-server-demo
mvn spring-boot:run
服务器将在 http://localhost:8081 启动
首先配置客户端连接到服务器。编辑 spring-ai-mcp-client-demo/src/main/resources/application.yml
:
spring:
ai:
mcp:
client:
sse:
servers:
demo-server:
url: "http://localhost:8081/mcp/sse"
然后启动客户端:
cd spring-ai-mcp-client-demo
mvn spring-boot:run
客户端将在 http://localhost:8080 启动
curl http://localhost:8080/api/mcp/tools
curl -X POST http://localhost:8080/api/mcp/tools/add/call \
-H "Content-Type: application/json" \
-d '{"a": 10, "b": 20}'
curl -X POST http://localhost:8080/api/mcp/tools/uppercase/call \
-H "Content-Type: application/json" \
-d '{"text": "hello world"}'
add
- 两数相加multiply
- 两数相乘power
- 幂运算
uppercase
- 转换为大写analyze_text
- 文本分析reverse
- 字符串反转
system://info
- 系统信息time://current
- 当前时间app://status
- 应用状态
GET /api/mcp/tools
- 获取可用工具列表GET /api/mcp/clients
- 获取客户端连接信息POST /api/mcp/tools/{toolName}/call
- 调用指定工具
-
STDIO传输
- 用于进程间通信
- 适合本地工具集成
-
SSE HTTP传输
- 基于HTTP的服务器发送事件
- 适合网络通信
-
WebFlux传输
- 响应式HTTP流
- 适合高并发场景
spring:
ai:
mcp:
client:
# STDIO传输
stdio:
servers:
local-server:
command: ["java", "-jar", "mcp-server.jar"]
# HTTP SSE传输
sse:
servers:
remote-server:
url: "http://localhost:8081/mcp/sse"
# WebFlux传输
webflux:
servers:
reactive-server:
url: "http://localhost:8082/mcp/webflux/sse"
spring:
ai:
mcp:
server:
capabilities:
tool: true
resource: true
prompt: true
# 传输配置
stdio:
enabled: true
webmvc:
enabled: true
endpoint: "/mcp/sse"
webflux:
enabled: true
endpoint: "/mcp/webflux/sse"
┌─────────────────┐ MCP Protocol ┌─────────────────┐
│ MCP Client │◄──────────────────►│ MCP Server │
│ │ │ │
│ - Tool Discovery│ │ - Tool Registry │
│ - Tool Execution│ │ - Resource Mgmt │
│ - Resource Access│ │ - Prompt System │
└─────────────────┘ └─────────────────┘
┌─────────────────┐
│ Spring AI App │
│ │
│ ┌─────────────┐ │
│ │ Chat Client │ │
│ └─────────────┘ │
│ │ │
│ ┌─────────────┐ │ ┌─────────────────┐
│ │ Tool System │◄┼────┤ MCP Tool Bridge │
│ └─────────────┘ │ └─────────────────┘
└─────────────────┘ │
│ MCP Protocol
┌─────────────────┐
│ MCP Server │
│ │
│ - Math Tools │
│ - Text Tools │
│ - System Info │
└─────────────────┘
在服务器端添加新工具:
@Bean
public SyncToolSpecification customTool() {
return SyncToolSpecification.builder()
.tool(McpSchema.Tool.builder()
.name("custom_tool")
.description("自定义工具")
.inputSchema(/* 定义输入模式 */)
.build())
.handler((exchange, arguments) -> {
// 实现工具逻辑
return McpSchema.CallToolResult.builder()
.content(/* 返回结果 */)
.build();
})
.build();
}
@Bean
public SyncResourceSpecification customResource() {
return SyncResourceSpecification.builder()
.resource(McpSchema.Resource.builder()
.uri("custom://resource")
.name("自定义资源")
.description("自定义资源描述")
.build())
.handler((exchange, uri) -> {
// 实现资源逻辑
return McpSchema.ReadResourceResult.builder()
.contents(/* 返回内容 */)
.build();
})
.build();
}
-
连接失败
- 检查服务器是否启动
- 验证端口和URL配置
- 查看防火墙设置
-
工具调用失败
- 检查工具名称拼写
- 验证参数格式
- 查看服务器日志
-
依赖问题
- 确保使用正确的Spring AI版本
- 检查Maven依赖冲突
启用调试日志:
logging:
level:
org.springframework.ai.mcp: DEBUG
io.modelcontextprotocol: DEBUG
本项目基于Apache License 2.0许可证开源。详情请参见LICENSE文件。