百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

在 Java 中创建你的第一个Model Context Protocol (MCP) 服务器

haoteby 2025-09-11 01:08 9 浏览

你是否希望通过连接你自己的数据和服务,来扩展类似 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的步伐,不被时代抛弃。

相关推荐

如何随时清理浏览器缓存_清理浏览器缓存怎么弄

想随时清理浏览器缓存吗?Cookieformac版是Macos上一款浏览器缓存清理工具,所有的浏览器Cookie,本地存储数据,HTML5数据库,FlashCookie,Silverlight,...

Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器

介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...

mac清除工具分享,解除您在安全方面的后顾之忧

想要永久的安全的处理掉重要数据,删除是之一,使用今天小编分享的mac清除工具,为您的操作再增一层“保护”,小伙伴慎用哟,一旦使用就不可以恢复咯,来吧一起看看吧~mac清除工具分享,解除您在安全方面的后...

取代cookie的网站追踪技术:”帆布指纹识别”

【前言】一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Co...

辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒

近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...

浏览器指纹是什么?浏览器指纹包括哪些信息

本文关键词:浏览器指纹、指纹浏览器、浏览器指纹信息、指纹浏览器原理什么是浏览器指纹?浏览器指纹是指浏览器的各种信息,当我们访问其他网站时,即使是在匿名的模式下,这些信息也可以帮助网站识别我们的身份。...

那些通用清除软件不曾注意的秘密_清理不常用的应用软件

系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...

「网络安全宣传周」这些安全上网小知识你要知道!

小布说:互联网改变了人们的衣食住行,但与之伴生的网络安全威胁也不容忽视。近些年来,风靡全球的勒索病毒、时有发生的电信诈骗、防不胜防的个人信息泄露时时刻刻都威胁着我们的生活。9月18日-24日是第四届...

TypeScript 终极初学者指南_typescript 进阶

在过去的几年里TypeScript变得越来越流行,现在许多工作都要求开发人员了解TypeScript...

jQuery知识一览_jquery的认识和使用

一、概览jQuery官网:https://jquery.com/jQuery是一个高效、轻量并且功能丰富的js库。核心在于查询query。...

我的第一个Electron应用_electronmy

hello,好久不见,最近笔者花了几天时间入门Electron,然后做了一个非常简单的应用,本文就来给各位分享一下过程,Electron大佬请随意~笔者开源了一个Web思维导图,虽然借助showSav...

HTML5 之拖放(Drag 和 Drop)_html拖放api

简介拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在HTML5中,拖放是标准的一部分,任何元素都能够拖放。先点击一个小例子:在用户开始拖动<p>元素时执行JavaScrip...

如何用JavaScript判断输入值是数字还是字母?

在日常开发中,我们有时候需要判断用户输入的是数字还是字母。本文将介绍如何用JavaScript实现这一功能。检查输入值是否是数字或字母...

图形编辑器开发:快捷键的管理_图形编辑工具

大家好,我是前端西瓜哥。...

浏览器原生剪贴板:原来它能这样读取用户截图!

当我们使用GitHub时,会发现Ctrl+V就能直接读取用户剪贴板图片进行粘贴,那么它是如何工作的?安全性如何?...