之前学过了工具调用(spring-ai 1.0.0 学习(十二)——工具调用_springai 1.0 如何判断调用哪一个tool工具-CSDN博客),今天来看一下MCP
MCP是什么
MCP全称是模型上下文协议,有点绕,通俗点理解,如果说tool是支持调用系统内部的工具,那么mcp就是支持调用系统外部的工具,比如高德地图、百度搜索等。
为了方便进行外部调用,就需要一个类似http协议的规范,来约定调用方的报文格式和被调用方如何解析报文,这就是mcp的由来。
今天我们主要看如何使用MCP Client,即如何调用外部应用。
最小化样例
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency>
客户端需引入上述2个包之一,webflux包是基于SSE的WebFlux传输,另一个则是STDIO和基于SSE的HTTP。生产环境建议使用webflux。
然后需要在application文件中添加如下配置(SSE)
spring:ai:mcp:client:sse:connections:server1:url: http://localhost:8080server2:url: http://otherserver:8081sse-endpoint: /custom-sse
其中server1、server2是自定义的服务名称,可自行修改
然后就可以在代码中使用了
@AutowiredToolCallbackProvider toolCallbackProvider;@GetMapping("/ai/mcp-client")String generation(String userInput){return this.chatClient.prompt().user(userInput).toolCallbacks(toolCallbackProvider).call().content();}
spring-ai会自动将配置文件中的url组装成ToolCallbackProvider,将其传递给大模型即可。
进阶知识
内部原理及相关接口和实现类
以基于SSE的Http为例,在spring-ai中,自动化配置会进行下列操作:
用户添加在application中的spring.ai.mcp.client.sse配置会首先被加载进McpSseClientProperties中
然后每个connection(样例中的server1、server2)会创建一个HttpClientSseClientTransport来负责通信
然后每个HttpClientSseClientTransport与其命名一起,被封装为NamedClientMcpTransport
然后NamedClientMcpTransport会与spring.ai.mcp.client下的其他通用配置,根据Type不同(Sync、Async)组成McpSyncClient或McpAsyncClient,创建完成后会向服务器发送请求initialize,初始化服务器相关参数(服务器能力介绍、是否支持tool,resource,prompt等)
最后所有McpSyncClient组成SyncMcpToolCallbackProvider
SyncMcpToolCallbackProvider负责将McpSyncClient转换为SyncMcpToolCallback,期间会向服务器发送tools/list请求,获取工具详细信息(描述、请求格式等)
之后就是在tool篇提到的,将工具定义发送给大模型等。。。