AI06——MCP 协议
MCP(Model Context Protocol,模型上下文协议)是一种开放标准,目的是增强 AI 与外部系统的交互能力。MCP 为 AI 提供了与外部工具交互的标准化方式,让 AI 能够访问最新数据、执行复杂操作,并与现有系统集成。MCP 是一种开放协议,它标准化了应用程序如何向大模型提供上下文的方式。可以将 MCP 想象成 AI 应用的 USB 接口,提供了标准化方式一样(类似于转接器),
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 核心概念
-
Resources 资源:让服务端向客户端提供各种数据,,客户端可以决定什么时候使用这些资源。使 AI 能够访问最新信息和外部知识,为模型提供更丰富的上下文。
-
Prompts 提示词:服务端可以定义可复用的提示词模板和工作流,供客户端和用户直接使用。它的作用是标准化常见的 AI 交互模式,从而简化用户与 LLM 的交互过程。
-
Tools 工具:MCP 中最实用的特性,服务端可以提供给客户端可调用的函数,使 AI 模型能够执行计算、查询信息或者和外部系统交互,极大扩展了 AI 的能力范围。
-
Sampling 采样:允许服务端通过客户端向大模型发送生成内容的请求(反向请求)。使 MCP 服务能够实现复杂的智能代理行为,同时保持用户对整个过程的控制和数据隐私保护。
-
Roots 根目录:MCP 协议的安全机制,定义了服务器可以访问的文件系统位置,限制访问范围,为 MCP 服务提供安全边界,防止恶意文件访问。
-
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.so:较为主流,提供丰富的 MCP 服务目录
-
GitHub Awesome MCP Servers:开源 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 服务的配置(尤其是 command
和 args
)没有统一的标准格式。因此:使用第三方 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ㄒ)/
更多推荐
所有评论(0)