AI应用开发的高级特性——MCP模型上下文协议,打通AI与外部服务的边界。
**************************************************************************************************************
一、需求分析
当你的AI具备了RAG的能力,具备了调用工具的能力,我想在上海找一家特别小资的约会圣地?
1、直接利用AI大模型自身的能力:大模型本身就有一定的训练知识,可以识别出位置信息和地点,但不够准确详尽。
2、利用RAG知识库:把约会地点整理成知识库,让AI利用他来回答,但是需要人工提供足够的信息。
3、利用工具调用:开发一个根据位置查询附近店铺的工具,可以利用第三方地图API(比如高德),这样得到的信息更准确。
如上我们肯定会选择第3种方式来实现。既然选择调用第三方API,更实用轻松便捷的就是MCP协议。
二、MCP
什么是MCP
MC(Model Context Protocol,模型上下文协议)是一种开放标准,目的是增强AI与外部系统的交互能力。MCP为AI提供了与外部工具、资源和服务交互的标准化方式,让AI能够访问最新数据、执行复杂操作,并与现有系统集成。
根据MCP官方定义,MCP是一种开放协议,标准化了应用程序如何向大模型提供上下文的方式。可以将MCP想象成AI应用的USB接口。就像USB为设备连接各种设备提供了标准化方式一样,MCP为AI模型连接不同的数据源和工具提供了标准化方法。
🙋♀️🌰
方便理解MCP的作用:首先是增强AI的能力,通过MCP协议,AI应用可以轻松接入提供的服务来实现更多功能。比如搜索网页,调用第三方、执行计算得等。
其次,MCP是个协议或者标准,本身不具备提供服务的能力,只是定义好了一套规范,让服务者和服务使用者去遵守。就像HTTP协议一样,现在前后端发送请求基本都是用HTTP协议,像get/post请求类别,401、404状态码,这些标准能有效降低开发者的理解成本。
此外,标准化还有其他好处。官方把查询地图的能力直接做成一个服务,谁要用谁就接入,就省去了开发成本,如果大家陆续开放自己的服务,不就相当于打造了一个服务市场。
标准可以打造生态。就像前端NPM包、后端maven仓库,Docker镜像源。或者安卓市场、App Store。
MCP三大作用:
- 轻松增强AI能力
- 统一标准,降低使用和理解成本
- 打造服务生态
MCP架构
1、宏观架构
MCP核心是“客户端 - 服务器”架构,其中MCP客户端主机可以链接到多个服务器。客户端主机是指希望访问MCP服务的程序,比如Claude Desktop、IDE、AI工具或部署在服务器上的项目。
2、SDK 3层架构
如果要在程序中使用MCP或者开发MCP服务,可以引入MCP官方的SDK,比如Java SDK。
官方文档了解MCP SDK的架构,主要分3层:
分别来看每一层的作用:
- 客户端/服务器层:McpClient处理客户端操作,而McpServer管理服务器端协议操作。两者都使用McpSession进行通信管理。
- 会话层(McpSession):通过DefaultMcpSession实现管理通信模式和状态。
- 传输层(McpTransport):处理JSON-RPC消息序列化和反序列化,支持多种传输实现,比如Stdio标准IO流传输和HTTPSSE远程传输。
客户端和服务端需要先经过流程建立链接,之后才能正常交换信息:
3、MCP 客户端
MCP Client是MCP架构中的关键组件,主要负责和MCP服务器建立连接并进行通信。他能自动匹配服务器的协议版本,确认可用功能、负责数据传输和JSON-RPC交互。此外,还能发现和使用各种工具、管理资源和提示词系统进行交互。
除了核心功能,MCP客户端还支持一些额外特性,比如根管理、采样控制,以及同步或异步操作,为了使用不同场景,他提供了多种数据传输方式,包括:
- Stdio标准输入/输出:适用于本地调用
- 基于Java HttpClient和WebFlux的SSE传输:适用于远程调用
客户端可以通过不同传输方式调用不同MCP服务,可以是本地的,也可以是远程的。
4、MCP 服务
MCP Server也是整个MCP架构的关键组件,主要用来为客户端提供各种工具,资源和功能支持。
负责处理客户端的请求,包括解析协议提供工具,管理资源以及处理各种交互信息。同事,还能记录日志,发送通过,并且支持多个客户端同时连接,保证高效的通信和协作。
和客户端一样,他也可以通过多种方式进行数据传输,比如Stdio标准输入/输出、基于Servlet/WebFlux/WebMV的SSE传输,满足不同应用场景。
这种设计是的客户端和服务端完全解耦,任何语言开发的客户端都可以调用MCP服务。
MCP核心概念
官方给出6大核心概念:
- Resources资源:让服务端向客户端提供各种数据,比如文本,文件,数据库记录,API响应等,客户端可以决定什么时候使用这些资源。使AI能够访问最新信息和外部知识,为模型提供更丰富的上下文。
- Prompts提示词:服务端可以定义可复用的提示词模板和工作流,供客户端和用户直接使用。他的作用是标准化常见AI交互模式,比如能作为UI元素(如斜杠命令,快捷键操作)呈现给用户,从而简化用户与LLM的交互过程。
- Tools工具:MCP中最实用的特性,服务端可以提供给客户端可调用的函数,使AI模型能够执行计算、查询信息或者外部系统哦交互,极大扩展了AI的能力范围。
- Sampling采样:允许服务端通过客户端向大模型发送生成内容的请求(反向请求)。使MCP服务能够实现复杂的只能代理行为,同时保持用户对整个过程的控制和数据隐私保护。
- Roots根目录:MCP协议的安全机制,定义了服务器可以访问文件系统位置,限制访问范围,为MCP服务提供安全边界,当值恶意文件访问。
- Transports传输:定义客户端和服务器间的通信方式,包括Stdio(本地进程间通信)和SSE(网络实时通信),确保不同环境下的可靠信息交换。
开发MCP服务,主要关注 Resources资源、Prompt提示词、Tools工具(重中之重),三个改变。
MCP 官方文档 中提到,大多数客户端也支持Tools工具调用能力:
实际开发中,实际应用关注Tools工具即可。
三、使用 MCP
3种使用MCP方式:
- 云平台使用MCP
- 软件客户端使用MCP
- 程序中使用MCP
不管哪一种,原理类似。有2种可选的使用模式:本地下载MCP服务端代码运行(类似引入了一个SDK),或者直接使用已部署的MCP服务(类似调用别人的API)
MCP服务市场
开发者可以在这些平台上找到各种现成的MCP服务
- MCP.so:主流,提供丰富的MCP服务目录
- GitHub Awesome MCP Server:开源MCP服务集合
- 阿里云百炼MCP服务市场
- Spring AI Alibaba的MCP服务市场
- Glama.ai MCP服务
多数MCP服务市场仅提供本地下载MCP服务端代码并运行的使用方式,部署MCP服务也需要成本
阿里云百炼平台提供了云端部署的MCP服务,在线填写配置后可以使用,轻松和平台上的AI应用集成。
云平台使用 MCP
以阿里云百炼为例,参考阿里官方MCP文档,可以直接使用官方预置的MCP服务,或者部署自己的MCP服务到阿里云平台上。
官方提供了现成的MCP服务:
进入智能体应用,在左侧可以点击添加MCP服务,然后选择想要使用的MCP服务即可,比如高德地图MCP服务,提供地理信息查询等。
测试输入Prompt:听说上海静安区有很多宝藏小吃和游玩圣地,范围5公里,,帮我规划一下吧。
AI会根据需求调用不同的工具,比如地点转换为坐标,查找某坐标附近的点:
调用工具后,AI会利用工具的输出结果进一步分析并生成回复。这个流程就像(Tool Calling)
软件客户端使用 MCP
不同客户端软件对MCP支持成都不同,可以在官方文档中查看个客户端的支持特性。
接下来,使用目前较为主流的AI客户端Cursor为例,调用MCP服务。采用本地运行的方式。
1、环境
首先安装本地运行MCP服务需要用到工具,具体安转什么工具取决于MCP服务的配置要求。
🙋♀️🌰
在MCP市场找到高德地图MCP,发现Server Config中定义了使用npx命令行工具来安装和运行服务端代码
大多数MCP服务都支持与npx工具运行,所以推荐安装Node.js和NPX,可去Node官方下载安装。
从配置中我们发现,使用地图MCP需要API Key,在地图开放平台创建应用并添加API Key
2、Cursor接入MCP
在右上角进入Cursor Settings设置界面,然后选择MCP,添加全局MCP Server:
从MCP市场中找到MCPServer Config,并粘贴到mcp.json配置中,注意要将API key更改为自己的
保存配置,软件会自动识别并启动服务。
3、测试使用MCP
提供Prompt:“去上海静安区的宝藏小店和打卡圣地游玩推荐。”
观察效果 ,发现AI可能会调用多次MCP
图示结果
云服务使用MCP调用次数不稳定,可能产生AI和API调用产生费用,所以不建议使用。
如果要使用其他客户端,接入方式类似,比如:
- Cherry Studio:查看软件官方文档了解集成方法
- Claude Desktop:参考MCP 官方的用户快速入门指南
程序中使用MCP
利用Spring AI框架,在程序中使用MCP并完成我们的需求,实现一个完成“旅游攻略”的AI助手。
首先了解Spring AI MCP客户端的基本使用方法。建议参考Spring AI Alibaba的文档。
1、在Maven中央仓库找到依赖
<!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-mcp-client-spring-boot-starter -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>1.0.0-M6</version>
</dependency>
2、在resouces目录下新建mcp-servers.json配置,定义需要用到的MCP服务:
{"mcpServers": {"amap-maps": {"command": "npx","args": ["-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "改成你的 API Key"}}}
}
⚠️注意:在Windows环境下,命令配置需要添加.cmd后缀(如npx.cmd),否则会报错找不到命令。
3、修改Spring配置文件,编写MCP客户端配置。由于是本地运行MCP服务,所以使用stdio模式,并且要执行MCP服务配置文件的位置。
spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json
这样,MCP客户端程序启动时,会额外启动一个子进程来运行MCP服务,从而能够实现调用。
4、写一个利用MCP完成对话的方法。通过自动注入的ToolCallbackProvider获取到配置中定义的MCP服务提供的所有工具,并提供给ChatClient。
@Resource
private ToolCallbackProvider toolCallbackProvider;public String doChatWithMcp(String message, String chatId) {ChatResponse response = chatClient.prompt().user(message).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))// 开启日志,便于观察效果.advisors(new MyLoggerAdvisor()).tools(toolCallbackProvider).call().chatResponse();String content = response.getResult().getOutput().getText();logger.info("content: {}", content);return content;
}
代码中可以看出,MCP调用的本质就是类似工具调用,并不是让AI服务器主动去调用MCP服务,而是告诉AI“MCP服务提供了哪些工具”,如果AI想要使用这些工具完成任务,就会告诉我们的后端程序在执行工具后将结果返回给AI,最后由AI总结回复。
5、测试运行
@Test
void doChatWithMcp() {String chatId = UUID.randomUUID().toString();// 测试地图 MCPString message = "上海静安区的宝藏小店,推荐打卡。";String answer = loveApp.doChatWithMcp(message, chatId);
}
可以在地图开放品改控制查看API key的使用量,注意控制调用次数。
四、Spring AI MCP 开发模式
Spring AI在MCP官方Java SDK的基础上额外封装了一层,提供了和Spring Boot整合的SDK,支持客户端和服务端的普通调用和响应式调用。
MCP客户端开发
客户端开发主要基于Spring AI MCP Client Boot Starter,能够自动完成客户端的初始化,管理多个客户端实例,自动清理资源等。
1、引入资源
Spring AI 提供了2种客户端SDK,分别支持非响应式和响应式编程,可以根据需要选择对应的依赖包:
- spring-ai-starter-mcp-client:核心启动器,提供stdio和基于http的SSE支持
- spring-ai-starter-mcp-client-webflux:基于WebFlux响应式的SSE传输实现
比如下面依赖(具体以官方为准)
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
2、配置连接
引入依赖后,需要配置与服务器的连接,Spring AI支持两种配置方式:
1、直接写入配置文件,这种方式同时吃吃stdio和SSE连接方式
spring:ai:mcp:client:enabled: truename: my-mcp-clientversion: 1.0.0request-timeout: 30stype: SYNCsse:connections:server1:url: http://localhost:8080stdio:connections:server1:command: /path/to/serverargs:- --port=8080env:API_KEY: your-api-key
更多配置属性可参考Spring AI官方文档
2、引入Claude Desktop 格式的JSON文件,目前仅支持stdio连接方式
spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json
配置文件格式:
{"mcpServers": {"filesystem": {"command": "npx","args": ["-y","@modelcontextprotocol/server-filesystem","/Users/username/Desktop","/Users/username/Downloads"]}}
}
3、使用服务
启动项目是,Spring AI 会自动注入一些MCP相关的Bean。
1、如果想完全自主控制MCP客户端的行为,可以使用McpClient Bean,支持同异步:
// 同步客户端
@Autowired
private List<McpSyncClient> mcpSyncClients;// 异步客户端
@Autowired
private List<McpAsyncClient> mcpAsyncClients;
查看McpSyncClient的源码,发现提供了很多和MCP服务端交互的方法,比如获取工具信息,调用工具等等:
注意,每个MCP服务连接都会创建一个独立的客户端实例。
2、如果你想利用MCP服务提供的工具来增强AI的能力,可以使用自动注入的ToolCallbackProvider Bean,从中获取到ToolCallback工具对象,。
// 和 Spring AI 的工具进行整合
@Autowired
private SyncMcpToolCallbackProvider toolCallbackProvider;
ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();
绑定给ChatClient对象即可:
ChatResponse response = chatClient.prompt().user(message).tools(toolCallbackProvider).call().chatResponse();
4、其他特新
1、Spring AI同时支持同步和异步客户端类型,可根据应用需求选择合适的模式,只需要更改配置即可:
spring.ai.mcp.client.type=ASYNC
2、开发者可以通过编写自定义Client Bean来定制客户端行为,比如设置请求超时时间设置文件系统根目录的访问范围,自定义时间处理器,添加特色的日志处理逻辑。
官方提供的代码示例:
@Component
public class CustomMcpSyncClientCustomizer implements McpSyncClientCustomizer {@Overridepublic void customize(String serverConfigurationName, McpClient.SyncSpec spec) {// 自定义请求超时配置spec.requestTimeout(Duration.ofSeconds(30));// 设置此客户端可访问的根目录URIspec.roots(roots);// 设置处理消息创建请求的自定义采样处理器spec.sampling((CreateMessageRequest messageRequest) -> {// 处理采样CreateMessageResult result = ...return result;});// 添加在可用工具变更时通知的消费者spec.toolsChangeConsumer((List<McpSchema.Tool> tools) -> {// 处理工具变更});// 添加在可用资源变更时通知的消费者spec.resourcesChangeConsumer((List<McpSchema.Resource> resources) -> {// 处理资源变更});// 添加在可用提示词变更时通知的消费者spec.promptsChangeConsumer((List<McpSchema.Prompt> prompts) -> {// 处理提示词变更});// 添加接收服务器日志消息时通知的消费者spec.loggingConsumer((McpSchema.LoggingMessageNotification log) -> {// 处理日志消息});}
}
MCP服务端开发
服务端开发主要基于Spring AI MCP Server Boot Starter,能够自动配置MCP服务端组件。使开发者能够轻松创建MCP服务,向AI客户端提供工具,资源和提示词模板,从而扩展AI模型的能力范围。
1、引入依赖
- spring-ai-starter-mcp-server:提供stdio传输支持,不需要额外的web依赖
- spring-ai-starter-mcp-server-webmvc:提供基于SpringMCV的SSE传输和可选的stdio传输(推荐)
- springi-ai-strater-mcp-server-webflux:提供基于Spring WebFlux的响应式SSE传输和可选的stdio传输
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
2、配置服务
# 使用 spring-ai-starter-mcp-server
spring:ai:mcp:server:name: stdio-mcp-serverversion: 1.0.0stdio: truetype: SYNC # 同步
开发SSE服务,配置如下:
# 使用 spring-ai-starter-mcp-server-webmvc
spring:ai:mcp:server:name: webmvc-mcp-serverversion: 1.0.0type: SYNC # 同步sse-message-endpoint: /mcp/message # SSE 消息端点路径sse-endpoint: /sse # SSE 端点路径
如果开发响应式(异步)服务,配置如下:
# 使用 spring-ai-starter-mcp-server-webflux
spring:ai:mcp:server:name: webflux-mcp-serverversion: 1.0.0type: ASYNC # 异步sse-message-endpoint: /mcp/messages # SSE 消息端点路径sse-endpoint: /sse # SSE 端点路径
更多配置参见Spring AI 官方文档
spring:ai:mcp:server:enabled: true # 启用/禁用 MCP 服务stdio: false # 启用/禁用 stdio 传输name: my-mcp-server # 服务名称version: 1.0.0 # 服务版本type: SYNC # 服务类型(SYNC/ASYNC)resource-change-notification: true # 启用资源变更通知prompt-change-notification: true # 启用提示词变更通知tool-change-notification: true # 启用工具变更通知sse-message-endpoint: /mcp/message # SSE 消息端点路径sse-endpoint: /sse # SSE 端点路径# 可选 URL 前缀base-url: /api/v1 # 客户端访问路径将是/api/v1/sse 和 /api/v1/mcp/message
3、开发服务
MCP服务开发都是类似的,直接泗洪@Tool注解表姐服务类中的方法。
@Service
public class WeatherService {@Tool(description = "获取指定城市的天气信息")public String getWeather(@ToolParameter(description = "城市名称,如北京、上海") String cityName) {// 实现天气查询逻辑return "城市" + cityName + "的天气是晴天,温度22°C";}
}
然后Spring Boot项目启动时注册一个ToolCallbackProvider Bean:
@SpringBootApplication
public class McpServerApplication {@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}
MCP 工具类
Spring AI提供了一系列辅助MCP开发的工具类,用于MCP和ToolCallback之间互相转换。
也就是说,开发者可以直接将之前开发的工具转换为MCP服务,极大提高代码的复用性