你是否希望通过连接你自己的数据和服务,来扩展类似 Deepseek 这样的 AI 模型的能力?Model Context Protocol(MCP)提供了一种标准化方式来实现这一目标,而 Spring AI 则让实现你自己的 MCP 服务器变得很简单。在本教程中,我将带你从零开始,使用 Spring Boot 和 Spring AI 创建你的第一个 MCP 服务器。
什么是 Model Context Protocol(MCP)?
Model Context Protocol(MCP)是一种开放标准,用于定义 AI 模型如何与外部工具和数据源进行通信。它通过一个标准化接口,使得 AI 模型可以与自定义服务进行交互,从而实现以下功能:
- 访问私有或专有数据
- 执行特定的计算任务
- 执行自定义的业务逻辑
- 与外部系统交互
你可以将 MCP 理解为连接 AI 模型与更广泛生态系统之间的一座桥梁,它使得模型能够突破训练数据的限制,与实时信息进行互动。
为什么使用 Spring AI 构建 MCP 服务器?
如果你是一名熟悉 Spring 生态系统的 Java 开发者,使用 Spring AI 构建 MCP 服务器将带来以下下列优势:
- 简化开发:Spring AI 对 MCP 规范中的复杂部分进行了封装,大大降低了实现难度
- 熟悉的开发模型:可以使用标准的 Spring 功能,如依赖注入和组件扫描
- 与 Spring Boot 无缝集成:充分利用 Spring Boot 生态系统的强大能力
- 多种通信方式支持:支持 STDIO、HTTP、WebSocket 和 RSocket 等多种传输协议
项目概览
在本教程中,我们将构建一个简单的 MCP 服务器,用于提供有关Course的信息。我们的服务器将暴露两个工具:
- 一个用于检索所有可用Course的工具
- 一个用于根据Course标题查找特定课程的工具
这个简单的示例将展示 MCP 服务器开发的核心概念,并为你今后根据自身需求扩展功能打下基础。
前置条件
在开始之前,请确保你已经具备以下环境和知识:
- Java 开发工具包(JDK)17 或更高版本
- Maven 或 Gradle 用于依赖包管理
- 对 Spring Boot 有基本的了解
- 一个用于测试的 MCP 客户端(本教程将使用 Claude Desktop)
项目搭建
我们首先创建一个新的Spring Boot项目。最简单的方法是使用Spring Initializr。
按照以下配置设置你的项目:
- 项目类型:Maven
- 语言:Java
- Spring Boot 版本:最新版本
- 依赖项:添加 Spring AI MCP Server 依赖
这样就完成了项目的基础设置,接下来我们将开始编写MCP服务器的代码。
一旦你生成并下载了项目,就可以在 IDE 中打开它了。
理解项目结构
接下来我们来了解一下需要创建的关键组件:
- Course.java:一个用于表示课程数据的简单 record 类
- CourseService.java:一个服务类,通过 MCP 工具暴露课程数据
- CoursesApplication.java:主应用类,用于注册 MCP 工具
- application.properties:MCP 服务器的配置文件
这些组件将构成一个完整的 MCP 服务器示例,帮助我们演示其基本原理与用法。
第一步:创建数据模型
首先,我们来创建表示课程数据的 Course 类。由于我们使用的是 Java 17 及以上版本,可以使用 record 来定义一个简洁且不可变的数据结构:
public record Course(String title, String url) {
}
这条简单的记录将存储每门课程的标题和 URL。
步骤二:实现服务层
接下来,我们创建 CourseService 类。在这里,我们将使用 @Tool 注解来定义我们的 MCP 工具。
@Service
public class CourseService {
private static final Logger log = LoggerFactory.getLogger(CourseService.class);
private List<Course> courses = new ArrayList<>();
@Tool(name = "dv_get_courses", description = "Get a list of courses from Dan Vega")
public List<Course> getCourses() {
return courses;
}
@Tool(name = "dv_get_course", description = "Get a single course from Dan Vega by title")
public Course getCourse(String title) {
return courses.stream()
.filter(course -> course.title().equals(title))
.findFirst()
.orElse(null);
}
@PostConstruct
public void init() {
courses.addAll(List.of(
new Course("Building Web Applications with Spring Boot (FreeCodeCamp)",
"https://youtu.be/31KTdfRH6nY"),
new Course("Spring Boot Tutorial for Beginners – 2023 Crash Course using Spring Boot 3",
"https://youtu.be/UgX5lgv4uVM")
));
}
}
这个服务类的关键点包括:
- @Tool 注解:将普通方法转换为与 MCP 兼容的工具
- 工具属性:每个工具都有唯一的名称和描述性文本,帮助 AI 模型理解其用途
- 方法参数:参数变成工具的输入参数,可以由 AI 模型传递
- 返回类型:返回的数据会自动序列化为 AI 模型能够理解的格式
在这个示例中,我们使用了一个内存中的列表来存储课程,数据在 @PostConstruct 方法中初始化。在实际应用中,你可能会连接数据库或调用外部 API。
步骤三:在 MCP 中注册工具
现在,让我们设置主应用程序类,将工具注册到 MCP 框架中:
@SpringBootApplication
public class CoursesApplication {
public static void main(String[] args) {
SpringApplication.run(CoursesApplication.class, args);
}
@Bean
public List<ToolCallback> danTools(CourseService courseService) {
return List.of(ToolCallbacks.from(courseService));
}
}
ToolCallbacks.from() 方法会扫描服务类中的 @Tool 注解,并将它们注册到 MCP 框架中。这正是 Spring 组件扫描功能的优势 —— 只需几行代码,我们就完成了工具的注册。
步骤四:配置 MCP 服务器
最后,让我们通过 application.properties 文件来配置 MCP 服务器:
spring.main.web-application-type=none
spring.ai.mcp.server.name=dan-vega-mcp
spring.ai.mcp.server.version=0.0.1
# NOTE: You must disable the banner and the console logging
# to allow the STDIO transport to work !!!
spring.main.banner-mode=off
logging.pattern.console=
这段配置实现了几个重要功能:
- 禁用 Web 应用:由于我们使用的是 MCP 的 STDIO 传输方式,因此不需要启动 Web 服务器
- 设置服务器名称和版本:用于向客户端标识我们的 MCP 服务器
- 禁用横幅和控制台日志:确保 STDIO 传输能够正常工作
STDIO 传输机制使我们的 MCP 服务器能够通过标准输入输出流进行通信,这正是 Claude Desktop 在本地 MCP 服务器中使用的方式。
未完待续,下一节我们来运行和测试这个MCP。
我是一名有十年以上经验的Java老码农,曾经沉迷于代码的世界,也曾在传统业务系统中摸爬滚打。但时代在变,AI 正在重塑技术格局。我不想被浪潮甩在身后,所以选择重新出发,走上 AI 学习与转型的旅程。
这个公众号,记录的不是鸡汤,也不是“割韭菜”的教程,而是我一个程序员真实的思考、学习、实战经验,以及从困惑到突破的全过程。
如果你也是在技术瓶颈中思考转型、想了解 AI 如何与传统开发结合、又或仅仅想看一个普通工程师的进化之路,欢迎关注,一起探索,一起成长。
关注我 和我一起,紧跟着AI的步伐,不被时代抛弃。✨
评论前必须登录!
注册