大家好,我是直奔標杆!专注Java开发者AI转型干货分享,和各位同行一起从零基础吃透Spring AI,稳步向AI全栈工程师进阶,每一节课都力求落地实战、不讲虚的,今天咱们继续《Spring AI 零基础到实战》系列的第十九课,共同解锁MCP协议的核心奥秘,打破AI插件开发的耦合困局~

在前面几节课中,我们一起掌握了Spring AI中的Tool Calling能力,成功让大模型变身能查天气、发邮件的实用Agent,相信很多伙伴已经开始尝试将其应用到企业级开发中。

但实际开发中,大家大概率会遇到这样的难题:如果要开发一个企业级AI助手,需要让它读取Jira的工单、查询内网的MySQL数据库、搜索公司的文档库,甚至直接读取本地电脑上的系统日志……

难道我们要手写成百上千个@Tool注解?要逐一看懂外部系统的底层鉴权API,再写一堆冗余的HTTP Client胶水代码吗?更头疼的是,如果有另一个项目用Python、TS等其他语言开发,也需要这些功能,我们用Java辛辛苦苦写的几百个高度耦合的工具代码,就会面临全盘作废的尴尬!这就是AI时代最致命的耦合陷阱——“N × M 接口灾难”。

为了打破这个无解的死局,Anthropic公司提出了一个终极解决方案——MCP(Model Context Protocol,模型上下文协议)。本节课,我们就一起吃透MCP规范,最后手把手写代码,实操复用开源社区的通用能力,真正做到高效开发、少走弯路,和各位伙伴共同进步!

本节章节目标(吃透即进阶,建议收藏)

  • 认知重塑:看透传统AI插件开发模式的“N × M 灾难”死局,理解为何硬编码工具必将被淘汰,建立标准化开发思维。

  • 底层透视:解密MCP标准协议如何充当AI世界的“通用USB-C接口”,实现跨语言、跨系统的物理大一统,搞懂其核心价值。

  • 双重身份揭秘:剖析Spring AI的架构设计——它不仅能作为McpClient对接外部服务,更能原地化身McpServer对外提供能力,吃透Spring AI的灵活性。

  • 武器库与传输层:理解MCP暴露的核心原语,以及Stdio、Streamable-HTTP等底层传输协议的适用场景,避免开发踩坑。

  • 极简实战:通过流式HTTP机制,仅用几行YAML配置,快速接入魔搭社区(ModelScope)的远端MCP节点,实现0硬编码集成外部能力。

从“意大利面条”到“通用总线”:MCP的核心价值

做Java开发的伙伴都懂,耦合是代码维护的噩梦。传统AI插件开发中,不同语言的项目、不同的外部工具,都需要单独开发适配代码,就像一团杂乱的“意大利面条”,维护成本极高。

而MCP协议的出现,就彻底改变了这一现状——它将分散的AI孤岛生态,统一为井然有序的工业化标准,让不同语言、不同系统的工具,都能实现“即插即用”,就像我们电脑上的USB-C接口,不管是U盘、显示器还是充电器,只要符合标准,就能无缝连接。

什么是MCP?为什么它是AI时代的“USB-C”?

MCP的全称是模型上下文协议(Model Context Protocol),它是一种基于JSON-RPC 2.0的双向跨进程通信标准化协议,核心作用是让AI模型能够以极其结构化的方式,与外部工具和资源进行高效通信,打破语言和系统的壁垒。

用一个通俗的比喻,帮大家快速理解:

  • MCP Hosts(主机):不管是基于Java的Spring Boot项目,还是基于Python/TS的应用,只要内置了“Type-C母头”(也就是MCP Client),就具备了对接外部工具的能力。

  • MCP Servers(外设):不管是支付API、本地SQLite数据库,还是天气服务、菜谱工具(比如魔搭社区的HowToCook),只要提供商将其封装成遵守MCP标准的独立进程,就相当于具备了“Type-C公头”。

两者只要成功连接(无论同机还是跨网),主机就能自动读取外设暴露的“说明书”(工具描述、参数规范),实现无缝的双向调用!我们再也不需要针对每一种数据源,重复编写底层的鉴权和驱动代码,开源社区(如GitHub、魔搭)维护了大量现成的MCP Server,我们只需拿来即插即用,极大提升开发效率,这也是MCP协议的核心优势所在。

Spring AI的“双重身份”:既是Client,也是Server

很多伙伴可能不知道,Spring AI在MCP生态中,拥有“双重身份”——它不仅支持作为Client去连接别人的MCP Server,同时也能将我们自己的Spring Boot应用,暴露为标准的MCP Server,这也是Spring AI的强大之处,兼顾“拿来用”和“对外供”两种场景,贴合企业级开发的实际需求。

身份一:作为客户端(McpClient)

Spring AI提供了同步(McpSyncClient)和异步(McpAsyncClient)两种客户端,这意味着,我们只需让Spring Boot项目连上开源社区用各种语言写的MCP Server,我们的AI助手就能瞬间获得跨语言的系统接管能力,无需再手写适配代码,真正实现“一次配置,终身复用”。

身份二:作为提供者(McpServer)

我们写在Spring Boot里的那些@Tool方法、企业核心的私有Bean、JPA的数据接口,都可以被极其安全地暴露为标准MCP Server!这就意味着,哪怕是不懂Java的前端开发,直接用Cursor IDE就能原生调用我们写的内部核心业务逻辑,实现跨语言协作,打破团队开发的壁垒,这也是企业级开发中非常实用的功能点。

MCP Server的核心功能:不止于“工具调用”

当一个MCP Client成功连上MCP Server后,Server能提供的能力远不止简单的方法调用,它甚至能直接为大模型提供语料支持,全方位提升AI助手的能力,核心功能主要有5点,咱们逐一拆解,通俗易懂好记:

  1. Resources(资源):相当于大模型的“只读文件柜”。Server可以将本地系统的日志、数据库的Schema、公司文档等,以URI资源的形式暴露,大模型能直接读取这些静态数据充实记忆上下文,彻底告别手动拼接Prompt的繁琐操作,提升开发效率。

  2. Prompts(提示词):Server内部可以预定义一些专家级提示词模板(比如“分析当前数据库性能”“生成标准化测试用例”)。客户端(大模型)不必每次都自己写长篇大论的指令,直接拉取Server端定义好的Prompt模板并填入参数即可,极大保证了企业级操作的标准化,避免不同开发者写的Prompt不一致导致的结果偏差。

  3. Tools(工具):这就是我们前两节课手写的Function Calling的终极形态!Server会把它能执行的所有动作,包装成JSON Schema工具列表,大模型在思考后,下发指令触发远端Server的物理执行,并同步拿到执行结果,实现AI与外部工具的无缝协同。

  4. Completions(数据补全):为大模型提供类似IDE的自动补全能力。比如,用户输入“张”,调用对应的用户补全操作,可能会补充出张三、张三丰等内容,提升用户交互体验。

  5. Logging & Progress(日志与进度):支持长时间运行任务的进度条推送。在Spring AI中,我们可以极其优雅地使用@McpLogging和@McpProgress注解,接收远端任务的执行状态,方便问题排查和任务监控,贴合企业级开发的监控需求。

MCP Client对接方式:4种传输通道,按需选择不踩坑

基于Java的Spring Boot项目,和那些完全异构的MCP Server,在物理层面究竟是怎么握手的?Spring AI已经帮我们实现了协议规定的4种传输通道,各自有明确的适用场景,咱们结合实战场景,逐一说明,方便大家根据自己的项目需求选择:

1. Stdio (Standard Input/Output)

最基础的对接方式:Spring Boot会在宿主物理机上,通过执行底层命令行,唤醒并拉起一个伴生的独立子进程,双方通过操作系统的标准输入/输出流交换数据。适合本地开发、简单工具对接,部署简单,无需额外配置服务地址。

2. SSE (Server-Sent Events)

适合远端服务对接:MCP Server作为独立的Web进程部署在远端,Spring AI通过标准的HTTP POST发送指令,并通过持久化的SSE异步事件流,接收远端Server持续推送的执行状态(比如长时间任务的进度),适合需要异步监控的场景。

3. Streamable-HTTP

SSE协议的升级版本,允许MCP Server作为独立微服务部署,使用HTTP POST/GET处理请求,并内建SSE流通道,处理Server向Client的反向推送(如工具列表更新、进度汇报),兼容性更强,适合微服务架构场景。

4. Stateless Streamable-HTTP

专为简化部署设计,请求之间无需维护会话状态,非常适合微服务架构和云原生部署。注意:无状态服务器不支持向MCP客户端发送消息请求(如获取、采样、ping),大家根据自己的部署场景选择即可。

极简实战:3步接入魔搭社区MCP Server(0硬编码,直接复用)

理论讲再多,不如上手实操!接下来,我们就以魔搭社区(ModelScope)中的HowToCook(做饭指南)MCP Server为对接案例,手把手教大家,仅用几行配置,实现Spring AI对接远端MCP服务,体验“即插即用”的快感,代码可直接复制测试,新手也能轻松上手~

先说明:魔搭社区提供的HowToCook-MCP Server,核心功能是为AI助手提供菜谱推荐、膳食规划能力,我们通过对接它,就能让我们的Spring AI应用,瞬间拥有“私人大厨”能力,无需手写任何菜谱相关代码,完美体现MCP的优势。

第一步:引入MCP客户端依赖

在Spring Boot项目的pom.xml中,引入Spring AI MCP客户端依赖,这是对接MCP Server的“基础插件”,无需额外配置,引入即可使用:

<!-- Spring AI MCP 客户端依赖:大模型的通用总线插槽 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client&lt;/artifactId&gt;
&lt;/dependency&gt;

第二步:配置远程MCP Server地址(关键步骤,避免踩坑)

接下来,在application.yml中配置远程MCP Server的地址。魔搭社区提供的HowToCook-MCP Server地址,可通过访问https://www.modelscope.cn/mcp/servers/@worryzyy/howtocook-mcp获取。

这里有一个重要踩坑点:魔搭社区提供的完整SSE链接是https://mcp.api-inference.modelscope.net/xxx/mcp,但Spring AI底层协议解析时,默认的endpoint路径是/mcp,因此我们必须手动将域名和路径切开,否则会导致协议握手失败!正确配置如下:

spring:
  ai:
    mcp:
      client:
        streamable-http: # 声明使用 SSE (Server-Sent Events) 通信通道
          connections:
            howtocook-mcp: # 给这个远程连接起个名字,方便后续管理
              url: https://mcp.api-inference.modelscope.net
              endpoint: /xxx/mcp # 注意拆分!适配远程服务的真实路由,避免握手失败

第三步:编写对比测试代码,验证效果

Spring容器启动时,底层会自动通过HTTP SSE,与远端的魔搭MCP服务器进行JSON-RPC握手,并把远端所有的菜谱查询能力,自动映射为Java里的ToolCallbackProvider Bean,我们无需手动声明任何@Tool,直接注入使用即可。

下面我们写一段对比测试代码,看看“未挂载MCP”和“挂载MCP外设”的大模型,输出效果有何不同,直观感受MCP的强大:

/**
 * 直奔標杆 | Spring AI 零基础到实战系列
 * 本节课源码可直接复制测试,关注我,获取更多AI转型干货
 */
@SpringBootTest
public class TestMcp {

    @Autowired
    private ChatClient.Builder chatClientBuilder;

    // Spring AI 在启动时,会把远端 MCP Server 的工具全部拉取到这个 Bean 中,直接注入即可使用!
    @Autowired
    private ToolCallbackProvider toolCallbackProvider;

    @Test
    public void testMcpEffect() {
        // ========== 对比测试 1:未挂载 MCP 的普通大模型 ==========
        String noMcpResponse = chatClientBuilder.build().prompt()
                .user("为4人晚餐推荐菜单,要求参考 HowToCook 指南")
                .call()
                .content();

        System.out.println("【未挂载 MCP】回答:\n" + noMcpResponse);
      
        // ========== 对比测试 2:挂载了远端 MCP 外设的超级 Agent ==========
        String withMcpResponse = chatClientBuilder.build().prompt()
                .user("请使用 howtocook 的 MCP 服务,为我精准查询并推荐4人晚餐菜单")
                // 将远程拉取到的所有工具,一次性挂载给大模型!
                .toolCallbacks(toolCallbackProvider)
                .call()
                .content();

        System.out.println("【挂载 MCP 后】回答:\n" + withMcpResponse);
    }
}

运行结果解析(关键对比,吃透核心价值)

  • 【未挂载 MCP】回答:大模型只会根据自己的训练数据,给出一些泛泛的菜谱推荐,没有精准贴合HowToCook的菜谱规范,甚至可能出现食材搭配不合理的情况,比如: 为4人晚餐推荐菜单时,可以参考经典菜肴和易于准备的食谱。以下是一个简单而美味的菜单建议: ### 1. 开胃菜:香烤蒜香面包 - 使用切片法棍或意大利面包。 - 在面包上涂抹橄榄油,撒上剁碎的蒜末和少许盐。 - 在烤箱中烤至金黄色。

  • 【挂载 MCP 后】回答:大模型会直接调用MCP工具,依据HowToCook Server中提供的精准菜谱,给出贴合需求的推荐,食材搭配、做法都符合规范,比如: 为四位用餐者推荐的晚餐菜单如下: ### 荤菜: 1. **麻辣香锅** - 主要食材:青菜(如油菜、油麦菜、菠菜)、无骨肉(如猪肉、牛肉、鸡肉、鱼丸、火腿肠)、干豆腐、北京麻辣方便面、干辣椒。 - 调料:麻辣香锅调料。

重点强调:这个案例中,我们0行手写HTTP代码,0个@Tool手动声明,仅通过几行YAML配置,就实现了Spring Boot应用跨越网络,完美接管异构系统的能力,这就是MCP协议的魅力,也是未来AI Agent开发的主流方式!

本节课总结(重点提炼,加深记忆)

今天这节课,我们一起吃透了MCP协议的核心,也实操了Spring AI对接远端MCP Server的全过程,相信大家已经对MCP的价值和使用方式有了清晰的认知,这里给大家提炼3个核心要点,方便后续复习:

  1. MCP协议的核心是“标准化”,解决了传统AI插件开发的“N×M接口灾难”,实现跨语言、跨系统的工具复用,就像AI世界的“USB-C接口”。

  2. Spring AI拥有“双重身份”:既可以作为McpClient对接外部MCP Server,也可以作为McpServer对外暴露自身能力,灵活适配企业级开发的各种场景。

  3. MCP开发的核心优势是“即插即用”,无需重复编写底层适配代码,通过简单的配置,就能快速集成开源社区的通用能力,提升开发效率,降低耦合。

最后想和各位同行说一句:未来Agent开发,已经从“比拼谁手写的Java胶水代码多”,彻底跃迁到“谁能更优雅地集成优质的MCP Server开源生态”。掌握了MCP,就等于给我们的Spring Boot应用插上了真正无边界的“超级义体”,万物皆可互联!

下节预告(干货预警,值得期待)

调用别人的工具固然爽快,但这还远不能体现Spring AI的强大。

在第二十课:《案例干货:手写Spring AI MCP客户端与服务端双向实战》中,我们将准备大量实战案例干货,手把手教大家手写MCP客户端和服务端,实现双向通信,真正吃透MCP在Spring AI中的落地应用,彻底摆脱对第三方MCP Server的依赖!

精彩继续,咱们下节见!欢迎大家在评论区留言交流本节课的实操心得,有任何疑问,直奔標杆都会一一回复,和大家一起深耕技术、共同进步~

往期内容(循序渐进,逐步进阶)

  • Java开发者AI转型第十六课!赋能AI一双巧手!一行代码打通Tool Calling自动闭环状态机

  • Java开发者AI转型第十七课!SpringAI Tool Calling底层三剑客拆解与编程式注册源码实战

  • Java开发者AI转型第十八课!吃透Agent智能体:多工具协同与ReAct动态决策实战

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐