news 2026/9/2 14:03:02

Spring AI 当中对应 MCP 的操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI 当中对应 MCP 的操作

或者在企业级中, 有多个智能应用,想将通用的tools公共化

怎么办?

可以把tools单独抽取出来, 由应用程序读取外部的tools。 那关键是怎么读呢? 怎么解析呢? 如果每个提供商各用一种规则你能想象有多麻烦! 所以MCP就诞生了, 他指定了标准规则, 以jsonrpc2.0的方式进行通讯。

那问题又来了, 以什么方式通讯呢? http? rpc? stdio? mcp提供了sse和stdio这2种方式。

使用

Streamable http目前springai1.0版本不支持(因为Streamable http 是 spring ai 1.0 之后说明的) 我们先掌握SSE和STDIO

分别说下STDIO和SSE的方式:

STDIO更适合客户端桌面应用和辅助工具

SSE更适合web应用 、业务有关的公共tools

MCP STDIO 输出配置实操

MCP Server

现成共用MCP Server

现在有很多MCP 服务 给大家提供一个网站:MCP Server(MCP 服务器)

那MCP有了, 怎么调用呢? 这里介绍2种使用方式:

MCP Client

通过工具

CherryStudio、Cursor 、Claude Desktop、Cline 等等很多, 这里不一一演示, 不会的话自己找个文章, 工具使用都很简单!

以Cline为例: 他是Vscode的插件

安装VSCode

安装插件:

配置cline的模型:

配置cline的mcpserver

{

"mcpServers": {

"baidu-map": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@baidumap/mcp-server-baidu-map"

],

"env": {

"BAIDU_MAP_API_KEY": "LEyBQxG9UzR9C1GZ6zDHsFDVKvBem2do"

}

},

"filesystem": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@modelcontextprotocol/server-filesystem",

"C:/Users/tuling/Desktop"

]

},

"mcp-server-weather": {

"command": "java",

"args": [

"-Dspring.ai.mcp.server.stdio=true",

"-Dlogging.pattern.console=",

"-jar",

"D:\\ideaworkspace\\git_pull\\tuling-flight-booking_all\\mcp-stdio-server\\target\\mcp-stdio-server-xs-1.0.jar"

]

}

}

}

开启cline权限

6.测试:

通过 Spring AI 接入 第三方的 MCP Server

依赖

<!--既支持sse\也支持Stdio-->

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>

</dependency>

2 配置

spring:

ai:

mcp:

client:

# 连接超时时间设置

request-timeout: 60000

stdio: # 设置 sse 输出方式

# 配置Mcp 方式2: 将 mcp的配置 单独放在一个 Json 文件当中读取,推荐,利用维护

# classpath 是指:项目resources

servers-configuration: classpath:/mcp-servers-config.json

# 配置MCP 方式2: 直接将 mcp 配置全局配置文件中(mcp 配置太多不利于维护)

# connections:

# server1:

# command: /path/to/server

# args:

# - --port=8080

# - --mode=production

# env:

# API_KEY: your-api-key

# DEBUG: "true"

mcp-servers-config.json:

获取Baidu地图key: 控制台 | 百度地图开放平台

{

"mcpServers": {

"baidu-map": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@baidumap/mcp-server-baidu-map"

],

"env": {

"BAIDU_MAP_API_KEY": "xxxx"

}

},

"filesystem": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@modelcontextprotocol/server-filesystem",

"C:/Users/tuling/Desktop"

]

},

"mcp-server-weather": {

"command": "java",

"args": [

"-Dspring.ai.mcp.server.stdio=true",

"-Dlogging.pattern.console=",

"-jar",

"D:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar"

]

}

}

}

{

"mcpServers": {

// 外部第三方的

"baidu-map": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@baidumap/mcp-server-baidu-map"

],

"env": {

"BAIDU_MAP_API_KEY": "xxxx"

}

},

// 外部第三方的

"filesystem": {

"command": "cmd", // 指明使用 cmd 命令执行

"args": [

"/c",

"npx",

"-y",

"@modelcontextprotocol/server-filesystem",

"C:/Users/tuling/Desktop"

]

},

// 自定义的 mcp 服务

"mcp-server-weather": { // 对应的项目名 application的 name

"command": "java", // 指明通过 java 命令执行,java 解析可以直接识别到

"args": [

"-Dspring.ai.mcp.server.stdio=true",

"-Dlogging.pattern.console=", // 清空控制台,不然会输入很多信息

"-jar", // -jar 启动 Spring Boot

"D:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar" // 自定义的mcp服务的jar路径

]

}

}

}

绑定到Chatclient

/**

* @description: 智能航空助手:

*/

@RestController

@CrossOrigin

public class OpenAiController {

private final ChatClient chatClient;

public OpenAiController(

DashScopeChatModel dashScopeChatModel,

// 配置引入 外部 mcp tools

ToolCallbackProvider mcpTools) {

this.chatClient =ChatClient.builder(dashScopeChatModel)

.defaultToolCallbacks(mcpTools) // 将外部的 mcop tools 对大模型进行绑定,这里是构造器的绑定,不是单个对话的绑定

.build();

}

@CrossOrigin

@GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)

public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {

Flux<String> content = chatClient.prompt()

.user(message)

.stream()

.content();

return content;

}

# 调试日志

logging:

level:

io:

modelcontextprotocol:

client: DEBUG

spec: DEBUG

使用 Spring AI 接入 自定义MCP Server

创建一个spring ai项目

依赖

<!--mcp-server -->

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-starter-mcp-server</artifactId>

</dependency>

<dependencyManagement>

<dependencies>

<!--spring ai 包管理依赖 -->

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-bom</artifactId>

<version>${spring-ai.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<!-- 打包 -->

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<executions>

<execution>

<goals>

<goal>repackage</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

添加工具

@Service

public class UserToolService {

Map<String,Double> userScore = Map.of(

"xushu",99.0,

"zhangsan",2.0,

"lisi",3.0);

@Tool(description = "获取用户分数")

public String getScore(String username) { // 也可以添加上 @ToolParam(description=“” )告诉大模型这个参数的描述是做什么的

if(userScore.containsKey(userName)){

return userScore.get(userName).toString();

}

return "未检索到当前用户"+userName;

}

}

暴露工具

@Bean // 将我们编写的 tools 对外的UserToolService 绑定上去

public ToolCallbackProvider weatherTools(UserToolService userToolService) {

return MethodToolCallbackProvider.builder().toolObjects(userToolService).build();

}

配置

spring:

main:

banner-mode: off

ai:

mcp:

server:

name: my-weather-server

version: 0.0.1

# 注意:您必须禁用横幅和控制台日志记录,以允许 STDIO 传输!!工作 banner-mode: off

打包 mvn package

此时target/生成了jar则成功!

在我们需要的用到我们自定义的 mcp 的项目当中,加上我们自行定义的 MCP 服务。如下,我们是将其统一放到了一个配置的 json 文件当中。去了

{

"mcpServers": {

// 外部第三方的

"baidu-map": {

"command": "cmd",

"args": [

"/c",

"npx",

"-y",

"@baidumap/mcp-server-baidu-map"

],

"env": {

"BAIDU_MAP_API_KEY": "xxxx"

}

},

// 外部第三方的

"filesystem": {

"command": "cmd", // 指明使用 cmd 命令执行

"args": [

"/c",

"npx",

"-y",

"@modelcontextprotocol/server-filesystem",

"C:/Users/tuling/Desktop"

]

},

// 自定义的 mcp 服务

"mcp-server-weather": { // 对应的项目名 application的 name

"command": "java", // 指明通过 java 命令执行,java 解析可以直接识别到

"args": [

"-Dspring.ai.mcp.server.stdio=true",

"-Dlogging.pattern.console=", // 清空控制台,不然会输入很多信息

"-jar", // -jar 启动 Spring Boot

"D:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar" // 自定义的mcp服务的jar路径

]

}

}

}

MCP SSE 输出配置实操(推荐 Web)

MCP Server

这种方式需要将部署为Web服务

依赖

<!--mcp服务器核心依赖— 响应式-->

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>

</dependency>

<!-- 这个 SSE 是需要 Web 的 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

定义外部工具

@Service

public class UserToolService {

Map<String,Double> userScore = Map.of(

"xushu",99.0,

"zhangsan",2.0,

"lisi",3.0);

@Tool(description = "获取用户分数")

public String getScore(String username) {

if(userScore.containsKey(username)){

return userScore.get(username).toString();

}

return "未检索到当前用户";

}

}

暴露工具

@Bean

public ToolCallbackProvider weatherToolCallbackProvider(WeatherService weatherService,

UserToolService userToolService) {

return MethodToolCallbackProvider.builder().toolObjects(userToolService).build();

}

配置(需要用 web 启动)

server:

port: 8088

MCP Client

将上面 通过 SSE 方式创建的自定义 MCP Server 配置进来

添加依赖

<!--既支持sse\也支持Stdio-->

<dependency>

<groupId>org.springframework.ai</groupId>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 4:05:20

自动驾驶汽车轨迹规划:人工势场法与MPC联合仿真探索

人工势场法换道主动避撞加mpc模型预测控制&#xff0c;carsim和simulink联合仿真&#xff0c;有规划和控制轨迹对比图。 跟踪误差良好&#xff0c;可以作为学习人工势场方法在自动驾驶汽车轨迹规划上的应用资料。在自动驾驶领域&#xff0c;轨迹规划与控制是保障行车安全与高效…

作者头像 李华
网站建设 2026/9/2 2:03:32

用长短期记忆网络融合注意力机制做时间序列预测,效果惊人

基于长短期记忆网络融合注意力机制的多变量时间序列预测&#xff0c;预测精度很高。 评价指标&#xff1a; RMSE 0.08024 MSE 0.0064385 MAE 0.071505 MAPE 0.05383在时间序列预测的领域里&#xff0c;多变量时间序列预测一直是个很有挑战性但又特别重要的任务。它广泛应…

作者头像 李华
网站建设 2026/9/2 19:43:24

端到端智驾仿真优选:aiSim破解场景生成、传感器融合核心难题

随着自动驾驶迈入端到端时代&#xff0c;“端到端已来&#xff0c;智驾仿真测试怎么做&#xff1f;”成为研发核心痛点。传统模块化仿真因接口缺失、保真度不足、场景覆盖有限&#xff0c;难以适配端到端模型全链路验证需求。康谋aiSim仿真工具凭借ISO 26262 ASIL-D认证、全链路…

作者头像 李华
网站建设 2026/9/2 13:34:38

汇编语言全接触-33.RichEdit 控件基础知识

有很多人要求我提供关于RichEdit控件的指南&#xff0c;经过这方面的大量编程实践&#xff0c;我想我终于可以开写关于RichEdit控件的指南了。诺&#xff0c;这个就是第一篇RichEdit指南。本指南将会描述涉及到RichEdit的几乎所有方面&#xff0c;起码是我所知道的关于它的所有…

作者头像 李华
网站建设 2026/9/2 18:00:20

【翼型】基于非主导排序遗传算法的翼型形状优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/9/2 14:49:33

基于金枪鱼群优化算法优化概率神经网络分类(TSO-PNN)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华