MCP(Model Context Protocol,模型上下文协议)是一种开放标准,目的是增强 AI 与外部系统的交互能力。MCP 为 AI 提供了与外部工具交互的标准化方式,让 AI 能够访问最新数据、执行复杂操作,并与现有系统集成。

MCP 是一种开放协议,它标准化了应用程序如何向大模型提供上下文的方式。可以将 MCP 想象成 AI 应用的 USB 接口,提供了标准化方式一样(类似于转接器),MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方法。

MCP 它是个 协议 或者 标准,它本身并不提供什么服务,只是定义好了一套规范,让服务提供者和服务使用者去遵守。就像 HTTP 协议一样,现在前端向后端发送请求基本都是用 HTTP 协议,什么 get / post 请求类别、什么 401、404 状态码,这些标准能降低开发者的理解成本

MCP 调用的本质就是类似工具调用,并不是让 AI 服务器主动去调用 MCP 服务,而是告诉 AI “MCP 服务提供了哪些工具”,如果 AI 想要使用这些工具完成任务,就会告诉我们的后端程序,后端程序在执行工具后将结果返回给 AI,最后由 AI 总结并回复

对于同一种工具,例如查询地图,每个人开发的质量和效果会有差别。而如果官方把查询地图的能力直接做成一个服务,谁要用谁接入,就省去了开发成本、并且效果一致

MCP 核心概念

  1. Resources 资源:让服务端向客户端提供各种数据,,客户端可以决定什么时候使用这些资源。使 AI 能够访问最新信息和外部知识,为模型提供更丰富的上下文。

  2. Prompts 提示词:服务端可以定义可复用的提示词模板和工作流,供客户端和用户直接使用。它的作用是标准化常见的 AI 交互模式,从而简化用户与 LLM 的交互过程。

  3. Tools 工具:MCP 中最实用的特性,服务端可以提供给客户端可调用的函数,使 AI 模型能够执行计算、查询信息或者和外部系统交互,极大扩展了 AI 的能力范围。

  4. Sampling 采样:允许服务端通过客户端向大模型发送生成内容的请求(反向请求)。使 MCP 服务能够实现复杂的智能代理行为,同时保持用户对整个过程的控制和数据隐私保护。

  5. Roots 根目录:MCP 协议的安全机制,定义了服务器可以访问的文件系统位置,限制访问范围,为 MCP 服务提供安全边界,防止恶意文件访问。

  6. Transports 传输:定义客户端和服务器间的通信方式,包括 Stdio(本地进程间通信)和 SSE(网络实时通信),确保不同环境下的可靠信息交换。

Tools 工具是MCP中的重点,我们优先关注该内容

MCP的开发建议

1.MCP其本质就是工具调用,只不过统一了标准、更容易共享而已。如果我们开发一些不需要共享的工具,没必要用 MCP,可以节约开发和部署成本。MCP 能不用就不用,先开发工具调用,之后需要提供 MCP 服务时再将工具调用转换成 MCP 服务即可。Spring AI 提供了一系列 辅助 MCP 开发的工具类,用于 MCP 和 ToolCallback 之间的互相转换。

2.Stdio 模式,无需网络传输,安全性和性能都更高,更适合小型项目。SSE 模式适合作为独立服务部署,可以被多客户端共享调用,更适合模块化的中大型项目团队。

3.MCP 服务端要防止单次执行时间过长,可以采用异步模式来处理耗时操作,或者设置超时时间。客户端也要合理设置超时时间,防止因为 MCP 调用时间过长而导致 AI 应用阻塞。

MCP 架构

宏观架构——客户端 - 服务器 架构

MCP 的核心是 “客户端 - 服务器” 架构

SDK 3 层架构

  • 客户端 / 服务器层:McpClient 处理客户端操作,而 McpServer 管理服务器端协议操作。两者都使用 McpSession 进行通信管理。

  • 会话层(McpSession):通过 DefaultMcpSession 实现管理通信模式和状态。

  • 传输层(McpTransport):处理 JSON-RPC 消息序列化和反序列化,支持多种传输实现,比如 Stdio 标准 IO 流传输和 HTTP SSE 远程传输。

客户端和服务端需要先经过下面的流程建立连接,之后才能正常交换消息:

MCP 客户端和服务端

MCP 客户端——MCP Client ,主要负责和 MCP 服务器建立连接并进行通信。

MCP 服务端——MCP Server ,主要用来为客户端提供各种工具、资源和功能支持。

它们提供了多种数据传输方式,包括:

Stdio 标准输入 / 输出:适用于本地调用

SSE 传输:适用于远程调用

使用 MCP

1,云平台使用 MCP

2,软件客户端使用 MCP

3,程序中使用 MCP

无论是哪种使用方式,原理都是类似的,而且有 2 种可选的使用模式:本地下载 MCP 服务端代码并运行(类似引入了一个 SDK),或者 直接使用已部署的 MCP 服务(类似调用了别人的 API)。

MCP 服务大全

目前已经有很多 MCP 服务市场,开发者可以在这些平台上找到各种现成的 MCP 服务:

其中,绝大多数 MCP 服务市场仅提供本地下载 MCP 服务端代码并运行的使用方式,毕竟部署 MCP 服务也是需要成本的。   

程序中使用 MCP——Spring AI MCP 开发模式

MCP 客户端开发

客户端开发主要基于 Spring AI MCP Client Boot Starter

引入依赖

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

配置连接

引入依赖后,需要配置与服务器的连接,Spring AI 支持两种配置方式:

1)直接写入配置文件,这种方式同时支持 stdio 和 SSE 连接方式。

 #基础配置
 spring:
   ai:
     mcp:
       client:
          enabled: true  # 是否启用MCP客户端,true表示启用,false表示禁用
            
          #SSE远程连接配置  
            sse:
               connections:
                 server1:
                   url: http://localhost:8080 ## SSE服务端的地址,客户端将通过此地址建立连接
               
           #本地连接配置    
             stdio:
               connections:# # 可配置多个stdio连接(此处配置了名为server1的连接)
                 server1:
                   command: /path/to/server # 启动本地服务进程的命令路径
                   args: # 启动命令的参数列表
                     - --port=8080
                   env: # 进程的环境变量配置
                     API_KEY: your-api-key

更多配置属性可参考 官方文档

2)引用 Claude Desktop 格式 的 JSON 文件,目前仅支持 stdio 连接方式。

 spring:
   ai:
     mcp:
       client:
         stdio:
           servers-configuration: classpath:mcp-servers.json

在 resources 目录下新建 mcp-servers.json 配置,定义需要用到的 MCP 服务:(这些配置在对应的MCP服务的平台上都可以找到,不同的MCP服务对应的配置也不同)

MCP 服务的配置(尤其是 commandargs)没有统一的标准格式。因此:使用第三方 MCP 服务必须参考该服务的官方文档或示例,按照其要求配置启动命令。

例如:高德地图的MCP格式如下

 {
   "mcpServers": {
     "amap-maps": {
       "command": "npx.cmd,",
       "args": [
         "-y",
         "@amap/amap-maps-mcp-server"
       ],
       "env": {
         "AMAP_MAPS_API_KEY": "改成你的 API Key"
       }
     }
   }
 }

💡在 Windows 环境下,命令配置需要添加 .cmd 后缀(如 npx.cmd),否则会报找不到命令的错误。

如果是自己用代码编写的 MCP 服务,启动命令取决于你选择的开发语言:Java 开发的 MCP 服务(最常见,如基于 Spring Boot): 启动命令一定是 java,参数包含 -jar 和编译后的 JAR 包路径,例如:

 {
   "command": "java",
   "args": ["-jar", "你的服务.jar", "其他参数"]
 }

例如:

 {
   "mcpServers": {
     "yu-image-search-mcp-server": {
       "command": "java",
       "args": [
         "-Dspring.ai.mcp.server.stdio=true",
         "-Dspring.main.web-application-type=none",
         "-Dlogging.pattern.console=",
         "-jar",
         "yu-image-search-mcp-server/target/yu-image-search-mcp-server-0.0.1-SNAPSHOT.jar"
       ],
       "env": {}
     }
   }
 }

MCP 服务端开发

服务端开发主要基于 Spring AI MCP Server Boot Starter,能够自动配置 MCP 服务端组件,使开发者能够轻松创建 MCP 服务,向 AI 客户端提供工具、资源和提示词模板,从而扩展 AI 模型的能力范围。

引入依赖

Spring AI 提供了 3 种 MCP 服务端 SDK,可以根据需要选择对应的依赖包:

  • spring-ai-starter-mcp-server:提供 stdio 传输支持,不需要额外的 web 依赖

  • spring-ai-starter-mcp-server-webmvc:提供基于 Spring MVC 的 SSE 传输和可选的 stdio 传输(一般建议引入这个)

  • spring-ai-starter-mcp-server-webflux:提供基于 Spring WebFlux 的响应式 SSE 传输和可选的 stdio 传输

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

引入这个依赖后,会自动注册 SSE 端点,供客户端调用。包括消息和 SSE 传输端点:

配置服务

如果要开发 SSE 服务,配置如下

 spring:
   ai:
     mcp: 
       server:
         name: yu-image-search-mcp-server  # 服务名称(唯一标识)
         version: 0.0.1
         type: SYNC                        # 通信模式:同步
         stdio: false                      # 关闭 stdio 传输模式(核心开关),启用 SSE 模式(基于 HTTP 的服务端推送)
          

开发 stdio 服务,配置如下:

 spring:
   ai:
     mcp:
       server:
         name: yu-image-search-mcp-server  # 服务名称(唯一标识)
         version: 0.0.1                    # 服务版本
         type: SYNC                        # 同步通信模式
         stdio: true                       # 开启 stdio 传输(核心开关)
   main:
     web-application-type: none  # 关闭 Web 服务(无需监听 HTTP 端口)
     banner-mode: off            # 关闭启动日志横幅(简化输出)

开发服务

无论采用哪种传输方式,开发 MCP 服务的过程都是类似的,跟开发工具调用一样,直接使用 @Tool 注解标记服务类中的方法。

 @Service//标记该层为业务处理逻辑层,生成的对象会被放入 Spring 的 IoC 容器中管理
 ​
 public class WeatherService {
     @Tool(description = "获取指定城市的天气信息")
     public String getWeather(
             @ToolParameter(description = "城市名称,如北京、上海") String cityName) {
         // 实现天气查询逻辑
         return "城市" + cityName + "的天气是晴天,温度22°C";
     }
 }

然后在 Spring Boot 项目的主类中——定义 ToolCallbackProvider Bean 来注册工具:

 @SpringBootApplication
 public class McpServerApplication {
 ​
     public static void main(String[] args) {
         SpringApplication.run(YuImageSearchMcpServerApplication.class, args);
     }
     
     
 //然后在 Spring Boot 项目启动时注册一个ToolCallbackProvider的 Bean 容器
     @Bean
     public ToolCallbackProvider imageSearchTools(WeatherService WeatherService) {
         return MethodToolCallbackProvider.builder()
                 .toolObjects(WeatherService)//传入要注册的工具,最好每个不同类型的工具单独开一个mcp服务,保证每个工具的职责单一
                 .build();
     }
 }

使用开发的MCP

在代码中,新增一个利用 MCP 完成对话的方法。通过注入的 ToolCallbackProvider 获取到配置中定义的 MCP 服务提供的 所有工具,并提供给 ChatClient。

 @Resource
 private ToolCallbackProvider toolCallbackProvider; //`ToolCallbackProvider` 是 Spring AI 中用于管理工具调用的接口
 ​
 public String doChatWithMcp(String message, String chatId) {
     ChatResponse response = chatClient
             .prompt()
             .user(message)
             .tools(toolCallbackProvider)
             .call()
             .chatResponse();
             
     String content = response.getResult().getOutput().getText();
     return content;
 }

MCP 部署方案

本地部署

适用于 stdio 传输方式。跟我们开发 MCP 的流程一致,只需要把 MCP Server 的代码打包(比如 jar 包),然后上传到 MCP Client 可访问到的路径下,通过编写对应的 MCP 配置即可启动。

缺点:每个 MCP 服务都要单独部署(放到服务器上),如果 MCP 服务多了,会让人很崩溃。

远程部署

适用于 SSE 传输方式。

//TODD,这个一块还没有研究过,以后了解了再给大家补充/(ㄒoㄒ)/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐