【LLM大模型技术专题】「入门到精通系列教程」基于MCP协议实现集成AI服务开发实战指南(上)

536 阅读11分钟

MCP协议

在这里插入图片描述

MCP的资料

以下是本文学习和参考的官方资料和学习权威网站,大家可以多学习和了解一下:

鼓励大家去学习和了解这些资源。这些资料和网站可能与特定的主题或领域相关,进一步深入学习。

MCP的由来

MCP 起源于2024 年 11 月 25 日 Anthropic 发布的一篇名为《Introducing the Model Context Protocol》的文章。

MCP的定义

MCP(即模型上下文协议,Model Context Protocol)是一个开放协议,【明确了】应用程序与AI模型之间交换上下文信息的具体方式,并且【规范了】应用程序如何向大型语言模型(LLM)提供上下文,提供了一种统一的方式将AI模型连接到不同的数据源和工具,它定义了统一的集成方式。

MCP的架构

MCP遵循客户端-服务器架构,其中宿主应用程序可以连接到多个服务器。 在这里插入图片描述

MCP架构组成成员

  • MCP主机:像Claude Desktop、集成开发环境(IDE)或人工智能工具等希望通过MCP访问数据的程序。
  • MCP客户端:与服务器保持1:1连接的协议客户端,简单理解就是一个客户端,调用MCP服务器用的。
  • MCP服务器:轻量级程序,每个程序都通过标准化的模型上下文协议公开特定功能。
  • 本地数据源:计算机上的文件、数据库以及MCP服务器可以安全访问的服务。
  • 远程服务:通过互联网使用的外部系统(例如,通过 API),MCP服务器可以连接到这些系统。

MCP大致运行流程

在这里插入图片描述

MCP的好处

MCP可帮助你在大型语言模型之上构建代理和复杂工作流。大型语言模型经常需要与数据和工具集成,而 MCP 提供

  • 不断增加的预构建集成,你的大语言模型可以直接接入
  • 在语言模型服务提供商和供应商之间切换的灵活性
  • 在基础设施内保护数据的最佳实践

有了MCP,在开发智能体(Agent)的过程中,我们经常需要将智能体与数据和工具集成,MCP以标准的方式规范了智能体与数据及工具的集成方式,可以帮助您在LLM之上构建智能体(Agent)和复杂的工作流。

比如,通过MCPAI模型可以操作电脑读写文件,或者模拟浏览器操作等。

总的来说,MCP就像是一个桥梁,让AI模型与外部世界更好地连接起来,从而发挥出更大的价值和潜力


MCP的JavaSDK

MCP-JavaSDK 提供了模型上下文协议的 Java 实现,能够通过同步和异步的通信模式实现与人工智能模型和工具的标准化交互。Java MCP的实现遵循三层架构: 在这里插入图片描述

  • MCPClient(客户端/服务器层):McpClient处理客户端操作,而McpServer管理服务器端协议操作。两者都利用 McpSession 进行通信管理。
  • 会话层(McpSession):通过DefaultMcpSession 实现来管理通信模式和状态
  • 传输层(McpTransport):处理 JSON-RPC 消息的序列化和反序列化,并支持多种传输实现

MCP客户端

MCP客户端是模型上下文协议(MCP)架构中的关键组件,负责建立和管理与MCP服务器的连接。它实现了协议的客户端部分,如下图所示: 在这里插入图片描述

MCP服务端

MCP 服务器是模型上下文协议(MCP)架构中的基础组件,它为客户端提供工具、资源和功能。它实现了协议的服务器端,负责: 在这里插入图片描述


SpringAI-MCP集成

Spring AI MCP 是通过与 Spring Boot 集成来扩展 MCP Java SDK 的,它提供了客户端和服务器的启动器。使用 Spring Initializer 可以启动具有 MCP 支持的人工智能应用程序

通过Spring Boot Starters提供MCP集成

将MCP包装成了2个starterMCP ClientMCP Server提供相对应的Spring Boot starter来非常方便的进行MCP的集成

MCP服务端Starter

Spring AI MCP(Model Context Protocol)服务器启动器为在 Spring Boot 应用程序中设置 MCP 服务器提供自动配置。它使得 MCP 服务器功能与 Spring Boot 的自动配置系统能够无缝集成。

MCP服务器启动器提供

在这里插入图片描述

传输模式选项

MCP 服务器支持三种传输机制,每种机制都有其专用的启动器: 在这里插入图片描述

标准 MCP 服务器(spring-ai-starter-mcp-server)

核心server,基于标准输入输出(STDIO)传输支持,适用于命令行和桌面工具,无需额外的网络依赖项。

maven库配置:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>

启动器激活McpServerAutoConfiguration自动配置,该配置负责:

  • 配置基本服务器组件。
  • 处理工具、资源和提示规范。
  • 管理服务器功能和变更通知。
  • 提供同步和异步服务器实现。
标准输入输出服务器Yml配置

标准 STDIO 服务器配置 YAML

# Using spring-ai-starter-mcp-server
spring:
  ai:
    mcp:
      server:
        name: stdio-mcp-server
        version: 1.0.0
        type: SYNC
WebMVC SSE 传输MCP服务器(spring-ai-starter-mcp-server-webmvc)

基于Spring MVC的SSE传输实现,全 MCP 服务器功能支持基于 Spring MVC 的 SSE(服务器发送事件)服务器传输以及可选的 STDIO 传输。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>

启动器激活 McpWebMvcServerAutoConfigurationMcpServerAutoConfiguration 自动配置以提供:

  • 基于 HTTP 的传输,使用Spring MVC(WebMvcSseServerTransportProvider)。
  • 自动配置的服务器发送事件(SSE)端点。
  • 可选的标准输入/输出传输(通过设置 spring.ai.mcp.server.stdio=true 启用)。
  • 引入了 spring-boot-starter-web 和 mcp-spring-webmvc 依赖项。
WebMVC 服务器配置 YAML
# Using spring-ai-starter-mcp-server-webmvc
spring:
  ai:
    mcp:
      server:
        name: webmvc-mcp-server
        version: 1.0.0
        type: SYNC
        sse-message-endpoint: /mcp/messages
WebFlux SSE 传输MCP服务器(spring-ai-starter-mcp-server-webflux)

全 MCP 服务器功能支持基于Spring WebFlux 的 SSE(服务器发送事件)服务器传输以及可选的标准输入输出传输。

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

启动器激活 McpWebFluxServerAutoConfiguration McpServerAutoConfiguration 自动配置以提供:

  • 使用 Spring WebFlux(WebFluxSseServerTransportProvider)进行反应式传输。
  • 自动配置的响应式服务器发送事件(Server-Sent Events,SSE)端点。
  • 可选的标准输入/输出传输(通过设置 spring.ai.mcp.server.stdio=true 启用)。
  • 引入了 spring-boot-starter-webflux 和 mcp-spring-webflux 依赖项。
WebMVC 服务器配置 YAML
# Using spring-ai-starter-mcp-server-webflux
spring:
  ai:
    mcp:
      server:
        name: webflux-mcp-server
        version: 1.0.0
        type: ASYNC  # Recommended for reactive applications
        sse-message-endpoint: /mcp/messages
配置属性

所有属性都以 spring.ai.mcp.server 为前缀:

spring:
  ai:
   mcp:
    server:
      enabled: true # 启用 / 禁用 MCP 服务器
      stdio: false # 启用/禁用标准输入输出传输
      name: mcp-server # 用于识别的服务器名称
      version: 1.0.0 # 服务版本
      type: SYNC/ASYNC # 服务器类型(同步/异步)
      resource-change-notification: true  # 启用资源更改通知
	  prompt-change-notification: true # 启用资源更改通知
	  tool-change-notification: true # 启用工具更改通知
	  tool-response-mime-type: image/png  # (可选)每个工具名称对应的响应 MIME 类型。例如,spring.ai.mcp.server.tool-response-mime-type.generateImage=image/png 将把 image/png MIME 类型与 generateImage()工具名称相关联。
	  sse-message-endpoint: /mcp/message # 客户端用于发送消息的 Web 传输自定义服务器发送事件(SSE)消息端点路径。
	  sse-endpoint: /sse # 自定义服务器发送事件(SSE)的 Web 传输端点路径
	  base-url: /api/v1 # 可选的 URL 前缀。例如,基础 URL = /api/v1 意味着客户端应在 /api/v1 + sse 端点访问服务器发送事件(SSE)端点,消息端点是 /api/v1 + sse 消息端点。

同步 / 异步服务器类型

同步服务器

默认的服务器类型,使用 McpSyncServer 实现

专为应用程序中的直接请求-响应模式而设计。要启用此服务器类型,请在配置中设置spring.ai.mcp.server.type=SYNC。当激活时,它会自动处理同步工具规范的配置。

异步服务器

异步服务器实现使用 McpAsyncServer,并针对非阻塞操作进行了优化。要启用此服务器类型,请将应用程序配置为 spring.ai.mcp.server.type=ASYNC。此服务器类型会自动设置带有内置 Project Reactor 支持的异步工具规范。

创建一个SpringBoot的MCP Server应用

MCP服务器启动器允许服务器向客户端公开工具、资源和提示。它会根据服务器类型自动将注册为 Spring Bean 的自定义功能处理程序转换为同步/异步规范。

@Service
public class WeatherService {
    @Tool(description = "基于标准输入输出的进程间通信传输方式")
    public String getWeather(String cityName) {
        return "小雨"
    }
}

把 ToolCallbackProvider 实例注册为 Spring Bean,并且该实例和 WeatherService 相关联。在 Spring 应用程序的其他地方,能够通过依赖注入的方式获取这个 ToolCallbackProvider Bean,进而使用它提供的回调功能,这些功能可能和天气服务相关。

@SpringBootApplication
public class McpServerApplication {
    private static final Logger logger = LoggerFactory.getLogger(McpServerApplication.class);
    public static void main(String[] args) {
        SpringApplication.run(McpServerApplication.class, args);
    }
	@Bean
	public ToolCallbackProvider weatherTools(WeatherService weatherService) {
		return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
	}
}

自动配置将自动把工具回调注册为 MCP 工具。你可以有多个生成ToolCallbackProvider的bean。自动配置会将它们合并。


MCP客户端Starter

Spring AI 模型上下文协议(Model Context Protocol,MCP)客户端引导启动器为 Spring Boot 应用程序中的 MCP 客户端功能提供自动配置。它支持具有各种传输选项的同步和异步客户端实现。

标准MCP客户端

核心starter,提供基于标准输入输出(STDIO)和基于HTTP的服务器发送事件(SSE)

标准启动器通过标准输入输出(进程内)和/或服务器发送事件(远程)传输同时连接到一个或多个MCP服务器,服务器发送事件连接使用基于HttpClient的传输实现,与MCP服务器的每次连接都会创建一个新的MCP客户端实例。

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

可以选择同步或异步 MCP 客户端(注意:不能混合使用同步和异步客户端)。对于生产部署,我们建议使用基于 WebFlux 的服务器发送事件连接和 spring-ai-starter-mcp-client-webflux

WebFlux 客户端

基于WebFlux 的服务器发送事件(SSE)传输实现

WebFlux启动器提供与标准启动器类似的功能,但使用基于WebFlux的服务器发送事件(SSE)传输实现。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
配置属性

常见属性以spring.ai.mcp.client为前缀:

spring:
 ai: 
  mcp:
   client:
    enabled: true # 启用 / 禁用 MCP 客户端
	name: spring-ai-mcp-client  # MCP 客户端实例名称(用于兼容性检查)
	version: 1.0.0 # MCP 客户端实例的版本
	initialized: true # 是否在创建时初始化客户端
	request-timeout: 20s # MCP 客户端请求的超时持续时间
	type: SYNC # MCP 客户端请求的超时持续时间
	root-change-notification: true  # 启用/禁用所有客户端的根更改通知
	toolcallback.enabled: false   # 启用/禁用 MCP 工具回调与 Spring AI 的工具执行框架的集成。
标准输入输出传输属性

标准输入 / 输出传输的属性以spring.ai.mcp.client.stdio为前缀。

spring:
  ai:
    mcp:
      client:
        stdio:
          servers-configuration: classpath:mcp-servers.json   # 包含MCP服务器配置的资源,以JSON格式呈现。  
          root-change-notification: true
          connections:  # 命名的标准输入 / 输出连接配置映射
            server1:
              command: /path/to/server
              args: # 命令参数列表
                - --port=8080
                - --mode=production
              env: # 服务器进程的环境变量映射
                API_KEY: your-api-key
                DEBUG: "true"
服务器发送事件(Server-Sent Events,SSE)传输属性

服务器发送事件(SSE)传输的属性以 spring.ai.mcp.client.sse 为前缀:

spring:
  ai:
    mcp:
      client:
        sse:
          connections: # 命名的服务器发送事件(SSE)连接配置映射
            server1: 
              url: http://localhost:8080 # 命名的服务器发送事件(SSE)连接配置映射
            server2:
              url: http://otherserver:8081 # 命名的服务器发送事件(SSE)连接配置映射
定义对应的chatClient调用服务

服务启动之后,会自动调用CommandLineRunner对象的方法,同时注入对应的ToolCallbackProvider,属于Server方的对象,进行执行对应的chatClient.prompt(userInput).call().content()),得到结果。

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	@Value("${ai.user.input}")
	private String userInput;
	@Bean
	public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools,
			ConfigurableApplicationContext context) {
		return args -> {
			var chatClient = chatClientBuilder
					.defaultTools(tools)
					.build();
			System.out.println("\n>>> QUESTION: " + userInput);
			System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());
			context.close();
		};
	}
}

运行服务

java -Dai.user.input='今天天气如何?' -jar target/mcp-starter-default-client-0.0.1-SNAPSHOT.jar

有了 MCP 协议,任何大模型都可以调用实现了 MCP Server 的服务,从而无限扩充大模型的能力,并且为 AI 的发展提供了标准协议和便利对接