基于 Spring AI 的 MCP 客户端/服务端架构指南

简介: 本文聚焦于通过Spring AI框架构建本地MCP(模型上下文协议)服务,解决AI大模型在企业应用中的数据孤岛与安全问题。MCP作为开源协议,提供标准化桥梁,使模型能动态调用本地资源,确保数据安全可控。文章详细介绍了环境准备、模块架构、代码实现(包括客户端和服务端)、关键配置及部署方案,并强调了构建要求、协议兼容和异常处理等注意事项。通过实战案例,读者可掌握如何利用MCP突破数据壁垒,构建高效、安全的AI应用。

背景

随着人工智能技术的爆发式增长,企业级应用对AI大模型的分析、推理、生成等能力需求日益迫切。然而,传统模型面临“数据孤岛”困境:大量关键业务数据分散在本地系统、专有数据库或第三方服务中,难以通过简单的提示词直接注入模型,导致模型理解受限、决策质量不足。更严峻的是,对于涉及隐私或合规要求的数据(如企业财务信息、医疗记录等),直接暴露给云端模型存在显著安全风险。如何打破数据壁垒,同时确保敏感信息的安全可控,成为AI落地的核心挑战。


在此背景下,模型上下文协议(MCP)应运而生。这一由Anthropic开源的开放协议,为AI模型与外部数据/工具提供了“标准化桥梁”,通过统一的接口规范,使模型能够动态调用本地文件、数据库、API等资源,实现“上下文感知”的智能交互。MCP的核心价值在于:

  • 标准化集成:告别“一对一”定制开发,通过协议对接即可连接任意兼容MCP的数据源或工具,大幅降低生态构建成本。
  • 安全与灵活性:支持本地部署,数据无需离境,兼顾隐私合规与实时访问需求。
  • 智能体赋能:为AI Agent提供“手脚”,使其能自主执行查询、分析、操作等复杂任务流。


Spring AI作为Java生态中领先的AI开发框架,通过深度集成MCP协议,为开发者提供了企业级解决方案:其模块化架构、对同步/异步通信的支持、以及与Spring Boot的无缝融合,使得构建本地MCP客户端与服务端变得高效且可靠。无论是快速搭建文件系统的本地数据中台,还是构建与业务系统(如CRM、ERP)的实时联动,Spring AI的声明式配置、注解驱动开发模式极大降低了技术门槛。


本文将聚焦于“本地MCP服务建设”实战,详细讲解如何基于Spring AI框架,从零开始搭建MCP客户端与服务端,实现模型与本地资源的的安全交互。通过案例演示,读者将掌握如何通过标准化协议突破数据孤岛,构建既安全可控又具备动态扩展能力的AI应用,为业务智能化升级提供可落地的技术路径。


一、环境准备

1.1 基础环境要求

  • JDK:17+(推荐 JDK 21)
  • Spring Boot:3.4.5(3.x.x 系列)
  • Spring Framework:6.2.6(6.x.x 系列)
  • Spring AI:1.0.0-M7+(M6 之前版本存在已知问题)


二、模块架构

2.1 核心模块

image.png

三、代码实现

3.1 MCP 客户端

Maven 依赖配置

pom.xml

<dependencies>
    <!-- Spring AI Starter -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>
    
    <!-- WebFlux 支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>
<!-- 打包配置 -->
<build>
    <finalName>${appname}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals><goal>repackage</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Controller示例

McpClientController.java

@RestController
@RequestMapping("/service")
publicclassMcpClientController {
    privatefinal ChatClient chatClient;

    publicMcpClientController(ChatClient.Builder builder, ToolCallbackProvider tools){
        this.chatClient = builder.defaultToolCallbacks(tools).build();
    }

    @GetMapping("/query/currentTime/{country}")
    Flux<String> queryCurrentTime(@PathVariable String country){
        returnthis.chatClient
            .prompt(new PromptTemplate("调用本地工具查询国家{country}当前时间")
                .create(Map.of("country", country)))
            .stream()
            .content();
    }
}

3.2 MCP 服务端

工具类实现

DateTimeTool.java

@Service
publicclassDateTimeTool {
    privatestaticfinal Map<String, String> COUNTRY_MAP = Map.of(
        "c1", "2020-02-01 12:00:00",
        "c2", "2020-02-01 13:00:00"
    );

    @Tool(description = "国家时间查询工具")
    public String getCurrentDateTimeByCountry(String country){
        return COUNTRY_MAP.getOrDefault(country, 
            LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    }
}

服务配置

McpServerApplication.java

@SpringBootApplication
publicclassMcpServerApplication {
    publicstaticvoidmain(String[] args){
        SpringApplication.run(McpServerApplication.class, args);
    }

    @Bean
    public ToolCallbackProvider tools(DateTimeTool tool){
        return MethodToolCallbackProvider.builder()
            .toolObjects(tool)
            .build();
    }
}

四、关键配置

4.1 客户端配置(application.properties)

application.properties

# 日志调试
logging.level.org.springframework.ai=DEBUG
logging.level.io.modelcontextprotocol=DEBUG

# OpenAI 配置
spring.ai.openai.base-url=${AI_BASE_URL}
spring.ai.openai.api-key=${API_KEY}
spring.ai.openai.chat.options.model=qwen-plus

# MCP 客户端配置
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.request-timeout=60s
spring.ai.mcp.client.root-change-notification=true
spring.ai.mcp.client.stdio.servers-configuration=classpath:mcp-service.json

4.2 服务端启动配置(mcp-service.json)

mcp-service.json


{
  "mcpServers": {
    "my-mcp-service": {
      "command": "java",
      "args": [
        "-Dspring.ai.mcp.server.stdio=true",
        "-Dspring.main.web-application-type=none",
        "-Dspring.main.banner-mode=off",
        "-Dlogging.pattern.console=",
        "-jar",
        "/home/admin/app/target/my-mcp-service.jar"
      ]
    }
  }
}

重要提示:必须禁用控制台输出,避免污染 stdio 输入流!

五、部署方案

5.1 打包配置(assembly.xml)

<assembly>
  <id>release</id>
  <formats><format>tar.gz</format></formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <!-- Client 打包 -->
    <fileSet>
      <directory>../mcp-client/target/</directory>
      <includes><include>*.jar</include></includes>
    </fileSet>
    
    <!-- Server 打包 -->
    <fileSet>
      <directory>../mcp-service/target/</directory>
      <includes><include>*.jar</include></includes>
    </fileSet>
  </fileSets>
</assembly>

整合 client/server 生成统一部署jar包,支持通过docker进行标准化部署。


六、注意事项

1.构建要求:

  • Maven 版本需与构建环境匹配;
  • 使用指定 JDK:baseline.jdk=ajdk-21

2.协议兼容:

  • 确保 stdio 通道纯净,避免日志污染;
  • 服务端需禁用 Web 上下文:-Dspring.main.web-application-type=none

3.异常处理:

  • 关注 stdio 通道的异常日志;
  • 建议超时设置 ≥60 秒:spring.ai.mcp.client.request-timeout=60s


来源  |  阿里云开发者公众号

作者  |  轻飏

相关文章
|
2月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
2083 65
|
2月前
|
SQL 人工智能 机器人
AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建
FastGPT 与 MCP 协议结合,打造工具增强型智能体新范式。MCP 如同 AI 领域的“USB-C 接口”,实现数据与工具的标准化接入。FastGPT 可调用 MCP 工具集,动态执行复杂任务,亦可作为 MCP 服务器共享能力。二者融合推动 AI 应用向协作式、高复用、易集成的下一代智能体演进。
364 0
|
2月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
3767 53
|
3月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
1764 58
|
2月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
1569 35
|
2月前
|
人工智能 IDE 开发工具
从6人日到1人日:一次AI驱动的客户端需求开发实战
从6人日到1人日:一次AI驱动的客户端需求开发实战
从6人日到1人日:一次AI驱动的客户端需求开发实战
|
2月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
|
2月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
2月前
|
Web App开发 人工智能 自然语言处理
利用Playwright MCP与LLM构建复杂的工作流与AI智能体
本文介绍如何通过Playwright MCP与大语言模型(LLM)结合,构建智能AI代理与自动化工作流。Playwright MCP基于Model Context Protocol,打通LLM与浏览器自动化的能力,实现自然语言驱动的网页操作。涵盖环境配置、核心组件、智能任务规划、自适应执行及电商采集、自动化测试等实战应用,助力高效构建鲁棒性强、可扩展的AI自动化系统。