让大模型“看见”现实:Spring AI MCP快速实战Dify/MaxKb接入MCP

108 阅读7分钟

一、概述

传统大模型虽语言能力强大,却缺乏对真实世界的动态感知——无法主动调用工具、访问私有知识或响应实时环境。尽管 GPT 引入 Function Calling 后,多家厂商支持“现实感知”,但因接口标准不一,工具复用性差。为此,MCP(Model Context Protocol)应运而生,旨在统一模型与工具的交互规范。

本文融合 Dify/MaxKB(编码与知识库)与 Spring AI MCP Server,以实际示例讲解如何构建一个真正落地的 AI 智能体——既能精准回答专业问题,又能操作业务系统,让大模型从“会聊天”迈向“能做事”。

二、MCP服务端与客户端交互

1、MCP 服务端(MCP Server)

是提供具体工具能力的后端服务,遵循 MCP 协议暴露工具元数据(如名称、参数、描述)和执行接口。例如:查询订单、调用数据库、发送邮件等。
在 Spring AI 中,可通过 @Tool 注解快速将 Java 方法注册为 MCP 工具。

2、MCP 客户端(MCP Client)

通常集成在大模型推理框架或 Agent 编排平台(如 Dify)中,负责:

  • • 发现可用工具(通过 /mcp/tools 等端点获取工具列表)
  • • 根据模型决策,向服务端发起工具调用请求
  • • 将执行结果返回给大模型,用于生成最终回复

3、二、MCP客户端与服务端交互流程

  1. 注册与发现
    MCP 服务端启动后,暴露标准接口(如 OpenAPI 或 MCP 专用 endpoint)。
    MCP 客户端主动拉取或动态发现可用工具列表及其 Schema。
  2.  模型决策调用
    大模型在处理用户请求时,判断需调用外部工具,并生成符合 MCP 规范的调用指令(含工具名、参数)。
  3.  客户端转发请求
    MCP 客户端将调用指令转发至对应 MCP 服务端。
  4.  服务端执行并返回
    服务端执行业务逻辑,返回结构化结果(JSON)。
  5. 结果注入上下文
    客户端将结果注入对话上下文,供大模型生成自然语言回复。

image.png

三、Java MCP基础

模型上下文协议 (MCP) 是一种标准化协议,使 AI 模型能够以结构化的方式与外部工具和资源进行交互。它支持多种传输机制,以提供跨不同环境的灵活性。

MCP Java SDK 提供了模型上下文协议的 Java 实现,通过同步和异步通信模式实现与 AI 模型和工具的标准化交互。

Spring AI MCP通过 Spring Boot 集成扩展 MCP Java SDK,提供客户端和服务器Starters。使用 Spring Initializer 通过 MCP 支持引导您的 AI 应用程序。

Java MCP 实现遵循三层架构:

image.png

  • • 客户端/服务器层:McpClient 处理客户端作,而 McpServer 管理服务器端协议作。两者都利用 McpSession 进行通信管理。
  • • 会话层 (McpSession):通过 McpClientSession 和 McpServerSession 实现管理通信模式和状态。
  • • 传输层 (McpTransport):处理 JSON-RPC 消息序列化和反序列化,支持多种传输实现。

四、使用Java MCP实现一个MCP Server

1、建立SpringAI项目

  • 1、新建一个SpringBoot项目,使用Maven进行包管理

image.png 2、选择需要引用的包,重点是引用Spring AI下的MOdel Context Protocol Server,这是建立MCP服务的核心包。

image.png

3、创建项目成功之后,pom.xml文件关键代码如下:

image.png

2、编写代码

1、实出具体功能的代码

注:我们重点讲解MCP Server的代码,因此实际调用天气预报的代码在此处就不进行实现,而是返回一个固定的值。

关键点:使用@Tool注解标记服务类中的方法,使其暴露为MCP服务端可调用的工具。同时,使用@ToolParam注解描述方法的参数。

@Service
public class WeatherService {
    /**
     * 获取指定城市的天气预报
     *
     * @param city 城市
     * @param date 日期
     * @return 天气预报
     * @throws Exception
     */
    @Tool(description = "根据经纬度获取当前天气,expectValue可选值为["aa","hh"]")
    public String getWeatherForecastByCityAndDate(
            @ToolParam(required = true, description = "请输入城市") String city,
            @ToolParam(required = true, description = "请输入日期") LocalDate date) throws Exception {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        String formattedDate = date.format(formatter);
        return """
                城市: %s
                日期: %s
                天气状况: 阳光明媚,正是出游好季节。
                """.formatted(city, formattedDate);

    }


    @Tool(description = "获取当天日期")
    public String getCurrentDate() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        String formattedDate = LocalDate.now().format(formatter);
        return """
                 当天日期是:%s
                """.formatted(formattedDate);
    }

    @Tool(description = "获取当前日期与时间")
    public String getCurrentDateTime() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss.SSS");
        String formattedDate = LocalDateTime.now().format(formatter);
        return """
                 当前日期与时间是:%s
               """.formatted(formattedDate);
    }
}

2、注册类

注:创建一个配置类,使用ToolCallbackProvider将包含注解的方法类对象注册到MCP框架中。这一步骤确保工具方法能够被MCP服务器发现并调用

**
 * 创建一个配置类,使用ToolCallbackProvider将包含注解的方法类对象注册到MCP框架中。
 * 这一步骤确保工具方法能够被MCP服务器发现并调用。示例代码如下:
 */
@Configuration
public class McpConfig {
    @Bean
    public ToolCallbackProvider tools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder()
                .toolObjects(weatherService)
                .build();
    }
}

3、配置参数

在SpringBoot配置文件中增加以下参数对Mcp进行配置:

spring:
  application:
    name: mcp-server
  ai:
    mcp:
      server:
        enabled: true
        name: mcp-weather-server
        version: 1.0.0
        type: SYNC
        sse-endpoint: /mcp/message

代码就是这样的简单,一个实际业务的服务类,一个MCP注册类加上几个配置参数。

把程序运行起来,下一步我们在MaxKb与DIFY中就可以使用这些MCP Server了。

五、MaxKb中使用MCP Server

1、配置MCP工具

在工具里选择创建MCP工具(我使用的最新的社区版V2.3.1) ,然后输入在application.yaml文件是配置的端口与端点。

image.png

image.png 开启MCP服 务:新增加的MCP服务,缺省情况是未开启的,需要开启才能在应用中使用。

image.png

2、在AI应用(简单与高级)中使用MCP工具

创建一个应用(简单应用与高级应用均可),添加对MCP的引用。

image.png

然后在弹窗口中选择对应的MCP服务。如果下拉列表中没有刚才配置的MCP服务,请进入到工具页面,将MCP服务开启。

image.png

六、DIFY中使用MCP Server

1、配置MCP工具

(我使用的最新的社区版V1.10.0)在“工具”-“MCP”中新增加一个MCP 服务。

image.png

MCP配置:按顺序输入相关内容,注意“3”处需要选择图标,否则“添加并授权”按钮不可用。

image.png

2、在AI应用(简单与高级)中使用MCP工具

在“工作室”编排页面中,找到“工具”,然后点添加:

image.png

配置添加MCP:

image.png

点“添加全部”按钮之的一,返回“工作室”编排,可以看到添加的MCP服务下有哪些工具,可以禁用某一个或一些不需要调用的工具,这也是DIF比MAXKB更好用的特点之一。

image.png

在上面这个界面中,可以禁用某一个或一些不需要调用的工具。

七、应用效果

我们使用的是本地Ollama中部署的Qwen2.5:14B模型。

下面的示例均使用DIFY,由于MaxKB类似,在此不单独列出。

1、查询当前时间

使用MCP之前:模型回答不知道具体时间,不同的模型回答可能会有所不同,但均不可能是正确的时间或日期。

image.png

      使用MCP工具之后:在

image.png

2、查询天气

使用MCP之前:

image.png

  使用MCP工具之后,在DIFY回答的过程中,我们还能看到MCP工具调用的情况。

image.png

下面是最终的结果:

image.png

由于我们的MCP Server代码未真正的调用接口去查天气,因此看到的天气结果是固定的。

由此可以看出,在使用MCP工具之后,模型会根据需要自主决策需要调用的工具,并给工具适当的参数值,在工具返回结果之后,模型会将工具返回的结果进行进一步的处理并返回给用户。


      本文详细介绍了如何基于 Spring AI 构建 MCP Server,并演示了在 Dify 与 MaxKB 中调用该服务的具体方法。后续我们将陆续推出使用 Python 和 Node.js 编写 MCP Server 的教程,敬请期待!

      如果您有特定的技术需求或希望了解的内容,欢迎在评论区留言——您的反馈将是我们创作的重要方向!

image.png

扫码关注公众号,一起学习AI技术

推荐阅读

1、最全的Ollama使用详解

2、大模型训练与推理硬件配置指南

3、大模型服务之vLLM-构建OpenAI兼容服务器基础

4、大模型服务之vLLM(17)-性能优化与调优

5、玩转SSH多级跳转:穿透复杂网络,直达目标主机