Spring AI:让大模型住进 Spring 生态(九)
·



个人主页:手握风云
目录
一、自定义 MCP Server
开发者可按需封装自有业务工具(如用户信息查询、内部业务接口),打包为标准 MCP Server,供 Cursor、Cline、Spring AI 应用等任意 MCP 客户端标准化调用,实现业务能力跨 AI 应用复用。
提供两种主流传输实现:
- STDIO:本地进程间通信,适合本地 IDE 客户端(Cursor/Cline)本地调用;
- SSE:HTTP 流式长连接,适合远程分布式部署、多服务跨机器调用。
二、 Stdio 本地服务
2.1. 项目搭建
核心依赖:
<!-- MCP STDIO服务端核心启动器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
打包插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.5.3</version>
</plugin>
</plugins>
</build>
2.2. 自定义业务工具开发
定义数据实体:
package com.yang.mcp.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class UserInfo {
private String name;
private Integer age;
private String sex;
private String address;
}
编写业务 Service,使用 @Tool 注解标记对外暴露的工具方法,描述工具作用、入参。
package com.yang.mcp.service;
import com.yang.mcp.entity.UserInfo;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import java.util.HashMap;
import java.util.Map;
@Service
public class UserService {
static Map<String, UserInfo> userInfoMap = new HashMap<>();
static {
userInfoMap.put("zhangsan", new UserInfo("zhangsan", 15, "男", "北京"));
userInfoMap.put("lisi", new UserInfo("lisi", 16, "男", "上海"));
userInfoMap.put("wangwu", new UserInfo("wangwu", 17, "男", "广州"));
userInfoMap.put("zhaoliu", new UserInfo("zhaoliu", 18, "女", "深圳"));
userInfoMap.put("sunqi", new UserInfo("sunqi", 19, "女", "香港"));
userInfoMap.put("zhaoba", new UserInfo("zhaoba", 20, "女", "澳门"));
}
@Tool(description = "根据用户的姓名, 返回用户信息")
public String getUserInfo(@ToolParam(description = "用户姓名") String name) {
if (userInfoMap.containsKey(name)) {
return userInfoMap.get(name).toString();
}
return "用户不存在";
}
}
配置 Bean,将工具注册为 MCP 可识别回调:
package com.yang.mcp.config;
import com.yang.mcp.service.UserService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ToolConfig {
@Bean
public ToolCallbackProvider getUserInfo(UserService userService) {
return MethodToolCallbackProvider.builder()
.toolObjects(userService)
.build();
}
}
2.3. 配置文件
spring:
ai:
mcp:
server:
name: user-info
version: 0.0.1
main:
web-application-type: none # 关闭web服务,纯STDIO进程
banner-mode: off
执行 mvn package 生成 target 下可执行 jar;客户端通过 java -jar 命令拉起该进程,通过标准输入输出(stdin/stdout)完成 MCP 通信。
2.4. 客户端调用方式
- Cursor IDE 客户端调用
在 mcp.json 配置本地 jar 启动命令:
"user-info": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dlogging.pattern.console=",
"-jar",
"D:\\spring-ai\\spring-ai-project2\\mcp-stdio-server-demo\\target\\mcp-stdio-server-demo-1.0-SNAPSHOT.jar"
]
}

配置完成后列表显示绿色 1 tools enabled 即生效,对话中自然语言提问即可自动调用自定义工具。

- Spring AI 调用
- 在 mcp-servers-config.json 写入上述 jar 启动配置;
- 注入 ToolCallbackProvider 到 ChatClient,自动加载本地 MCP 服务的工具;
- 接口接收 prompt,AI 自动调用自定义工具返回业务数据。
测试接口:http://127.0.0.1:8080/chat/generate?message=查询用户 lisi 的信息。

2.5. HTTP 流式远程服务
二选一 Web 依赖(WebMvc/WebFlux),不可混用:
<!-- 传统 Servlet-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
<!-- 响应式-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
WebMvc 配置:
server:
port: 8088
spring:
ai:
mcp:
server:
name: user-info
version: 0.0.1
启动模块,访问:http://127.0.0.1:8088/sse

spring:
ai:
mcp:
client:
sse:
connections:
user-info:
url: http://127.0.0.1:8088/sse
更多推荐




所有评论(0)