MCP新版实现
🖥️ 基于 Spring AI 的本地与在线 MCP 客户端接入实战
Spring AI 支持本地与在线模型的统一封装调用,结合 MCP(Model Context Protocol)协议,可实现 AI 与文件系统交互、自动生成文件等强大能力。
本文将分别介绍:
- ✅ 基于 本地 Ollama + Qwen3 模型实现文件操作
- ✅ 基于 ZhiPu AI 在线模型 实现远程工具调用
🚀 本地 Ollama + Qwen3 模型接入 MCP 实践
✅ 推荐模型:Qwen3
使用 Qwen3 模型,原因如下:
- ✅ 支持 MCP 工具调用
- 🚫 其他模型(如 deepseek)当前不支持 MCP 工具
1️⃣ 引入依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
2️⃣ 配置 application.yml
spring:
ai:
ollama:
base-url: http://172.26.37.0:11434
embedding:
enabled: true
model: nomic-embed-text
options:
num-batch: 512
mcp:
client:
stdio:
servers-configuration: classpath:config/mcp-servers.json
3️⃣ MCP 工具配置 mcp-servers.json
在不使用本地服务的情况下,你也可以接入以下 云端托管的 MCP Server:
它们支持通过浏览器接入标准 MCP 工具链,适合快速接入和调试。
🖥️ 本地文件操作:server-filesystem 模式
若使用 server-filesystem
工具运行在本地环境,可实现如下能力:
- 📂 读取 / 写入 / 删除本地文件
- 📁 操作指定目录下的文件结构
- ✅ 完整支持 MCP 文件类工具接口
但需注意以下前提条件:
- 本地需安装好 Node.js 和 npm
- 全局安装或通过
npx
调用@modelcontextprotocol/server-filesystem
示例启动命令配置如下:
{
"mcpServers": {
"filesystem": {
"command": "npx.cmd",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"C:\\Users\\flycode\\Desktop\\temp"
]
}
}
}
📌 配置说明:
- MCP 工具将操作
C:\\Users\\flycode\\Desktop\\temp
目录 - 可通过 Ollama 实现 AI 与文件系统的交互
4️⃣ Spring Bean 配置
@Configuration
public class OllamaConfig {
@Bean
public ChatClient.Builder ollamaChatClientBuilder(OllamaChatModel ollamaChatModel) {
return new DefaultChatClientBuilder(
ollamaChatModel,
ObservationRegistry.NOOP,
(ChatClientObservationConvention) null
);
}
}
5️⃣ 调用测试:生成本地文件
@Resource
private ToolCallbackProvider toolCallback;
@Resource
private ChatClient.Builder ollamaChatClientBuilder;
@Test
public void makeNewText() {
String prompt = "帮我生成一个测试.txt文件到C:\\Users\\flycode\\Desktop\\temp位置,并且内容是测试xxxx";
String text = ollamaChatClientBuilder
.defaultTools(toolCallback)
.build()
.prompt(new Prompt(prompt, OllamaOptions.builder().model("qwen3:latest").build()))
.call()
.chatResponse()
.getResult()
.getOutput()
.getText();
log.info(text);
}
✅ 实际效果
📂 本地文件已自动创建:

☁️ 使用 ZhiPu AI 在线模型调用 MCP 工具
本地模型速度较慢?可以切换到 智谱 AI 在线模型,实现远程文件管理。
📌 注意:
- 仅智谱 API 支持 MCP 工具协议(国内支持最完善)
- 调用将消耗较多 Token,按需使用
1️⃣ 引入依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId>
</dependency>
2️⃣ 配置 application.yml
spring:
ai:
zhipuai:
api-key: xxxxxx # 请替换为你的真实密钥
chat:
options:
model: glm-4-plus
base-url: https://open.bigmodel.cn/api/paas/
mcp:
client:
stdio:
servers-configuration: classpath:config/mcp-servers.json
3️⃣ 配置 Bean
@Configuration
public class ZhipuConfig {
@Bean
public ZhiPuAiApi zhiPuAiApi(@Value("${spring.ai.zhipuai.base-url}") String baseUrl,
@Value("${spring.ai.zhipuai.api-key}") String apiKey) {
return new ZhiPuAiApi(baseUrl, apiKey);
}
@Bean
public ChatClient.Builder zhipuChatClientBuilder(ZhiPuAiChatModel zhipuChatModel) {
return new DefaultChatClientBuilder(
zhipuChatModel,
ObservationRegistry.NOOP,
(ChatClientObservationConvention) null
);
}
}
4️⃣ 测试 MCP 工具能力
@Resource
private ToolCallbackProvider toolCallback;
@Resource
private ChatClient.Builder zhipuChatClientBuilder;
@Test
public void test2() {
String res = zhipuChatClientBuilder
.defaultTools(toolCallback)
.build()
.prompt("当前有哪些工具可用")
.call()
.chatResponse()
.getResult()
.getOutput()
.getText();
log.info(res);
}
✅ 效果展示
✨ 可用 MCP 工具一览(自动返回):

🔚 总结
项目 | Ollama 本地模型 | 智谱 AI 在线模型 |
---|---|---|
速度 | 较慢 | 快速 |
支持模型 | Qwen3(MCP支持) | GLM 系列(MCP支持) |
调用成本 | 免费,需本地资源 | 收费,需 API Token |
推荐用途 | 本地开发、私有部署 | 云端调用、便捷测试 |
自定义 MCP 服务开发指南
为了实现更灵活的 AI 工具接入能力,我们可以自定义一个 MCP 服务模块,用于提供本地能力(例如系统信息、文件操作等)供 AI 调用。
1️⃣ 引入核心依赖
在新建的 Spring Boot 模块中添加以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
2️⃣ 实现自定义工具类(以获取电脑配置信息为例)
@Service
@Slf4j
public class ComputerService {
@Tool(description = "获取电脑配置信息")
public String getComputerInfo(@ToolParam(description = "电脑名称") String computerName) {
log.info("获取电脑配置信息" + computerName);
// 操作系统名称
String osName = System.getProperty("os.name");
// 操作系统版本
String osVersion = System.getProperty("os.version");
// 操作系统架构
String osArch = System.getProperty("os.arch");
// 用户的账户名称(注意:Java 本身没有直接获取用户名的方法)
String userName = System.getProperty("user.name");
// 用户的主目录
String userHome = System.getProperty("user.home");
// 用户的当前工作目录
String currentDir = System.getProperty("user.dir");
// Java 运行时环境版本
String javaVersion = System.getProperty("java.version");
StringBuilder res = new StringBuilder();
return res.append("Operating System: ").append(osName).append("\n")
.append("OS Version: ").append(osVersion).append("\n")
.append("OS Architecture: ").append(osArch).append("\n")
.append("User Name: ").append(userName).append("\n")
.append("User Home: ").append(userHome).append("\n")
.append("Current Directory: ").append(currentDir).append("\n")
.append("Java Version: ").append(javaVersion).append("\n").toString();
}
}
3️⃣ 配置 application.yml
目前提供的标准 MCP 服务类型有以下几种:
- WebMVC Server Transport:支持传统的 WebMVC 传输模式,适用于常规 Web 应用。
- WebMVC Server Transport:Full MCP Server:支持完整的 MCP 服务功能,集成
SSE
(Server-Sent Events)传输模式,基于 Spring WebFlux 实现,可以高效地处理实时流数据。 - WebMVC Server Transport with
STDIO
:在此模式下,MCP 服务通过标准输入输出(STDIO)方式进行通信,适合命令行工具或无需 Web 服务的场景。
在以下部分,我们将详细说明如何配置和使用 STDIO
模式的 MCP 服务,它适用于命令行操作、无界面的后台服务等场景。
为了避免 web 控制台输出,推荐使用 web-application-type: none
,适合 CLI 工具服务:
spring:
application:
name: mcp-server-computer
ai:
mcp:
server:
name: ${spring.application.name}
version: 1.0.0
main:
banner-mode: off
web-application-type: none
logging:
file:
name: ${spring.application.name}.log
server:
servlet:
encoding:
charset: UTF-8
force: true
4️⃣ 启动类与工具注册
@SpringBootApplication
@Slf4j
public class ComputerApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(ComputerApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("Computer service started");
}
// 将当前MCP工具注册到ToolBackProvider中
@Bean
public ToolCallbackProvider computerTool(ComputerService computerService) {
return MethodToolCallbackProvider.builder().toolObjects(computerService).build();
}
}
5️⃣ 打包服务 Jar 供调用
将该模块 打包为可执行 Jar,记录生成的路径(例如:ai-mcp-server-computer-1.0-SNAPSHOT.jar
):
🧭 例如:
D:\myprojects\Konwledge\xxx\target\ai-mcp-server-computer-1.0-SNAPSHOT.jar

6️⃣ 配置调用方 JSON 文件
在客户端(如 Zhipu AI)中的 mcp-servers.json
配置文件中添加如下内容:
{
"mcpServers": {
"filesystem": {
"command": "npx.cmd",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"C:\\Users\\flycode\\Desktop\\temp"
]
},
"mcp-server-computer": {
"command": "java",
"args": [
"-jar",
"D:\\myprojects\\Konwledge\\xxx\\target\\ai-mcp-server-computer-1.0-SNAPSHOT.jar"
]
}
}
}
7️⃣ 调用测试
使用 ChatClient
发起测试请求,查看工具是否注册成功:
@Resource
private ChatClient.Builder zhipuChatClientBuilder;
@Test
public void testToolAvailability() {
String res = zhipuChatClientBuilder
.defaultTools(toolCallback)
.build()
.prompt("当前有哪些工具可用")
.call()
.chatResponse()
.getResult()
.getOutput()
.getText();
log.info(res);
}
📸 测试效果如下图所示:

8️⃣ AI 问答调用效果
示例 prompt:调用工具生成电脑配置文件
@Test
public void testComputerTool() {
String prompt = "获取我的电脑配置信息,帮我生成一个电脑配置.txt文件到C:\\Users\\flycode\\Desktop\\temp位置,并且内容是电脑配置信息";
String text = zhipuChatClientBuilder
.defaultTools(toolCallback)
.build()
.prompt(new Prompt(prompt))
.call()
.chatResponse()
.getResult()
.getOutput()
.getText();
log.info(text);
}
最终 AI 成功读取配置信息并创建文件:

✅ 小结
通过自定义 MCP Server 模块,你可以让 AI 工具访问本地服务、操作本地资源,支持场景包括但不限于:
- 系统信息读取
- 本地文件生成 / 编辑
- 接入私有 API 或数据库查询
可以将多个服务模块整合,统一注册为 MCP 工具链,提高 AI 调度的灵活性。
贡献者
flycodeu
版权所有
版权归属:flycodeu