历史文章

Spring AI:对接DeepSeek实战
Spring AI:对接官方 DeepSeek-R1 模型 —— 实现推理效果
Spring AI:ChatClient实现对话效果
Spring AI:使用 Advisor 组件 - 打印请求大模型出入参日志
Spring AI:ChatMemory 实现聊天记忆功能
Spring AI:本地安装 Ollama 并运行 Qwen3 模型
Spring AI:提示词工程
Spring AI:提示词工程 - Prompt 角色分类(系统角色与用户角色)
Spring AI:基于 “助手角色” 消息实现聊天记忆功能
Spring AI:结构化输出 - 大模型响应内容
Spring AI:Docker 安装 Cassandra 5.x(限制内存占用)&& CQL
Spring AI:整合 Cassandra - 实现聊天消息持久化
Spring AI:多模态 AI 大模型
Spring AI:文生图:调用通义万相 AI 大模型
Spring AI:文生音频 - cosyvoice-V2
Spring AI:文生视频 - wanx2.1-i2v-plus
Spring AI:上手体验工具调用(Tool Calling)
Spring AI:整合 MCP Client - 调用高德地图 MCP 服务

上文中,我们使用 MCP Client 对接了第三方提供的 MCP Server 服务 —— 高德地图。那能否自行搭建一个 MCP Server 服务呢?答案是肯定的。

新建 MCP Server 项目

在这里插入图片描述

①:选择 Spring Boot 生成器来创建项目;
②:项目名称填写 xiaoma-mcp-server-qq;
③: 项目存放位置,选择之前创建好的文件夹;
④:项目构建方式选择 Maven;
⑤:填写 Group 组织名称,通常为公司域名倒写,如 com.xiaoma;
⑥: 项目唯一标识符,这里填写 xiaoma-mcp-server-qq;
⑦: 包名填写 com.xiaoma.xiaomamcpserverqq;
⑧: JDK 版本选择 21 版本;
⑨: Java 语言版本也选择 21, 和 JDK 保持一致;

修改 pom.xml

接着,编辑 pom.xml 文件,首先将 Spring Boot 的版本号修改为 3.4.5。另外,添加 Spring AI 框架的依赖管理、 lombok 工具依赖、仓库地址等,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xiaoma</groupId>
    <artifactId>xiaoma-mcp-server-qq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>xiaoma-mcp-server-qq</name>
    <description>MCP Server: 获取 QQ 信息</description>
    <properties>
        <!-- JDK 版本 -->
        <java.version>21</java.version>
        <!-- Spring AI 版本 -->
        <spring-ai.version>1.0.0</spring-ai.version>
        <lombok.version>1.18.30</lombok.version>
    </properties>

    <!-- Spring AI 依赖管理   -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 避免编写那些冗余的 Java 样板式代码,如 get、set 方法等 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
        <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>

        <!-- 添加华为云、阿里云 maven 中央仓库,提升 Jar 包下载速度 -->
        <repository>
            <id>huaweicloud</id>
            <name>huawei</name>
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
        </repository>
        <repository>
            <id>aliyunmaven</id>
            <name>aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>

</project>

MCP Server 三种部署模式

在 Spring AI 项目中,MCP Server 支持三种部署模式,下面是对比表格,涵盖核心特性、适用场景及配置要点:

在这里插入图片描述
这里我们选择支持更高并发的 WebFlux 模式,再次编辑 pom.xml, 添加如下依赖:

  <!-- MCP Server WebFlux -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
    </dependency>

依赖添加完成后,记得刷新一下 Maven, 将依赖下载到本地 Maven 仓库中。

添加配置

然后,编辑 applicaiton.yml, 添加配置项如下:

server:
  port: 8000 # 启动端口号
spring:
  ai:
    mcp:
      server:
        type: sync # 处理模式,SYNC 同步或 ASYNC 异步
        name: mcp-server-qq # MCP Server 名称
        version: 1.0.0 # MCP Server 版本号

# 奶思猫 API 密钥(替换为你自己的)
api-key: xxx

注意:根据 QQ 号查询 QQ 信息,需要调用奶思猫第三方平台的 API, 需要先申请 API Key

具体接口请求方式,可访问官方文档:https://api.nsmao.net/doc/21

在这里插入图片描述
可通过 GET 请求,如下,只需要在链接的后面,携带上想要查询的 QQ 号,与 key 密钥两个参数,就能拿到相关数据:

https://api.nsmao.net/api/qq/query?key=你的key&qq=1645253

key 密钥需要先在奶思猫 API 平台上,注册一个新用户,然后登录到管理后台,在 密钥管理 中,复制属于你自己的密钥:

在这里插入图片描述

配置 RestTemplate

因为业务涉及到 Http 调用第三方平台,咱们先来配置一下 RestTemplate。新增 /config 包,并新建 RestTemplateConfig 配置类,如下:

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(10000); // 连接超时时间:10秒
        factory.setReadTimeout(10000); // 读取超时时间:10秒
        return new RestTemplate(factory);
    }
}

定义 Tool

接着,新建一个 /tools 包,并通过 @Tool 注解声明一个 “根据 QQ 号获取 QQ 信息” 工具方法,模式和之前定义 Function Call 差不太多(Spring AI:上手体验工具调用(Tool Calling)),代码如下:

@Component
@Slf4j
public class QQTool {

    @Resource
    private RestTemplate restTemplate;

    @Value("${api-key}")
    private String apiKey;

    @Tool(description = "根据 QQ 号获取 QQ 信息")
    public String getQQInfo(String qq) {
        log.info("## 获取 QQ 信息, qq: {}", qq);

        // 请求第三方接口
        String url = String.format("https://api.nsmao.net/api/qq/query?qq=%s&key=%s", qq, apiKey);
        String result = restTemplate.getForObject(url, String.class);

        log.info("## 返参: {}", result);
        return result;
    }

}

注册工具

完成以上工作后,编辑 XiaoMaMcpServerQqApplication 启动类,注册工具回调(Tool Callbacks),代码如下:

@SpringBootApplication
public class XiaoMaMcpServerQqApplication {

    public static void main(String[] args) {
        SpringApplication.run(XiaohaMcpServerQqApplication.class, args);
    }

    /**
     * 注册工具回调(Tool Callbacks)
     * @param qqTool
     * @return
     */
    @Bean
    public ToolCallbackProvider qqTools(QQTool qqTool) {
        return MethodToolCallbackProvider.builder()
                .toolObjects(qqTool)
                .build();
    }

}

测试

最后,重启后端项目,观察控制台日志,如下图所示,若包含提示信息 Registered tools: 1 , 表示已注册了一个工具,到此,一个简单的 MCP Server 就跑起来了!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐