Java开发基于Spring AI Alibaba玩转MCP:从发布、调用到 Claude 集成
本文作者:夏冬,Spring AI Alibaba Contributor。
-
MCP 基础与快速体验(熟悉的读者可以跳过此部分)
-
如何将自己开发的 Spring 应用发布为 MCP Server,验证使用 Claude 或 Spring 应用作为客户端接入自己发布的 Java MCP Server。
- 发布 stdio 模式的 MCP Server
- 发布 SSE 模式的 MCP Server
- 开发另一个 Spring 应用作为 MCP Client 调用 MCP Server 服务
- 使用 Claude 桌面应用接入我们的 Java MCP Server
- 如何使用自己开发的 Spring 应用调用 MCP Server,包括调用自己发布的 Java MCP Server,也包括市面上其他通用 MCP Server。
- 配置并调用 stdio 模式的 MCP Server
- 配置并调用 SSE 模式的 MCP Server
- 如何在 Spring AI Alibaba OpemManus Agent 框架中使用 MCP Server
1、模型上下文协议(Model Context Protocol)入门
2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的"桥梁",让开发者不用再为对接问题头疼了。大模型应用可以使用别人分享的 MCP 服务来完成各种各样的工作内容,你可以从这些地方获取 MCP 服务:
- awesome-mcp-servers
- mcp.so
MCP 协议在实际的应用场景上非常广泛,列举一些比较常见的应用场景:
- 使用百度/高德地图分析旅线计算时间
- 接 Puppeteer 自动操作网页
- 使用 Github/Gitlab 让大模型接管代码仓库
- 使用数据库组件完成对 Mysql、ES、Redis 等数据库的操作
- 使用搜索组件扩展大模型的数据搜索能力
1.1 在 Claude Desktop 中体验 MCP
接下来我们使用 Claude 快速接入 Github 服务(提前申请 token),编辑一下 Claude Desktop 的配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
添加如下内容,注意把<YOUR_TOKEN>替换成你自 己申请的 token:
{
"mcpServers": {
"github": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "`"
}
}
}
}
重启Claude之后,可以看到已经加载了MCP对应的工具:

点开之后可以看到具体的工具内容:

此时我们就可以享受 Github 服务提供的操作仓库的能力:

从图上可以看到,通过创建仓库test-mcp这样的提示词,Claude 的大模型自行判断需要使用 mcp 中提供的create_repository能力,从而完成了仓库的创建,接下来我们打开 Github 也确实发现了这个已经创建的仓库。

通过这种方式,大模型就可以利用MCP接入各式各样的能力,完成各种更为复杂的工作。
1.2 MCP 的架构
MCP 主要分为MCP服务和MCP客户端:
- 客户端:一般指的是大模型应用,比如 Claude、通过 Spring AI Alibaba、Langchain 等框架开发的 AI 应用
- 服务端:连接各种数据源的服务和工具
整体架构如下:

整体的工作流程是这样的:AI 应用中集成MCP客户端,通过MCP协议向MCP服务端发起请求,MCP 服务端可以连接本地/远程的数据源,或者通过 API 访问其他服务,从而完成数据的获取,返回给 AI 应用去使用。
2、在 Spring AI 中使用 Mcp Server
2.1 Spring AI MCP 的介绍
Spring AI MCP 为模型上下文协议提供 Java 和 Spring 框架集成。它使 Spring AI 应用程序能够通过标准化的接口与不同的数据源和工具进行交互,支持同步和异步通信模式。整体架构如下:

Spring AI MCP 采用模块化架构,包括以下组件:
- Spring AI 应用程序:使用 Spring AI 框架构建想要通过 MCP 访问数据的生成式 AI 应用程序
- Spring MCP 客户端:MCP 协议的 Spring AI 实现,与服务器保持 1:1 连接
通过 Spring AI MCP,可以快速搭建 MCP 客户端和服务端程序。
2.2 使用 Spring AI MCP 快速搭建 MCP Server
Spring AI 提供了两种机制快速搭建 MCP Server,通过这两种方式开发者可以快速向 AI 应用开放自身的能力,这两种机制如下:
- 基于 stdio 的进程间通信传输,以独立的进程运行在 AI 应用本地,适用于比较轻量级的工具。
- 基于 SSE(Server-Sent Events) 进行远程服务访问,需要将服务单独部署,客户端通过服务端的 URL 进行远程访问,适用于比较重量级的工具。
接下来逐一介绍一下这两种方式的实现,示例代码可以通过如下链接获取:https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/server
2.2.1 基于 stdio 的 MCP 服务端实现
基于 stdio 的 MCP 服务端通过标准输入输出流与客户端通信,适用于作为子进程被客户端启动和管理的场景。
添加依赖
首先,在项目中添加 Spring AI MCP Server Starter 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
配置 MCP 服务端
在application.yml中配置 MCP 服务端,这次要实现的是一个天气服务:
spring:
main:
web-application-type: none # 必须禁用web应用类型
banner-mode: off # 禁用banner
ai:
mcp:
server:
stdio: true # 启用stdio模式
name: my-weather-server # 服务器名称
version: 0.0.1 # 服务器版本
实现 MCP 工具
使用@Tool注解标记方法,使其可以被 MCP 客户端发现和调用,通过@ToolParameter注解工具的具体参数:
@Service
public class OpenMeteoService {
private final WebClient webClient;
public OpenMeteoService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder
.baseUrl("https://api.open-meteo.com/v1")
.build();
}
@Tool(description = "根据经纬度获取天气预报")
public String getWeatherForecastByLocation(
@ToolParameter(description = "纬度,例如:39.9042") String latitude,
@ToolParameter(description = "经度,例如:116.4074") String longitude) {
try {
String response = webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/forecast")
.queryParam("latitude", latitude)
.queryParam("longitude", longitude)
.queryParam("current", "temperature_2m,wind_speed_10m")
.queryParam("timezone", "auto")
.build())
.retrieve()
.bodyToMono(String.class)
.block();
// 解析响应并返回格式化的天气信息
// 这里简化处理,实际应用中应该解析JSON
return "当前位置(纬度:" + latitude + ",经度:" + longitude + ")的天气信息:\n" + response;
} catch (Exception e) {
return "获取天气信息失败:" + e.getMessage();
}
}
@Tool(description = "根据经纬度获取空气质量信息")
public String getAirQuality(
@ToolParameter(description = "纬度,例如:39.9042") String latitude,
@ToolParameter(description = "经度,例如:116.4074") String longitude) {
// 模拟数据,实际应用中应调用真实API
return "当前位置(纬度:" + latitude + ",经度:" + longitude + ")的空气质量:\n" +
"- PM2.5: 15 μg/m³ (优)\n" +
"- PM10: 28 μg/m³ (良)\n" +
"- 空气质量指数(AQI): 42 (优)\n" +
"- 主要污染物: 无";
}
}
这里使用了OpenMeteo, OpenMeteo是一个开源的天气 API,为非商业用途提供免费访问,无需 API 密钥。
注册 MCP 工具
在应用程序入口类中注册工具:
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {
return MethodToolCallbackProvider.builder()
.toolObjects(openMeteoService)
.build();
}
}
运行服务端
在控制台中执行如下命令,编译并打包应用:
mvn clean package -DskipTests
2.2.2 基于 SSE 的 MCP 服务端实现
基于 SSE 的 MCP 服务端通过 HTTP 协议与客户端通信,适用于作为独立服务部署的场景,可以被多个客户端远程调用,具体做法与 stdio 非常类似。
添加依赖
首先,在您的项目中添加 Spring AI MCP Server Starter 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId>
</dependency>
配置 MCP Server
在application.yml中配置 MCP Server:
server:
port: 8080 # MCP Server 端口配置
spring:
ai:
mcp:
server:
name: my-weather-server # MCP Server 名称
version: 0.0.1 # MCP Server 版本号
实现 MCP Tool
与基于 stdio 的实现完全相同:
@Service
public class OpenMeteoService {
private final WebClient webClient;
public OpenMeteoService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder
.baseUrl("https://api.open-meteo.com/v1")
.build();
}
@Tool(description = "根据经纬度获取天气预报")
public String getWeatherForecastByLocation(
@ToolParameter(description = "纬度,例如:39.9042") String latitude,
@ToolParameter(description = "经度,例如:116.4074") String longitude) {
try {
String response = webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/forecast")
.queryParam("latitude", latitude)
.queryParam("longitude", longitude)
.queryParam("current", "temperature_2m,wind_speed_10m")
.queryParam("timezone", "auto")
.build())
.retrieve()
.bodyToMono(String.class)
.block();
// 解析响应并返回格式化的天气信息
return "当前位置(纬度:" + latitude + ",经度:" + longitude + ")的天气信息:\n" + response;
} catch (Exception e) {
return "获取天气信息失败:" + e.getMessage();
}
}
@Tool(description = "根据经纬度获取空气质量信息")
public String getAirQuality(
@ToolParameter(description = "纬度,例如:39.9042") String latitude,
@ToolParameter(description = "经度,例如:116.4074") String longitude) {
// 模拟数据,实际应用中应调用真实API
return "当前位置(纬度:" + latitude + ",经度:" + longitude + ")的空气质量:\n" +
"- PM2.5: 15 μg/m³ (优)\n" +
"- PM10: 28 μg/m³ (良)\n" +
"- 空气质量指数(AQI): 42 (优)\n" +
"- 主要污染物: 无";
}
}
注册 MCP 工具
在应用程序入口类中注册工具:
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {
return MethodToolCallbackProvider.builder()
.toolObjects(openMeteoService)
.build();
}
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
运行服务端
在控制台中输入命令,运行服务端:
mvn spring-boot:run
服务端将在 http://localhost:8080 启动。
2.3 在 Claude 中测试 mcp 服务
在上一小节中我们编写完了 MCP 服务,这些服务到底是否能正常运行呢?在 Claude Desktop 中可以测试一下。
修改配置文件,添加weather的配置,一定要注意 jar 包的路径必须是全路径:
{
"mcpServers": {
"github": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": your token
}
},
"weather": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dlogging.pattern.console=",
"-jar",
"<修改为stdio编译之后的jar包全路径>"
],
"env": {}
}
}
}
重启 Claude 之后看到,我们编写的两个 Tool 已经被加载进来了:

输入提示词,查询今天北京的空气质量:

Claude 触发了我们自己编写的天气服务,展示了完整的数据:

上面使用了 stdio 的方式在 Claude Desktop 中使用我们自己编写的 MCP 服务,但是很可惜 Claude Desktop 不支持直接通过 SSE 模式访问,必须使用 mcp-proxy 作为中介,所以这里我们不再演示 Claude Desktop 接入 SSE 模式的 MCP 服务。
3、在 Spring AI Alibaba 中集成 Mcp Client
对于客户端,Spring AI 同样提供了 stdio 和 SSE 两种机制快速集成 MCP Server,分别对应到 MCP Server 的 stdio 和 SSE 两种模式,参考代码如下:https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/client
3.1 基于 stdio 的 MCP 客户端实现
基于 stdio 的实现是最常见的 MCP 客户端实现方式,它通过标准输入输出流与 MCP 服务器进行通信。这种方式适用于使用了 stdio 方式本地部署的 MCP 服务器,可以直接在同一台机器上启动 MCP 服务器进程。
添加依赖
首先,在项目中添加 Spring AI MCP starter 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
<!-- 添加Spring AI MCP starter依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
