Spring AI MCP服务器
模型上下文协议(MCP)服务器实现 春季AI 以及Spring Boot。该服务器通过MCP协议为人工智能助手提供对工具和资源的标准化访问,只需最少的自定义开发。
概述
模型上下文协议(MCP)是一种开放协议,使AI助手能够安全地访问外部数据源和工具。此实施利用 Spring AI的MCP启动程序 创建一个具有自动工具注册、SSE传输支持和零样板代码的生产就绪MCP服务器。
特性
- Spring AI MCP集成:基于
spring-ai-mcp-server-webflux-spring-boot-starter - 注释驱动工具:使用
@McpTool自动刀具注册注释 - 无状态协议:用于可靠工具执行的简单请求/响应协议
- WebFlux传输:响应式Spring WebFlux,用于高效处理请求
- 零沸点板:无需手动JSON-RPC处理或回调注册
- 内置工具:计算器(加、减、乘、除)、回声、时间和随机数
- 内置资源:系统信息、配置、文档和API参考
- 内置提示:代码审查、数据分析、调试和文档模板
- 弹簧靴执行器:生产就绪的健康检查和监测端点
- 自动配置:Spring AI自动处理所有MCP协议细节
建筑
┌─────────────────────────────────────────┐
│ Spring Boot Application │
│ ┌────────────────────────────────────┐ │
│ │ @McpTool Annotated Methods │ │
│ │ (McpToolsService) │ │
│ ├────────────────────────────────────┤ │
│ │ @McpResource Annotated Methods │ │
│ │ (McpResourcesService) │ │
│ ├────────────────────────────────────┤ │
│ │ @McpPrompt Annotated Methods │ │
│ │ (McpPromptsService) │ │
│ └────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ Spring AI MCP Server │ │
│ │ (Auto-configured) │ │
│ └────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ WebFlux SSE Endpoint (/mcp) │ │
│ └────────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓ HTTP SSE
┌──────────────────┐
│ MCP Client │
│ (Claude, etc) │
└──────────────────┘先决条件
- Java 17或更高版本
- Maven 3.6+
快速开始
1.建设项目
mvn clean install2.运行服务器
mvn spring-boot:run服务器将于启动 http://localhost:8080 与:
- MCP SSE端点位于
/mcp - 执行器健康端点位于
/actuator/health
3.测试服务器
检查服务器运行状况:
curl http://localhost:8080/actuator/health答复:
{
"status": "UP"
}可用工具
服务器会自动公开所有带注释的方法 @McpTool:
1.添加
将两个数字相加。
参数:
a:第一个数字(必填)b:第二个数字(必填)
2.减去
从第一个数字中减去第二个数字。
参数:
a:第一个数字(必填)b:第二个数字(必填)
3.相乘
将两个数字相乘。
参数:
a:第一个数字(必填)b:第二个数字(必填)
4.分割
将第一个数字除以第二个数字。
参数:
a:数字(必填)b:分母,不能为零(必填)
5.回声
回应提供的信息。
参数:
message:要回显的消息(必填)
6.获取当前时间
返回当前日期和时间。
参数:
timezone:时区(可选,默认为系统时区)
7.随机数
生成一个介于最小值和最大值之间的随机数。
参数:
min:最小值(必填)max:最大值(必填)
可用资源
服务器会自动公开所有带注释的方法 @McpResource:
1.欢迎留言
URI: resource://welcome
欢迎新用户介绍Spring MCP Server。
2.系统信息
URI: resource://system/info
动态资源提供当前系统信息,包括时间戳、Java版本、操作系统详细信息和内存使用情况。返回JSON格式。
3.服务器配置
URI: resource://config/server
当前服务器配置和功能,包括协议类型、启用的功能和端点。返回JSON格式。
4.文件
URI: resource://docs/{topic}
为各种主题提供文档的参数化资源。可用主题:
tools-关于MCP工具的文档resources-关于MCP资源的文档prompts-关于MCP提示的文档getting-started-入门指南
返回Markdown格式。
5.API参考
URI: resource://api/reference
以纯文本格式列出所有可用工具、资源和提示的快速参考指南。
可用提示
服务器会自动公开所有带注释的方法 @McpPrompt:
1.问候
姓名: greeting
生成个性化的问候语。
参数:
name:要问候的人的姓名(必填)timeOfDay:一天中的时间-上午、下午、晚上(可选)
2.代码审查
姓名: code-review
生成一个全面的代码审查提示,用于分析代码。
参数:
language:编程语言(必填)focusArea:需要关注的具体方面,如安全性、性能、可读性(可选)
3.数据分析
姓名: analyze-data
生成分析数据或数据集的提示。
参数:
dataType:正在分析的数据类型(必填)goal:分析目标或问题(必填)context:有关数据的其他上下文(可选)
4.会议纪要
姓名: meeting-summary
生成创建结构化会议摘要的提示。
参数:
topic:会议主题或标题(必填)participants:参与者列表,逗号分隔(可选)
5.调试助手
姓名: debug-helper
为故障排除问题生成系统调试提示。
参数:
issue:错误消息或问题描述(必填)stack:技术栈或环境(必填)attemptedSolutions:已经尝试过的内容(可选)
6.文档生成器
姓名: generate-docs
生成创建技术文档的提示。
参数:
component:要记录的组件或功能(必填)audience:目标受众-开发人员、用户、管理员(必填)format:文档格式-markdown、html、javadoc(可选)
7.SQL助手
姓名: sql-helper
根据需求生成构建SQL查询的提示。
参数:
requirement:要检索或修改的数据的描述(必填)dbType:数据库类型,如MySQL、PostgreSQL(可选)performance:性能考虑因素,如索引、优化(可选)
项目结构
src/
├── main/
│ ├── java/com/example/mcpserver/
│ │ ├── McpServerApplication.java # Main application
│ │ └── service/
│ │ ├── McpToolsService.java # Tools with @McpTool annotations
│ │ ├── McpResourcesService.java # Resources with @McpResource annotations
│ │ └── McpPromptsService.java # Prompts with @McpPrompt annotations
│ └── resources/
│ └── application.properties # Configuration
└── test/
└── java/com/example/mcpserver/ # Tests添加新工具
使用Spring AI添加新工具非常简单 @McpTool 注释。无需手动注册回调或处理JSON-RPC!
步骤1:创建一个方法并对其进行注释
@Service
public class MyToolsService {
@McpTool(
name = "weather",
description = "Get current weather for a city"
)
public String getWeather(
@McpToolParam(description = "City name", required = true)
String city,
@McpToolParam(description = "Temperature unit (C or F)", required = false)
String unit
) {
// Your implementation
return "Weather in " + city + ": 72°" + (unit != null ? unit : "F");
}
}第二步:就是这样!
Spring AI自动:
- 发现您的
@McpTool带注释的方法 - 在MCP服务器上注册它们
- 从生成JSON模式
@McpToolParam注释 - 处理所有协议通信
注释详细信息
@McpTool
name:工具名称(显示给AI客户端)description:这个工具做什么
@McpToolParam
description:参数说明required:参数是否为必填项(true/false)
添加新资源
资源是客户端可以访问的只读数据或内容。使用Spring AI添加资源很简单 @McpResource 注释。
步骤1:创建一个方法并对其进行注释
@Service
public class MyResourcesService {
@McpResource(
uri = "resource://company/info",
name = "Company Information",
description = "Information about the company",
mimeType = "application/json"
)
public Map getCompanyInfo() {
Map info = new HashMap<>();
info.put("name", "Acme Corp");
info.put("founded", 2020);
info.put("industry", "Technology");
return info;
}
}第二步:就是这样!
Spring AI自动:
- 发现你的
@McpResource带注释的方法 - 在MCP服务器上注册它们
- 使它们可以通过资源URI访问
- 处理所有协议通信
注释详细信息
@Mcp资源
uri:资源URI(例如,“resource://my/resource“或”resource://docs/{id}“)name:资源名称(显示给AI客户端)description:资源提供了什么mimeType:内容类型(例如,“text/plain”、“application/json”、“text/markdown”)
@McpResourceParam (用于参数化URI)
description:参数说明
资源URI模式
静态资源:
@McpResource(uri = "resource://config")
public String getConfig() { ... }参数化资源:
@McpResource(uri = "resource://user/{id}")
public String getUser(@McpResourceParam String id) { ... }添加新提示
提示是可重用的模板,有助于构建与语言模型的交互。使用Spring AI添加提示很简单 @McpPrompt 注释。
步骤1:创建一个方法并对其进行注释
@Service
public class MyPromptsService {
@McpPrompt(
name = "explain-code",
description = "Generate a prompt for explaining code functionality"
)
public String explainCode(
@McpPromptParam(description = "Programming language", required = true)
String language,
@McpPromptParam(description = "Detail level (basic, intermediate, advanced)", required = false)
String level
) {
String detailLevel = level != null ? level : "intermediate";
return String.format(
"Please explain the following %s code at a %s level:\n\n" +
"Include:\n" +
"1. What the code does\n" +
"2. Key concepts used\n" +
"3. How it works step by step\n",
language, detailLevel
);
}
}第二步:就是这样!
Spring AI自动:
- 发现您的
@McpPrompt带注释的方法 - 在MCP服务器上注册它们
- 从生成参数模式
@McpPromptParam注释 - 处理所有协议通信
注释详细信息
@mcpprompt
name:提示名称(AI客户端用于调用提示)description:提示模板的作用是什么
@McpPromptParam
description:参数说明required:参数是否为必填项(true/false)
提示模板最佳实践
- 清晰地组织你的提示:使用章节、要点和编号列表
- 让他们变得灵活:使用参数为不同场景自定义提示
- 提供上下文:在模板中包含相关背景信息
- 要具体:清晰的指示会带来更好的结果
- 使用markdown:格式化提示以提高可读性
配置
编辑 src/main/resources/application.properties:
# Server port
server.port=8080
# Spring AI MCP Server Configuration
spring.ai.mcp.server.name=spring-mcp-server
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.type=ASYNC
spring.ai.mcp.server.protocol=STATELESS
# Actuator endpoints
management.endpoints.web.exposure.include=health,info
management.endpoint.health.show-details=when-authorized
# Logging
logging.level.org.springframework.ai.mcp=DEBUG
logging.level.com.example.mcpserver=DEBUG配置属性
| 属性 | 描述 | 默认值 |
|---|---|---|
spring.ai.mcp.server.name | 服务器名称 | - |
spring.ai.mcp.server.version | 服务器版本 | - |
spring.ai.mcp.server.type | 服务器类型(异步或同步) | SYNC |
spring.ai.mcp.server.protocol | 协议(无状态或流式) | 无状态 |
MCP端点
MCP端点
Spring AI MCP服务器在以下位置自动公开MCP端点:
http://localhost:8080/mcp此端点以无状态模式实现模型上下文协议,允许AI客户端:
- 列出可用工具
- 使用参数调用工具
- 以简单的请求/响应格式接收结果
执行器端点
弹簧靴执行器提供生产就绪监控:
健康端点
curl http://localhost:8080/actuator/health答复:
{
"status": "UP"
}可用的执行器端点
/actuator/health-应用程序健康信息/actuator/info-应用程序信息(如果已配置)
生产大楼
创建一个生产就绪的JAR:
mvn clean package运行JAR:
java -jar target/spring-mcp-server-1.0.0.jarDocker支持
创建一个 Dockerfile:
FROM eclipse-temurin:17-jre
COPY target/spring-mcp-server-1.0.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]构建并运行:
docker build -t spring-mcp-server .
docker run -p 8080:8080 spring-mcp-server与Claude Desktop一起使用
要将此MCP服务器与Claude Desktop一起使用,请添加到您的Claude配置文件中:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
窗户: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"spring-mcp-server": {
"url": "http://localhost:8080/mcp"
}
}
}重新启动Claude Desktop,工具将可用。
发展
运行测试
mvn test代码风格
这个项目使用标准的Java代码约定和Spring Boot最佳实践。
技术
- 弹簧靴3.4.0 -应用框架
- 春季AI 1.0.0-M6 -MCP服务器实现
- Spring WebFlux -SSE的响应式web框架
- 弹簧靴执行器 -生产监控
为什么选择Spring AI MCP?
之前(自定义实施)
- 手动JSON-RPC请求/响应处理
- 自定义控制器和服务层
- 手动工具/资源/提示模式定义
- 手动回叫注册
- 15+源文件
之后(Spring AI)
- 注释驱动(
@McpTool,@McpResource,@McpPrompt) - 自动配置
- 自动发现和注册
- 零样板
- 4个源文件(1个应用程序+3个服务)
结果: 代码减少85%,生产就绪的MCP服务器,在几分钟内提供工具、资源和提示!
许可证
MIT许可证
贡献
欢迎投稿!请随时提交拉取请求。
