SpringAI轻松构建MCP Client-Server架构

什么是MCP?

MCP 是 Model Context Protocol,模型上下文协议,它是由 Anthropic(Claude 大模型母公司)提出的开放协议,用于大模型连接外部"数据源"的一种协议。

它可以通俗的理解为 Java 界的 Spring Cloud Openfeign,只不过 Openfeign 是用于微服务通讯的,而 MCP 用于大模型通讯的,但它们都是为了通讯获取某项数据的一种机制,如下图所示:

为什么需要MCP?

MCP 存在的意义是它解决了大模型时代最关键的三个问题:数据孤岛、开发低效和生态碎片化等问题。

1.打破数据孤岛,让AI"连接万物"

大模型本身无法直接访问实时数据或本地资源(如数据库、文件系统),传统方式需要手动复制粘贴或定制接口。MCP 通过标准化协议,让大模型像"插USB"一样直接调用外部工具和数据源,例如:

  • 查天气时自动调用气象 API,无需手动输入数据。
  • 分析企业数据时直接连接内部数据库,避免信息割裂。

2.降低开发成本,一次适配所有场景

在之前每个大模型(如 DeepSeek、ChatGPT)需要为每个工具单独开发接口(Function Calling),导致重复劳动,MCP 通过统一协议:

  • 开发者只需写一次 MCP 服务端,所有兼容 MCP 的模型都能调用。
  • 用户无需关心技术细节,大模型可直接操作本地文件、设计软件等。

3.提升安全性与互操作性

  • 安全性:MCP 内置权限控制和加密机制,比直接开放数据库更安全。
  • 生态统一:类似 USB 接口,MCP 让不同厂商的工具能"即插即用",避免生态分裂。

4.推动AIAgent的进化

MCP 让大模型从"被动应答"变为"主动调用工具",例如:

  • 自动抓取网页新闻补充实时知识。
  • 打开 Idea 编写一个"Hello World"的代码。

MCP 的诞生,相当于为AI世界建立了"通用语言",让模型、数据和工具能高效协作,最终释放大模型的全部潜力。

MCP组成和执行流程

MCP 架构分为以下 3 部分:

  • 客户端:大模型应用(如 DeepSeek、ChatGPT)发起请求。
  • 服务器:中间层,连接具体工具(如数据库、设计软件)。
  • 资源:具体的数据或工具(如 Exce l文件、网页 API)。

运行流程

  • 用户提问。
  • 大模型通过 MCP 客户端发送请求。
  • MCP 服务器接收指令。
  • 调用对应工具(如数据库)执行。
  • 返回结果给大模型。
  • 生成最终回答。

Spring AI MCP 介绍

Spring AI MCP 是通过 Spring Boot 集成扩展了 MCP 的 Java SDK(开发工具),它同时提供了 Spring Boot 客户端和服务器的启动器,方便使用 Spring AI MCP 快速开发 AI 应用程序。

Spring AI MCP 实战

当前案例中,我们使用 MCP 实现一个天气查询小助手,其中包含的主要角色有:

  • MCP Server:MCP 服务提供方,提供天气查询功能。
  • MCP Client:MCP 客户端(大模型端)我们对接 DeepSeek LLM 实现对 MCP Server 的调用,从而实现天气预报的查询功能。

具体交互流程如下:

实现 MCP Server 代码编写

MCP Server 主要实现步骤如下:

  • 添加 MCP Server 依赖。
  • 设置 MCP 配置信息。
  • 编写 MCP Server 服务代码。
  • 将 MCP Server 进行暴露设置。

关键实现代码如下。

添加 MCP Server 依赖

xml 复制代码
<dependencies>
  <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies>

<repositories>
<repository>
    <name>Central Portal Snapshots</name>
    <id>central-portal-snapshots</id>
    <url>https://central.sonatype.com/repository/maven-snapshots/</url>
    <releases>
      <enabled>false</enabled>
    </releases>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
</repository>
<repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/milestone</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
</repository>
<repository>
    <id>spring-snapshots</id>
    <name>Spring Snapshots</name>
    <url>https://repo.spring.io/snapshot</url>
    <releases>
      <enabled>false</enabled>
    </releases>
</repository>
</repositories>

MCP Server 依赖有三种类型:

  • 标准输入/输出 (STDIO) :spring-ai-starter-mcp-server
  • Spring MVC(服务器发送的事件) :spring-ai-starter-mcp-server-webmvc
  • Spring WebFlux(响应式 SSE) :spring-ai-starter-mcp-server-webflux

设置 MCP 配置信息

MCP Server 包含以下配置信息:

配置项 描述 默认值
enabled 启用/禁用 MCP 服务器 TRUE
stdio 启用/禁用 stdio 传输 FALSE
name 用于标识的服务器名称 mcp-server
version 服务器版本 1.0.0
type 服务器类型 (SYNC/ASYNC) SYNC
resource-change-notification 启用资源更改通知 TRUE
prompt-change-notification 启用提示更改通知 TRUE
tool-change-notification 启用工具更改通知 TRUE
tool-response-mime-type (可选)每个工具名称的响应 MIME 类型。例如,将 mime 类型与工具名称相关联spring.ai.mcp.server.tool-response-mime-type.generateImage=image/pngimage/pnggenerateImage() -
sse-message-endpoint Web 传输的 SSE 终端节点路径 /mcp/message

其中 MCP Server 又分为以下两种类型。

服务器类型
  • 同步服务器:默认服务器类型,它专为应用程序中的简单请求-响应模式而设计。要启用此服务器类型,请在您的配置中设置。 激活后,它会自动处理同步工具规格的配置,spring.ai.mcp.server.type=SYNC。
  • 异步服务器: 异步服务器实现使用非阻塞作并针对非阻塞作进行了优化。要启用此服务器类型,请使用配置您的应用程序。此服务器类型会自动设置具有内置 Project Reactor 支持的异步工具规范,spring.ai.mcp.server.type=ASYNC。

编写 MCP Server 服务代码

编写天气预报查询伪代码:

typescript 复制代码
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
publicclass WeatherService {

    @Tool(description = "根据城市名称获取天气预报")
    public String getWeatherByCity(String city) {
        Map<String, String> mockData = Map.of(
            "西安", "晴天",
            "北京", "小雨",
            "上海", "大雨"
        );
        return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");
    }

}

将服务暴露出去

scss 复制代码
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}

这样 MCP Server 就编写完成了。

实现 MCP Client 代码编写

MCP Client 主要实现步骤如下:

  • 添加 MCP Client 相关依赖。
  • 设置配置信息。
  • 设置 ChatClient 对象(调用 MCP Server)。
  • 编写测试代码调用 MCP Server。

核心实现代码如下:

kotlin 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclass ClientController {

    @Autowired
    private ChatClient chatClient;

    @RequestMapping("/chat")
    public String chat(@RequestParam(value = "msg",defaultValue = "今天天气如何?") String msg) {
        String response = chatClient.prompt()
        .user(msg)
        .call()
        .content();
        System.out.println("响应结果: " + response);
        return response;
    }

}

最终执行结果如下:

因为 MCP Server 只配置了 3 个城市,所以查询结果和预期相符:

小结

到这里使用 Spring AI 就实现了 MCP Client 和 Server 的调用了,可以看出 MCP 的推出只是为了增强大模型的能力的,有了 MCP 协议之后,任何大模型就可以调用任意实现了 MCP Server 的服务了,这样就无线扩充了大模型的能力,为 AI 的发展提供了标准的协议和便利的对接。

相关推荐
paopaokaka_luck27 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
Villiam_AY31 分钟前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
Ronin-Lotus4 小时前
深度学习篇---剪裁&缩放
图像处理·人工智能·缩放·剪裁
魔尔助理顾问4 小时前
系统整理Python的循环语句和常用方法
开发语言·后端·python
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
cpsvps4 小时前
3D芯片香港集成:技术突破与产业机遇全景分析
人工智能·3d
你的人类朋友4 小时前
❤️‍🔥微服务的拆分策略
后端·微服务·架构
国科安芯5 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
AKAMAI5 小时前
利用DataStream和TrafficPeak实现大数据可观察性
人工智能·云原生·云计算
Ai墨芯1115 小时前
深度学习水论文:特征提取
人工智能·深度学习