当前位置: 首页 > news >正文

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

摘要

本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP,主要包含以下内容。

1. 一些 MCP 基础与快速体验(熟悉的读者可以跳过此部分)

2. 如何将自己开发的 Spring 应用发布为 MCP Server,验证使用 Claude 或 Spring 应用作为客户端接入自己发布的 Java MCP Server。

  • 发布 stdio 模式的 MCP Server

  • 发布 SSE 模式的 MCP Server

  • 开发另一个 Spring 应用作为 MCP Client 调用 MCP Server 服务

  • 使用 Claude 桌面应用接入我们的 Java MCP Server

3. 如何使用自己开发的 Spring 应用调用 MCP Server,包括调用自己发布的 Java MCP Server,也包括市面上其他通用 MCP Server。

  • 配置并调用 stdio 模式的 MCP Server

  • 配置并调用 SSE 模式的 MCP Server

4. 如何在 Spring AI Alibaba OpemManus 实现中使用 MCP 服务。

5. 关于存量应用如何一行代码不动就可以被当作 MCP 服务被智能体调用,请关注后续文章解决方案。

Spring AI Alibaba 开源项目地址

https://github.com/alibaba/spring-ai-alibaba

本文外网博客地址

https://java2ai.com

本示例源码地址

https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example

模型上下文协议(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 应用去使用。

在 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           # 禁用bannerai: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();// 解析响应并返回格式化的天气信息// 这里简化处理,实际应用中应该解析JSONreturn "当前位置(纬度:" + 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) {// 模拟数据,实际应用中应调用真实APIreturn "当前位置(纬度:" + 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);}@Beanpublic ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {return MethodToolCallbackProvider.builder().toolObjects(openMeteoService).build();}
}
运行服务端

在控制台中执行如下命令,编译并打包应用:

Terminal window

mvn clean package -DskipTests

2.2.2 基于 SSE 的 MCP 服务端实现

基于 SSE 的 MCP 服务端通过 HTTP 协议与客户端通信,适用于作为独立服务部署的场景,可以被多个客户端远程调用,具体做法与 stdio 非常类似。

添加依赖

首先,在您的项目中添加依赖

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId>
</dependency>
配置 MCP 服务端

在application.yml中配置 MCP 服务端:

server:port: 8080  # 服务器端口配置spring:ai:mcp:server:name: my-weather-server    # MCP服务器名称version: 0.0.1            # 服务器版本号
实现 MCP 工具

与基于 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) {// 模拟数据,实际应用中应调用真实APIreturn "当前位置(纬度:" + 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);}@Beanpublic ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {return MethodToolCallbackProvider.builder().toolObjects(openMeteoService).build();}@Beanpublic WebClient.Builder webClientBuilder() {return WebClient.builder();}
}
运行服务端

在控制台中输入命令,运行服务端:

Terminal window

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 服务。

在 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>

配置 MCP 服务器

在 application.yml 中配置 MCP 服务器:

spring:ai:dashscope:# 配置通义千问API密钥api-key: ${DASH_SCOPE_API_KEY}mcp:client:stdio:# 指定MCP服务器配置文件路径(推荐)servers-configuration: classpath:/mcp-servers-config.json# 直接配置示例,和上边的配制二选一# connections:#   server1:#     command: java#     args:#       - -jar#       - /path/to/your/mcp-server.jar

这个配置文件设置了 MCP 客户端的基本配置,包括 API 密钥和服务器配置文件的位置。你也可以选择直接在配置文件中定义服务器配置,但是还是建议使用 json 文件管理 mcp 配置。在 resources 目录下创建 mcp-servers-config.json 配置文件:

{"mcpServers": {// 定义名为"weather"的MCP服务器"weather": {// 指定启动命令为java"command": "java",// 定义启动参数"args": ["-Dspring.ai.mcp.server.stdio=true","-Dspring.main.web-application-type=none","-jar","<修改为stdio编译之后的jar包全路径>"],// 环境变量配置(可选)"env": {}}}
}

这个 JSON 配置文件定义了 MCP 服务器的详细配置,包括如何启动服务器进程、需要传递的参数以及环境变量设置,还是要注意引用的 jar 包必须是全路径的。

编写一个启动类进行测试:

```java
@SpringBootApplication
public class Application {public static void main(String[] args) {// 启动Spring Boot应用SpringApplication.run(Application.class, args);}@Beanpublic CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools,ConfigurableApplicationContext context) {return args -> {// 构建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultTools(tools).build();// 定义用户输入String userInput = "北京的天气如何?";// 打印问题System.out.println("\n>>> QUESTION: " + userInput);// 调用LLM并打印响应System.out.println("\n>>> ASSISTANT: " +chatClient.prompt(userInput).call().content());// 关闭应用上下文context.close();};}
}

这段代码展示了如何在 Spring Boot 应用中使用 MCP 客户端。它创建了一个命令行运行器,构建了 ChatClient 并注入了 MCP 工具,然后使用这个客户端发送查询并获取响应。在 Spring AI Alibaba 中使用 Mcp 工具非常简单,只需要把 ToolCallbackProvider 放到 chatClientBuilder的defaultTools 方法中,就可以自动的适配。通过命令启动程序进行测试:Terminal window```plaintext
mvn spring-boot:run

启动之后显示结果为,从日志可以看到我们自己编写的 mcp server 被调用了,返回了数据:

>>> QUESTION: 北京的天气如何?
2025-03-31T17:56:17.931+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] io.modelcontextprotocol.spec.McpSchema   : Received JSON message: {"jsonrpc":"2.0","id":"60209de5-3","result":{"content":[{"type":"text","text":"\"当前天气:\n温度: 18.6°C (体感温度: 15.1°C)\n天气: 多云\n风向: 南风 (4.7 km/h)\n湿度: 18%\n降水量: 0.0 毫米\n\n未来天气预报:\n2025-03-31 (周一):\n温度: 2.4°C ~ 19.5°C\n天气: 多云\n风向: 南风 (8.4 km/h)\n降水量: 0.0 毫米\n\n2025-04-01 (周二):\n温度: 7.6°C ~ 20.6°C\n天气: 多云\n风向: 西北风 (19.1 km/h)\n降水量: 0.0 毫米\n\n2025-04-02 (周三):\n温度: 6.9°C ~ 18.4°C\n天气: 晴朗\n风向: 西北风 (12.8 km/h)\n降水量: 0.0 毫米\n\n2025-04-03 (周四):\n温度: 7.0°C ~ 19.8°C\n天气: 多云\n风向: 南风 (16.3 km/h)\n降水量: 0.0 毫米\n\n2025-04-04 (周五):\n温度: 7.5°C ~ 21.6°C\n天气: 多云\n风向: 西北风 (19.6 km/h)\n降水量: 0.0 毫米\n\n2025-04-05 (周六):\n温度: 5.6°C ~ 20.7°C\n天气: 多云\n风向: 西风 (16.5 km/h)\n降水量: 0.0 毫米\n\n2025-04-06 (周日):\n温度: 8.4°C ~ 22.3°C\n天气: 晴朗\n风向: 南风 (9.4 km/h)\n降水量: 0.0 毫米\n\n\""}],"isError":false}}
2025-03-31T17:56:17.932+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] i.m.spec.McpClientSession                : Received Response: JSONRPCResponse[jsonrpc=2.0, id=60209de5-3, result={content=[{type=text, text="当前天气:\n温度: 18.6°C (体感温度: 15.1°C)\n天气: 多云\n风向: 南风 (4.7 km/h)\n湿度: 18%\n降水量: 0.0 毫米\n\n未来天气预报:\n2025-03-31 (周一):\n温度: 2.4°C ~ 19.5°C\n天气: 多云\n风向: 南风 (8.4 km/h)\n降水量: 0.0 毫米\n\n2025-04-01 (周二):\n温度: 7.6°C ~ 20.6°C\n天气: 多云\n风向: 西北风 (19.1 km/h)\n降水量: 0.0 毫米\n\n2025-04-02 (周三):\n温度: 6.9°C ~ 18.4°C\n天气: 晴朗\n风向: 西北风 (12.8 km/h)\n降水量: 0.0 毫米\n\n2025-04-03 (周四):\n温度: 7.0°C ~ 19.8°C\n天气: 多云\n风向: 南风 (16.3 km/h)\n降水量: 0.0 毫米\n\n2025-04-04 (周五):\n温度: 7.5°C ~ 21.6°C\n天气: 多云\n风向: 西北风 (19.6 km/h)\n降水量: 0.0 毫米\n\n2025-04-05 (周六):\n温度: 5.6°C ~ 20.7°C\n天气: 多云\n风向: 西风 (16.5 km/h)\n降水量: 0.0 毫米\n\n2025-04-06 (周日):\n温度: 8.4°C ~ 22.3°C\n天气: 晴朗\n风向: 南风 (9.4 km/h)\n降水量: 0.0 毫米\n\n"}], isError=false}, error=null]

3.2 基于 SSE 的 MCP 客户端实现

除了基于 stdio 的实现外,Spring AI Alibaba 还提供了基于 Server-Sent Events (SSE)的 MCP 客户端实现。这种方式适用于远程部署的 MCP 服务器,可以通过 HTTP 协议与 MCP 服务器进行通信。

添加依赖

首先,在您的项目中添加 Spring AI MCP starter 依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId>
</dependency>

配置 MCP 服务器

在 application.yml 中配置 MCP 服务器,这里需要指定 SSE 启动的服务地址,之前我们在 8080 端口上启动了对应的服务:

spring:ai:dashscope:api-key: ${DASH_SCOPE_API_KEY}mcp:client:sse:connections:server1:url: http://localhost:8080  #服务地址

使用 MCP 客户端

使用方式与基于 stdio 的实现相同,只需注入 ToolCallbackProvider 和 ChatClient.Builder:


@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Beanpublic CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools,ConfigurableApplicationContext context) {return args -> {// 构建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultTools(tools).build();// 使用ChatClient与LLM交互String userInput = "北京的天气如何?";System.out.println("\n>>> QUESTION: " + userInput);System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());context.close();};}
}

通过命令启动程序进行测试:

Terminal window

mvn spring-boot:run

启动之后会有报错:

Caused by: java.lang.IllegalStateException: Multiple tools with the same name (spring-ai-mcp-client-getWeatherForecastByLocation, spring-ai-mcp-client-getAirQuality)at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.validateToolCallbacks(SyncMcpToolCallbackProvider.java:126) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.getToolCallbacks(SyncMcpToolCallbackProvider.java:110) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]at org.springframework.ai.autoconfigure.mcp.client.McpClientAutoConfiguration.toolCallbacksDeprecated(McpClientAutoConfiguration.java:196) ~[spring-ai-mcp-client-spring-boot-autoconfigure-1.0.0-M6.jar:1.0.0-M6]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.2.0.jar:6.2.0]... 23 common frames omitted

从日志上分析,是因为注册了相同的服务名 spring-ai-mcp-client-getWeatherForecastByLocation 和 spring-ai-mcp-client-getAirQuality,但是从代码上分析,这两个服务我们都只注册了一次,那为什么会报错呢?

其实这是 Spring AI 目前的一个 BUG,Spring AI 提供了两个自动配置类去生成客户端工具处理 MCP 服务中 Tool 的获取,分别是 SseHttpClientTransportAutoConfiguration 和 SseWebFluxTransportAutoConfiguration。这两个自动配置类提供了同步和异步两种方式,本身应该是互斥的,但是 Spring AI 对于互斥的处理上出了问题,导致两个自动配置类都会加载。

SseWebFluxTransportAutoConfiguration 的加载:

SseHttpClientTransportAutoConfiguration 的加载:

两个自动配置类加载之后,就会向提供 SSE 服务的 MCP 服务申请 Tool,这样就导致同样的 Tool 被申请了两次,自然就会重复了。解决方案也非常简单,在启动类上排除 SseHttpClientTransportAutoConfiguration 实现就可以了。

@SpringBootApplication(exclude = {org.springframework.ai.autoconfigure.mcp.client.SseHttpClientTransportAutoConfiguration.class
})
public class Application {
...

再次通过命令启动程序进行测试:

Terminal window

mvn spring-boot:run

这一次就输出了正确的结果:

在 Spring AI Alibaba 的 Open Manus 中体验 MCP

Spring AI Alibaba 中提供了 Open Manus 的实现,整体架构如下:

在执行阶段,会调用各种 Tool 来完成任务,如果我们能使用 MCP 增加 Tool 的能力,那势必能 Open Manus 如虎添翼,接下来我们就来看一下 Open Manus 中是如何去使用 MCP 的。

源代码如下:

++https://github.com/alibaba/spring-ai-alibaba/tree/main/community/openmanus++

添加依赖

首先,在项目中添加 Spring AI MCP starter 依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>${spring-ai.version}</version>
</dependency>

配置 MCP 服务器

在 application.yml 中已经配置了 MCP 服务器,设置客户端请求服务端的超时时间为 1 分钟:

添加 mcp-servers-config.json,在 json 中配置了百度地图。百度地图核心 API 现已全面兼容 MCP 协议,是国内首家兼容 MCP 协议的地图服务商。百度地图已经完成了 8 个核心 API 接口和 MCP 协议的对接, 涵盖逆地理编码、地点检索、路线规划等。

使用百度地图的 MCP,需要申请ak:

https://lbsyun.baidu.com/apiconsole/key。

{"mcpServers": {"baidu-map": {"command": "npx","args": ["-y","@baidumap/mcp-server-baidu-map"],"env": {"BAIDU_MAP_API_KEY": "your_baidu_AK"}}}
}

将其中BAIDU_MAP_API_KEY修改为申请的ak。

使用 MCP 工具

修改 LlmService 的构造方法源码,在构造时直接通过 Spring 容器获取 ToolCallbackProvider 并加入到 ChatClient.builder 中:

public LlmService(ChatModel chatModel, ToolCallbackProvider toolCallbackProvider) {this.chatModel = chatModel;this.planningChatClient = ChatClient.builder(chatModel).defaultSystem(PLANNING_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(planningMemory)).defaultAdvisors(new SimpleLoggerAdvisor()).defaultTools(ToolBuilder.getPlanningAgentToolCallbacks()).defaultTools(toolCallbackProvider).build();this.chatClient = ChatClient.builder(chatModel).defaultSystem(MANUS_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(memory)).defaultAdvisors(new SimpleLoggerAdvisor()).defaultTools(ToolBuilder.getManusAgentToolCalls()).defaultTools(toolCallbackProvider).defaultOptions(OpenAiChatOptions.builder().internalToolExecutionEnabled(false).build()).build();this.finalizeChatClient = ChatClient.builder(chatModel).defaultSystem(FINALIZE_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(finalizeMemory)).defaultAdvisors(new SimpleLoggerAdvisor()).build();
}

通过 defaultTools 将 mcp 服务提供的 tool 交给 ChatClient 处理。

测试效果

启动 OpenManus,执行提示词:规划下从上海到北京的路线。但是如果这样写,可能会触发 google search,我们可以优化下提示词主动选择百度地图。

使用百度地图规划从北京市到上海市的路线

执行程序之后可以看到规划之后的计划:

Steps:
0. [ ] [MANUS] 使用百度地图的地理编码服务获取北京市和上海市的经纬度坐标
1. [ ] [MANUS] 使用百度地图的路线规划服务计算从北京市到上海市的驾车路线
2. [ ] [MANUS] 分析并提供最终的路线信息,包括距离、预计耗时等

很显然,这一次 OpenManus 选择了我们集成的百度地图 mcp server,我们来看一下结果。

获取到了北京市和上海市的经纬度坐标:

Here is a summary of what we accomplished in this step:
- For Beijing, we received the coordinates: Longitude (lng): 116.4133836971231, Latitude (lat): 39.910924547299565.
- For Shanghai, we received the coordinates: Longitude (lng): 121.48053886017651, Latitude (lat): 31.235929042252014.

计算从北京市到上海市的驾车路线:

Distance: The total distance of the route is 1,223,200 meters (approximately 1,223 kilometers).
Duration: The estimated travel time is 50,592 seconds (approximately 14 hours and 3 minutes).

结果:

总距离:约 1223 公里

预计耗时:约 12 小时 45 分钟

主要途径:京沪高速公路(G2)

总结

作为 AI 开发领域的革命性突破,Model Context Protocol(MCP)重新定义了智能体与工具生态的交互范式。通过标准化协议打通地图服务、代码仓库、数据库等核心工具链,MCP 不仅解决了传统 AI 开发中跨平台对接的碎片化难题,更以”开箱即用”的轻量化集成模式,让开发者能够快速构建具备多模态能力的智能应用。

未来,随着更多工具接入 MCP 生态,开发者只需专注于业务逻辑创新,而复杂的工具链整合将真正成为”看不见的底层能力”——这或许正是 AI 普惠化进程中,最具实际意义的技术跃迁。

Spring AI 中的 MCP 支持可以让 Java 开发者轻松的将自己的应用发布为 MCP Server 或者是作为消费者去集成任意的 MCP Server 实现。Spring AI Alibaba 社区 3 群:61290041831

Spring AI Alibaba 开源项目地址:

https://github.com/alibaba/spring-ai-alibaba

Spring AI Alibaba 官网地址:

https://java2ai.com/

本示例源码地址:

https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example

相关文章:

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

摘要 本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP&#xff0c;主要包含以下内容。 1. 一些 MCP 基础与快速体验&#xff08;熟悉的读者可以跳过此部分&#xff09; 2. 如何将自己开发的 Spring 应用发布为 MCP Server&#xff0c;验…...

CSS核心笔记001

目录 杂七杂八知识点样式优先级风格基本选择器通配符元素类ID 复合选择器交集选择器并集后代-孙子儿子兄弟属性各种属性选择器的应用 伪类动态伪类结构伪类否定伪类目标为类语言伪类UI伪类 伪元素 杂七杂八知识点 样式优先级 行内 > 内部 > 外部风格 紧凑风格基本选择…...

Windows快速切换屏幕/桌面

windows自带的切屏 需要winctrl 小键盘左右键 但是&#xff01; Windows使用还是键盘加鼠标舒服&#xff01; 教程 安装autohotkey 代码 ~LWin & LButton::{SendInput "^#{Left}" ; 发送 Win Ctrl Left (切换到左侧虚拟桌面) } ; 使用花括号包裹命令&a…...

ESP32- 开发笔记- 硬件设计-ESP32-C3基本电路

ESP32的最小电路 1 ESP32固件下载 ESP32 有多种下载(烧录)固件的方式,具体选择取决于开发环境和硬件连接。以下是常见的几种下载方式: 1.1 USB 串口下载(最常用) 适用场景:通过 USB 转串口芯片(如 CP2102、CH340)连接电脑,使用 esptool 或其他工具烧录固件。这里…...

webgl入门实例-09索引缓冲区示例

实现效果 实现代码 <!doctype html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport"content"widthdevi…...

STM32 串口中断接收方式笔记:HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT

&#x1f4d8; STM32 串口中断接收方式笔记&#xff1a;HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT &#x1f9e0; 1. 两者作用简述 函数/宏作用是否配置HAL状态是否调用Rx回调HAL_UART_Receive_IT()启动一次基于中断的串口接收任务✅ 是✅ 是__HAL_UART_ENABLE_IT()手动使…...

ubuntu 向右拖动窗口后消失了、找不到了

这是目前单显示器的设置&#xff0c;因为实际只有1个显示器&#xff0c;之前的设置如下图所示&#xff0c;有2个显示器&#xff0c;一个主显示器&#xff0c;一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时&#xff0c;向右一滑&#xff0c;发现这个窗口再也不显示了、找…...

Selenium 获取 Web 页面信息的全指南

Selenium 获取 Web 页面信息的全指南 Selenium 是一个功能强大的自动化测试工具&#xff0c;但它也可以用于 web 页面信息的抓取和分析。本文将详细介绍如何使用 Selenium 来获取网页信息&#xff0c;并涵盖从环境搭建到高级技巧的各个方面。 目录 简介环境搭建Selenium 的基…...

stm32-lm75、SPI

一、lm75--温度传感器 LM75 是一种数字温度传感器和带有 2 线接口的热监视器&#xff08;热看门狗&#xff09;&#xff0c;以下是其详细介绍&#xff1a; 一、核心功能与特点 温度检测与转换 内置带隙温度传感器和 Sigma-Delta 模数转换器&#xff0c;可实现 -55℃ 至 125℃ 温…...

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员打包、部署和运行应用程序。Docker 的基本概念是利用容器来封装应用程序及其所有依赖项&#xff0c;使其能够在任何环境中快速、可靠地运行。 Docker 的优势包括&#xff1a; 轻量级和灵活性&#xff1a;Docker 容…...

如何判断单片机性能极限?

目录 1、CPU 负载 2、内存使用情况 3、实时性能 4、外设带宽 5、功耗与温度 在嵌入式系统设计中&#xff0c;当系统变得复杂、功能增加时&#xff0c;单片机可能会逐渐逼近其性能极限。及时识别这些极限点对于保证产品质量、稳定性和用户体验至关重要。 当你的嵌入式系统…...

LeetCode 2919 使数组变美的最小增量运算数

动态规划解题&#xff1a;最小操作次数使数组变为美丽数组 问题描述 给定一个下标从0开始、长度为n的整数数组nums和一个整数k。你可以对数组中的任意一个元素进行加1操作&#xff0c;操作次数不限。如果数组中任意长度大于或等于3的子数组的最大值都大于或等于k&#xff0c;…...

5.VTK 相机

文章目录 概念示例 概念 在VTK&#xff08;VisualizationToolkit&#xff09;中&#xff0c;相机&#xff08;vtkCamera&#xff09;用于定义场景的观察视角。以下是关于VTK相机的主要概念和设置方法的总结&#xff1a; 相机位置&#xff1a;通过vtkCamera::SetPosition()方法设…...

基于Flask的网络安全渗透知识库系统架构解析

基于Flask的网络安全渗透知识库系统架构解析 一、系统架构概述 本系统采用经典的三层Flask架构设计&#xff0c;通过模块化的方式实现渗透技术知识库的展示与管理。整体架构包含以下核心组件&#xff1a; 路由控制层&#xff1a;app.py作为入口文件模板展示层&#xff1a;Ji…...

Flutter BigInt 是用于处理任意精度整数的特殊数字类型,专为解决超大整数运算需求而设计

在Flutter/Dart中&#xff0c;BigInt 是用于处理任意精度整数的特殊数字类型&#xff0c;专为解决超大整数运算需求而设计。以下是从原理到实践的全面解析&#xff1a; 一、核心特性 特性说明任意精度突破普通int的64位限制&#xff08;-2^63 ~ 2^63-1&#xff09;&#xff0c…...

绿幕抠图直播软件-蓝松抠图插件--使用相机直播,灯光需要怎么打?

使用SONY相机进行绿幕抠图直播时&#xff0c;灯光布置是关键&#xff0c;直接影响抠图效果和直播画质。以下是详细的灯光方案和注意事项&#xff1a; 一、绿幕灯光布置核心原则 均匀照明&#xff1a;绿幕表面光线需均匀&#xff0c;避免阴影和反光&#xff08;亮度差控制在0.5…...

DeepSeek在数据仓库的10大应用场景

一、智能数据集成与清洗 多源数据整合&#xff1a;DeepSeek能够从多种数据源中提取、转换和加载数据&#xff0c;实现跨系统数据的高效整合。 数据清洗与标准化&#xff1a;通过智能算法自动识别并纠正数据中的错误、不一致性和缺失值&#xff0c;提升数据质量。 二、数据仓…...

Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步

一、前言 在实际开发中&#xff0c;我们经常面临以下场景&#xff1a; 系统支持多种登录方式&#xff08;用户名密码、管理员登录、OAuth 登录、短信登录等&#xff09; 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用&#xff0c;而不暴露具体实现 这个…...

算法备案和大模型备案能否同时申请?

最近收到很多小伙伴咨询说“算法备案和大模型备案能不能同时申请&#xff1f;”也有一些小伙伴们还分不清算法备案和大模型备案的区别&#xff0c;纷纷询问做了大模型备案还需要做算法备案吗&#xff1f;今天一篇文章带大家了解一下&#xff0c;算法备案和大模型备案究竟是怎么…...

【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…...

纷析云开源财务软件:助力企业财务管理数字化转型

在当今数字化时代&#xff0c;企业对财务管理工具的需求日益增长&#xff0c;而开源软件以其透明性、灵活性和成本优势成为越来越多企业的选择。纷析云开源财务软件作为一款专注于企业财务数字化的开源解决方案&#xff0c;不仅提供了强大的功能支持&#xff0c;还通过开源生态…...

APang网联科技项目报告(服务器域管理篇)

APang网联科技&#xff1a;连接未来&#xff0c;智能领航 公司简介 APang网联科技成立于 [2005年]&#xff0c;总部位于 [广东深圳]&#xff0c;是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…...

制作Unoconv项目的Docker镜像

制作Unoconv项目的Docker镜像 1 介绍 1.1 Unoconv 在Linux下将Office转换为pdf的很多包仅支持Windows&#xff0c;Unoconv是一个用LibreOffice转化文档的项目&#xff0c;已经归档&#xff08;2025-3-31&#xff09;。迁移后的新版本是unoserver&#xff0c;unoserver不太好…...

神经网络--拓扑排序+思维

1.c<0的点赋0&#xff0c;不然会影响后面的入度 2.最后输出层是出度为0的&#xff0c;且题干要求输出c大于0的 3.有q0的情况&#xff0c;所以输的事后就会有答案 https://www.luogu.com.cn/problem/P1038 #include<bits/stdc.h> #include<string> using nam…...

更强的视觉 AI!更智能的多模态助手!Qwen2.5-VL-32B-Instruct-AWQ 来袭

Qwen2.5-VL-32B-Instruct 是阿里巴巴通义千问团队于 2025 年 3 月 24 日开源的多模态大模型&#xff0c;基于 Apache 2.0 协议发布。该模型在 Qwen2.5-VL 系列的基础上&#xff0c;通过强化学习技术优化&#xff0c;以 32B 参数规模实现了多模态能力的突破。 核心特性升级&…...

逻辑过期怎么设计

设计“逻辑过期”通常用于缓存、令牌管理、数据有效性验证等场景&#xff0c;其核心是通过业务逻辑判断数据是否过期&#xff08;而非单纯依赖物理时间&#xff09;。以下是设计逻辑过期的关键思路和实现方案&#xff1a; 1. 核心思想 物理过期&#xff1a;基于固定的时间&…...

EMIF详解

一、EMIF的基本定义 EMIF&#xff08;External Memory Interface&#xff0c;外部存储器接口&#xff09; 是嵌入式处理器&#xff08;如DSP、FPGA、SoC&#xff09;用于连接外部存储器的专用硬件接口模块&#xff0c;负责管理处理器与存储器之间的地址/数据总线、控制信号及时…...

Kubernetes》》K8S》》Pod调度机制

nodeName 、nodeSelector nodeName 是强绑定&#xff0c;nodeSelector是弱绑定 强绑定&#xff0c;如果Node失效时&#xff0c;则会导致Pod也无法调度 apiVersion: v1 kind: Pod metadata:name: example-pod spec:# nodeName Pod应该被调度到哪个具体的节点上 强绑定nodeNam…...

具身智能机器人学习路线全解析

一、引言 具身智能机器人作为融合了机器人学、人工智能、认知科学等多领域知识的前沿技术&#xff0c;正逐渐改变着我们的生活和工作方式。从工业制造到家庭服务&#xff0c;从医疗护理到太空探索&#xff0c;具身智能机器人都展现出了巨大的潜力。对于想要深入了解和学习这一…...

【PGCCC】Postgres MVCC 内部:更新与插入的隐性成本

为什么 Postgres 中的更新操作有时感觉比插入操作慢&#xff1f;答案在于 Postgres 如何在后台管理数据版本。 Postgres 高效处理并发事务能力的核心是多版本并发控制&#xff08;MVCC&#xff09;。 在本文中&#xff0c;我将探讨 MVCC 在 Postgres 中的工作原理以及它如何影响…...

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)

目录 ESP-ADF外设子系统深度解析&#xff1a;esp_peripherals组件架构与核心设计&#xff08;输入类外设之触摸屏 Touch&#xff09;简介模块概述功能定义架构位置核心特性 触摸(Touch)外设触摸外设概述触摸外设API和数据结构外设层API&#xff08;periph_touch.h/periph_touch…...

Python高级爬虫之JS逆向+安卓逆向1.5节: 控制结构

目录 引言&#xff1a; 1.5.1 Python中的控制结构 1.5.2 条件控制 1.5.3 循环控制 1.5.4 跳转控制 1.5.5 爬虫不要接学生单 引言&#xff1a; 大神薯条老师的高级爬虫安卓逆向教程&#xff1a; 这套爬虫教程会系统讲解爬虫的初级&#xff0c;中级&#xff0c;高级知识&a…...

Spine-Leaf 与 传统三层架构:全面对比与解析

本文将详细介绍Spine-Leaf架构&#xff0c;深入对比传统三层架构&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探讨其与Full-mesh网络和软件定义网络&#xff08;SDN&#xff09;的关联。通过通俗易懂的示例和数据中心网络分析&#xff0c;我将帮助您理解Spine-L…...

微信小程序文字混合、填充动画有效果图

效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…...

山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到

在开发中医知识问答历史对话查看功能的时候&#xff0c;出现了前后端信息获取异同的问题&#xff0c;在经过非常非常非常艰难的查询之后终于解决了这一问题&#xff0c;而这一问题的罪魁祸首就是后端没有setter和getter方法&#xff01;&#xff01;&#xff01;&#xff01;&a…...

HttpSessionBindingListener 的用法笔记250417

HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口&#xff0c; 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口&#xff0c;用于监听该对象被绑定…...

EuroCropsML:首个面向少样本时间序列作物分类的多国基准数据集

2025-04-15&#xff0c;由慕尼黑工业大学等机构创建的 EuroCropsML 数据集&#xff0c;这是一个结合了农民报告的作物数据与 Sentinel-2 卫星观测的时间序列数据集&#xff0c;覆盖了爱沙尼亚、拉脱维亚和葡萄牙。该数据集为解决遥感应用中作物类型数据空间不平衡问题提供了新的…...

《如何用 Function 实现动态配置驱动的处理器注册机制?》

大家好呀&#xff01;&#x1f44b; 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上&#xff1f;别担心&#xff0c;我会用最简单的方式讲清楚&#xff01;&#x1f60a; 一、为什么要用Function实现处理器…...

PyTorch:学习 CIFAR-10 分类

&#x1f50d; 开始你的图像分类之旅&#xff1a;一步一步学习 CIFAR-10 分类 图像分类是计算机视觉中最基础的任务之一&#xff0c;如果你是初学者&#xff0c;那么以 CIFAR-10 为训练场是一个不错的选择。本文一步一步带你从零开始&#xff0c;学习如何用深度学习模型实现图…...

SpringBoot整合Thymeleaf模板:构建现代化Web视图层的完整指南

在Java Web开发领域&#xff0c;Thymeleaf作为一款自然模板引擎&#xff0c;凭借其优雅的语法和与Spring生态的无缝集成&#xff0c;已成为替代传统JSP的首选方案。本文将从技术整合、核心原理到生产实践&#xff0c;深度解析SpringBoot与Thymeleaf的协同工作方式。 一、Thymel…...

学习笔记十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同学点进来!

&#x1f9e0; Rust 柯里化从零讲透&#xff1a;看不懂 fn add(x) -> impl Fn(y) 的同学点进来&#xff01; &#x1f354; 一、什么是柯里化&#xff1f;先用一个超好懂的生活比喻 假设你在点一个汉堡&#xff1a; 你说&#xff1a;我要点一个鸡腿汉堡&#xff01; 店员…...

软件安装包-yum

yum&#xff1a;软件管理的得力助手​ yum是一个软件下载安装管理的一个客户端&#xff0c;例如&#xff1a;小米应用商城、华为应用商城... Linux中软件包可能有依赖关系——yum会帮我们解决依赖关系的问题&#xff01; 1、软件包是什么&#xff1f; 在Linux下安装软件, 一个通…...

C++面试

C面试 c面试100题 1、封装多态继承 2、数据集合 3、 4、便于外部文件访问 5、只能通过对象访问 6、通过类名 7、构造函数、析构函数、拷贝构造函数、拷贝复制函数 8、将一个对象复制给新建的对象 9、没有返回值 10、类的对象中有指针&#xff0c;防止多个指针指向同…...

Java SpringBoot设置自定义web的图片本地路径

一&#xff0c;设置配置文件&#xff1a;application.properties my.config.image-pathD:\\Download\\images二&#xff0c;新增配置类&#xff1a;MyImagesConfig import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springfr…...

Python HTTP库——requests

文章目录 简介安装基本概念RESTfulAPIOAuth2.0Cookie和Session 初试GET请求POST请求PUT请求DELETE请求HEAD请求OPTIONS请求传递查询参数响应内容自定义响应头传递表单参数传递文件响应状态码响应头Cookies重定向和历史记录超时错误和异常Session对象请求和响应对象预处理请求SS…...

用idea配置springboot+mybatis连接postersql数据库

从socket开始&#xff0c;我们就要开始部署前后端的交互了&#xff0c;所以今天带来一份热度比较高的框架springboot&#xff0c;并教大家如何连接数据库。 框架 先给大家看一下目录结构&#xff0c;因为有些需要调用文件路径&#xff1a; 创建项目&#xff1a; 新版本可以…...

【补充篇】Davinci工具要求的dbc格式

1 简介 DBC文件是一种用于描述CAN(Controller Area Network,控制器局域网络)通信协议中报文和信号的格式化文件,其全称为“Database CAN”。DBC文件的核心作用是定义和解析CAN网络中的通信数据,包括节点、报文、信号及其属性等信息。 对于不同角色的工程师,DBC文件有着…...

IT资产管理(一)之GLPI安装及部署

一、GLPI 介绍 GLPI:Gestionnaire Libre de Parc Informatique 是一个免费的资产和 IT 管理软件包,提供 ITIL 服务台功能、许可证跟踪和软件审计。 GLPI 的主要功能: 服务资产和配置管理 (SACM):管理您的 IT 资产和配置,跟踪计算机、外围设备、网络打印机及其相关组件…...

RPCRT4!OSF_CCALL::ActivateCall函数分析之RPCRT4!OSF_CCALL结构中的Bindings--RPC源代码分析

第一部分&#xff1a; 1: kd> t RPCRT4!OSF_CCALL::ActivateCall: 001b:77bf5789 55 push ebp 1: kd> kc # 00 RPCRT4!OSF_CCALL::ActivateCall 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OS…...

docker登录AWS ECR拉取镜像

1、配置AWS 登录key [rootip-172-31-13-6 ~]# aws configure AWS Access Key ID [None]: XXXXXXXXXXX AWS Secret Access Key [None]: %%YYYDSRGTHFGFSGRTHTHE$RHTSG Default region name [None]: ap-southeast-1 Default output format [None]: json2、登录AWS ECR镜像仓库 …...