基于Spring AI开发MCP:打造AI应用与外部世界的无缝桥梁

B站影视 日本电影 2025-09-04 22:16 1

摘要:在AI技术蓬勃发展的当下,大模型与外部数据源、工具的交互成为提升AI应用能力的关键。MCP(Model Context Protocol,模型上下文协议)作为Anthropic推出的开放标准,旨在打破数据孤岛,让AI应用能安全、高效地访问和操作本地及远程数据,

在AI技术蓬勃发展的当下,大模型与外部数据源、工具的交互成为提升AI应用能力的关键。MCP(Model Context Protocol,模型上下文协议)作为Anthropic推出的开放标准,旨在打破数据孤岛,让AI应用能安全、高效地访问和操作本地及远程数据,为AI应用搭建起连接万物的接口。而Spring AI,作为Spring生态下专注于AI应用开发的框架,凭借其对AI模型集成、工具调用等方面的良好支持,为基于MCP开发AI应用提供了绝佳的技术底座。

Spring AI的核心优势之一是依赖注入(DI)和强大的配置管理能力。在MCP开发中,我们需要管理大量的组件,如MCP客户端(McpSyncClient)、工具回调提供者(ToolCallbackProvider)等。通过Spring的@Bean注解和配置类(如McpClientAutoConfiguration、ToolCallingAutoConfiguration),可以轻松地将这些组件纳入Spring的容器管理。

例如,在McpClientAutoConfiguration中,我们可以定义McpSyncClient的创建逻辑:

@Configurationpublic class McpClientAutoConfiguration {@Beanpublic McpSyncClient mcpSyncClient(HttpClientSseClientTransport transport, SyncMcpToolCallbackProvider toolCallbackProvider) {// 初始化McpSyncClient,设置传输层和工具回调提供者McpSyncClient client = new McpSyncClient(transport);client.setToolCallbackProvider(toolCallbackProvider);return client;}@Beanpublic HttpClientSseClientTransport httpClientSseClientTransport {// 配置基于HTTP的SSE传输return new HttpClientSseClientTransport;}}

这样,当Spring容器启动时,会自动创建并注入所需的McpSyncClient实例,开发者无需手动管理对象的生命周期,极大地简化了代码编写。

MCP的服务器端(MCP Server)通常需要以Web服务的形式对外提供接口。Spring AI借助Spring Web MVC或WebFlux等Web框架,能够快速构建MCP Server的Web端点。

从提供的图片中可以看到,MCP Server通过WebMvcMcpServerTransportProvider等组件与Web容器(如Tomcat、Jetty等)集成,处理来自MCP Client的请求。利用Spring的@RestController和路由映射(RouterFunction Mapping),可以方便地定义MCP Server的API接口。

示例代码如下:

@RestController@RequestMapping("/mcp")public class McpServerController {private final McpServerSession session;public McpServerController(McpServerSession session) {this.session = session;}@PostMapping("/message")public ResponseEntity handleMessage(@RequestBody MessageRequest request) {// 处理MCP Client发送的消息请求session.handleMessage(request);return ResponseEntity.ok.build;}@GetMapping("/tools/list")public ResponseEntity> listTools {// 返回可用工具列表List tools = session.getAvailableTools;return ResponseEntity.ok(tools);}}

这里,McpServerSession负责管理MCP Server的会话逻辑,包括工具调用、通知处理等。

在MCP的工作流程中,工具调用是核心环节之一。Spring AI提供了灵活的工具回调机制,支持同步和异步的工具调用方式。

从图片中可知,ToolCallbackProvider有多个实现类,如MethodToolCallbackProvider、SyncMcpToolCallbackProvider等。可以通过反射解析标注了特定注解(如@Tool)的方法,将其转化为MCP可调用的工具。

示例代码:

@Servicepublic class WeatherService {@Tool(name = "getWeather", description = "获取指定城市的天气信息")public WeatherInfo getWeather(String city) {// 调用实际的天气API获取数据WeatherInfo weatherInfo = weatherApiClient.getWeather(city);return weatherInfo;}}@Configurationpublic class ToolConfig {@Beanpublic MethodToolCallbackProvider methodToolCallbackProvider(ApplicationContext applicationContext) {MethodToolCallbackProvider provider = new MethodToolCallbackProvider;// 扫描带有@Tool注解的BeanMap toolBeans = applicationContext.getBeansWithAnnotation(Tool.class);for (Object bean : toolBeans.values) {provider.register(bean);}return provider;}}

当MCP Client发起工具调用请求时,MethodToolCallbackProvider会找到对应的方法并执行,然后将结果返回给MCP Server,再由MCP Server传递给大模型进行进一步处理。

我们将开发一个基于MCP的智能天气助手应用。该应用通过MCP Client与大模型交互,当用户询问天气时,大模型判断需要调用天气工具,然后通过MCP Server调用天气服务获取数据,最后将天气信息以自然语言的形式返回给用户。

首先,在Maven项目的pom.xml中添加Spring AI及相关依赖:

org.springframework.aispring-ai-core0.8.0org.springframework.aispring-ai-mcp-server0.8.0org.springframework.bootspring-boot-starter-web

创建天气服务类,提供获取天气的工具方法:

@Servicepublic class WeatherService {private final WeatherApiClient weatherApiClient;public WeatherService(WeatherApiClient weatherApiClient) {this.weatherApiClient = weatherApiClient;}@Tool(name = "getWeather", description = "获取指定城市的天气信息,参数为城市名称")public WeatherInfo getWeather(String city) {return weatherApiClient.fetchWeather(city);}}// 天气API客户端,模拟调用外部天气API@Componentpublic class WeatherApiClient {public WeatherInfo fetchWeather(String city) {// 实际开发中,这里会调用真实的天气API// 此处为模拟数据WeatherInfo info = new WeatherInfo;info.setCity(city);info.setTemperature(25);info.setWeather("晴");return info;}}// 天气信息实体类public class WeatherInfo {private String city;private int temperature;private String weather;// getter和setter方法public String getCity { return city; }public void setCity(String city) { this.city = city; }public int getTemperature { return temperature; }public void setTemperature(int temperature) { this.temperature = temperature; }public String getWeather { return weather; }public void setWeather(String weather) { this.weather = weather; }@Overridepublic String toString {return city + "当前天气" + weather + ",气温" + temperature + "摄氏度";}}

编写MCP Server的自动配置类,注册工具回调提供者和MCP Server相关组件:

@Configuration@EnableAutoConfigurationpublic class McpServerAutoConfiguration {@Beanpublic MethodToolCallbackProvider methodToolCallbackProvider(ApplicationContext applicationContext) {MethodToolCallbackProvider provider = new MethodToolCallbackProvider;Map toolBeans = applicationContext.getBeansWithAnnotation(Tool.class);for (Object bean : toolBeans.values) {provider.register(bean);}return provider;}@Beanpublic McpServerTransportProvider mcpServerTransportProvider {return new WebMvcMcpServerTransportProvider;}@Beanpublic McpServerSession mcpServerSession(McpServerTransportProvider transportProvider, ToolCallbackProvider toolCallbackProvider,ObjectMapper objectMapper) {McpServerSession session = new McpServerSession(transportProvider, objectMapper);session.setToolCallbackProvider(toolCallbackProvider);// 初始化服务器功能,如设置工具、资源等McpServerFeatures features = new McpServerFeatures;features.addToolDefinitions(toolCallbackProvider.getToolDefinitions);session.setFeatures(features);return session;}}

创建Spring Boot启动类:

@SpringBootApplicationpublic class McpServerApplication {public static void main(String args) {SpringApplication.run(McpServerApplication.class, args);}}

启动应用后,MCP Server将在默认端口(如8080)上运行,提供工具列表查询(/mcp/tools/list)和工具调用等接口。

在MCP Client项目的pom.xml中添加依赖:

org.springframework.aispring-ai-mcp-client0.8.0org.springframework.bootspring-boot-starter-web

编写配置类,创建McpSyncClient实例:

@Configurationpublic class McpClientConfig {@Value("${mcp.server.url:http://localhost:8080}")private String serverUrl;@Beanpublic HttpClientSseClientTransport httpClientSseClientTransport {return new HttpClientSseClientTransport;}@Beanpublic SyncMcpToolCallbackProvider syncMcpToolCallbackProvider {return new SyncMcpToolCallbackProvider;}@Beanpublic McpSyncClient mcpSyncClient(HttpClientSseClientTransport transport, SyncMcpToolCallbackProvider toolCallbackProvider) {McpSyncClient client = new McpSyncClient(transport);client.setServerUrl(serverUrl + "/mcp");client.setToolCallbackProvider(toolCallbackProvider);return client;}}

这里假设我们使用Anthropic的Claude大模型,通过Spring AI的大模型集成能力与MCP Client结合:

@Servicepublic class AiAssistantService {private final McpSyncClient mcpSyncClient;private final AnthropicChatClient anthropicChatClient;public AiAssistantService(McpSyncClient mcpSyncClient, AnthropicChatClient anthropicChatClient) {this.mcpSyncClient = mcpSyncClient;this.anthropicChatClient = anthropicChatClient;}public String askAssistant(String question) {// 从MCP Server获取工具列表List tools = mcpSyncClient.listTools;// 将问题和工具描述发送给大模型Prompt prompt = new Prompt(question + "\n可用工具:" + tools);ChatResponse response = anthropicChatClient.call(prompt);String modelOutput = response.getResult.getOutput;// 解析大模型输出,判断是否需要调用工具if (needsToolCall(modelOutput)) {ToolCall toolCall = parseToolCall(modelOutput);// 调用MCP Server的工具Object result = mcpSyncClient.callTool(toolCall);// 将工具调用结果再次发送给大模型,生成最终响应Prompt finalPrompt = new Prompt(question + "\n工具调用结果:" + result);ChatResponse finalResponse = anthropicChatClient.call(finalPrompt);return finalResponse.getResult.getOutput;} else {return modelOutput;}}// 解析大模型输出,判断是否需要工具调用private boolean needsToolCall(String output) {// 实际开发中,需要根据大模型的输出格式进行判断return output.contains("需要调用工具");}// 解析工具调用信息private ToolCall parseToolCall(String output) {// 实际开发中,需要根据大模型的输出格式解析出工具调用信息return new ToolCall("getWeather", Map.of("city", "北京"));}}

创建一个简单的命令行应用,测试智能天气助手:

@SpringBootApplicationpublic class McpClientApplication {public static void main(String args) {ConfigurableApplicationContext context = SpringApplication.run(McpClientApplication.class, args);AiAssistantService assistantService = context.getBean(AiAssistantService.class);Scanner scanner = new Scanner(System.in);System.out.println("请输入您的问题(输入'退出'结束):");String question = scanner.nextLine;while (!"退出".equals(question)) {String answer = assistantService.askAssistant(question);System.out.println("助手回答:" + answer);System.out.println("请输入您的问题(输入'退出'结束):");question = scanner.nextLine;}scanner.close;context.close;}}

当用户输入“北京天气怎么样”时,MCP Client会将问题发送给大模型,大模型判断需要调用“getWeather”工具,然后通过MCP Server调用WeatherService的getWeather方法获取北京的天气信息,最后大模型将天气信息整理成自然语言返回给用户。

开放标准与生态融合:MCP作为开放标准,打破了不同AI应用与工具、数据之间的壁垒。Spring AI则凭借Spring生态的广泛影响力,将MCP的能力快速融入到众多Java应用中,促进了AI应用生态的繁荣。简化开发流程:Spring AI的依赖注入、配置管理、Web集成等特性,极大地简化了MCP应用的开发流程。开发者无需关注复杂的通信协议和组件管理,只需专注于业务逻辑的实现。灵活的工具调用机制:通过Spring AI的工具回调机制,MCP能够灵活地调用各种自定义工具,无论是同步还是异步调用,都能轻松实现,满足不同场景下的需求。数据安全保障:MCP本身通过标准化的数据访问接口、内置安全机制以及对敏感信息的保护(如MCP Server控制资源,不将API密钥提供给LLM提供商),保障了数据安全。Spring AI在安全方面的实践(如Spring Security的集成能力)也能进一步增强MCP应用的数据安全性。

随着AI技术的不断发展和MCP生态的逐渐完善,基于Spring AI开发MCP应用将拥有更广阔的前景。未来,可能会有更多的工具和服务提供商加入MCP生态,丰富MCP Server的能力。同时,Spring AI也会持续迭代,提供更强大的AI模型集成、向量数据库交互等功能,进一步提升MCP应用的智能化水平。例如,在多模态AI应用中,MCP可以结合Spring AI的多模态模型支持,实现图像、语音等数据与大模型的交互,为用户带来更丰富的智能体验。

总之,Spring AI与MCP的结合,为AI应用开发打开了新的大门,让开发者能够更高效地构建出连接万物、智能高效的AI应用,推动AI技术在各个领域的深入应用。

导出

Markdown 9918 字数 360 行数 当前行 1, 当前列 0

HTML 9603 字数 287 段落

发布文章

来源:码韵匠道

相关推荐