news 2026/7/16 10:00:20

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/7/15 18:08:31

基于TOA/FOA的无源定位方法MATLAB仿真探索

MATLAB仿真 基于toa/foa的无源定位方法&#xff0c;二次等式约束求解 有 参考文档 无源定位技术&#xff1a;二次等式约束最小二乘估计理论与方法 第八章在无线定位领域&#xff0c;基于TOA&#xff08;Time of Arrival&#xff0c;到达时间&#xff09;和FOA&#xff08;Frequ…

作者头像 李华
网站建设 2026/7/15 18:08:30

基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均

基于一致性算法改进的自适应虚拟阻抗控制研究&#xff0c;可以完美实现双机并联后线路阻抗引起的功率分布不均&#xff0c;下垂控制在电力系统的双机并联场景中&#xff0c;线路阻抗带来的功率分布不均一直是个令人头疼的问题。不过&#xff0c;通过基于一致性算法改进的自适应…

作者头像 李华
网站建设 2026/7/14 23:22:31

微软和布朗大学最新发现:让AI助手拥有18000多种技能的革命性突破

这项突破性研究由布朗大学的Reza Esfandiarpoor、Stephen H. Bach与微软的Vishwas Suryanarayanan、Vishal Chowdhary、Anthony Aue团队共同完成&#xff0c;于2025年发表。有兴趣深入了解的读者可以通过arXiv:2510.19286v1查询完整论文。这项研究首次展示了如何让AI助手掌握超…

作者头像 李华
网站建设 2026/7/14 12:43:29

MATLAB仿真:二维TOA传感器网络定位与时钟偏差拟合,最小二乘求解

MATLAB仿真 二维的TOA传感器网络定位时钟偏差拟合&#xff0c;最小二乘求解。在传感器网络定位中&#xff0c;基于到达时间&#xff08;TOA&#xff09;的定位方法是一种常用且有效的技术。不过&#xff0c;实际应用里时钟偏差是一个不可忽视的问题&#xff0c;它会影响定位的准…

作者头像 李华