【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务

简介: 本章从 MCP Client 视角说明如何连接上一章提供的本地服务,并把远端工具接入 ChatClient。重点讲解 Streamable-HTTP 配置、ToolCallbackProvider 的注入方式,以及模型如何通过 JSON-RPC 消息完成工具调用与结果回传。

第十五章 MCP Client 调用本地服务

版本标注

  • Spring AI: 1.1.2
  • Spring AI Alibaba: 1.1.2.0

章节定位

  • 第十四章负责提供本地 MCP 服务。
  • 这一章负责连接这个服务,并把远端工具接入当前应用。

s01 > s02 > s03 > s04 > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > [ s15 ] s16 > s17 > s18


一、本章要做什么

上一章已经把天气能力作为 MCP Server 暴露出来,这一章的任务就是连接这个服务,并把它提供的工具注册给 ChatClient。完成后,模型在回答问题时就可以主动调用上一章中的天气工具。

这一步的重点不在服务端,而在客户端接入。

二、配置文件

本章的 application.yml 中,MCP Client 相关配置如下:

server:
  port: 8015

spring:
  application:
    name: mcp-client-demo

  ai:
    dashscope:
      api-key: ${
   DASHSCOPE_API_KEY}

    mcp:
      client:
        type: async
        request-timeout: 60s
        toolcallback:
          enabled: true

        streamable-http:
          connections:
            mcp-server1:
              url: http://localhost:8014
              endpoint: /mcp

这里的含义很直接:当前应用作为 MCP Client,通过 Streamable-HTTP 方式连接运行在 8014 端口上的本地服务。配置中的 url 是服务基础地址,endpoint 则是客户端真正连接的协议端点。它和上一章服务端配置中的 protocol: STREAMABLE 是一一对应的:服务端负责暴露 Streamable-HTTP 能力,客户端负责连接这个 Streamable-HTTP 端点。

三、配置类

最终跑通后的配置类如下:

package cn.edu.nnu.opengms.config;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SaaLLMConfig {
   

    @Bean("mcpChatClient")
    public ChatClient mcpChatClient(
            ChatModel chatModel,
            ToolCallbackProvider tools)
    {
   
        return ChatClient.builder(chatModel)
                .defaultToolCallbacks(tools.getToolCallbacks())
                .build();
    }
}

这段代码只表达一件事:把 MCP Client 发现到的远端工具回调注册给 ChatClient

这里使用的是 defaultToolCallbacks(...),因为当前注册的不是本地工具对象,而是框架已经整理好的工具回调。

四、控制器

控制器代码如下:

package cn.edu.nnu.opengms.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class McpClientController {
   
    @Resource
    private ChatClient chatClient;

    @Resource
    private ChatModel chatModel;

    @GetMapping("/mcpclient/chat")
    public Flux<String> chat(@RequestParam(name = "msg", defaultValue = "北京") String msg)
    {
   
        System.out.println("使用了mcp");
        return chatClient.prompt(msg).stream().content();
    }

    @RequestMapping("/mcpclient/chat2")
    public Flux<String> chat2(@RequestParam(name = "msg", defaultValue = "北京") String msg)
    {
   
        System.out.println("未使用mcp");
        return chatModel.stream(msg);
    }
}

这里的 chatClient 实际上就是配置类中定义的 mcpChatClient Bean,因此 /mcpclient/chat 走的是带 MCP 工具能力的调用链。

/mcpclient/chat2 则直接使用 ChatModel,不会触发 MCP 工具。

如果希望代码语义更明确,也可以写成:

@Resource(name = "mcpChatClient")
private ChatClient mcpChatClient;

五、MCP Client 调用本地服务的原理

这一章真正需要理解的,不只是配置项怎么写,而是客户端和服务端到底是怎样连起来的。

Spring AI 官方对自己的定位是:把企业中的 DataAPIs 接到 AI Models 上。MCP 在这里扮演的就是标准桥梁。它不是简单的“远程调用工具”,而是把工具发现、能力协商、消息交换和调用结果回传都统一到了同一套协议里。

从 Spring AI 和 MCP Java SDK 的结构来看,这条链路可以分成三层:

  1. 客户端/服务端层
    这一层的角色分别是 McpClientMcpServer。客户端负责建立连接、初始化会话、发现服务端能力;服务端负责暴露工具、资源和提示模板,并处理客户端发来的调用请求。

  2. 会话层
    这一层由 McpSession 负责维护会话状态。客户端启动后,不是每次调用工具都重新“临时拼一个 HTTP 请求”,而是先建立 MCP 会话,再在会话中完成后续的协议交互。

  3. 传输层
    这一层负责真正的消息收发和 JSON-RPC 编解码。Spring AI 文档里明确说明,MCP 支持 STDIOSSEStreamable-HTTP 等多种传输方式。本章客户端连接的是服务端提供的 Streamable-HTTP 端点。

5.1 本章里的连接是怎么建立的

本章配置的是:

spring:
  ai:
    mcp:
      client:
        streamable-http:
          connections:
            mcp-server1:
              url: http://localhost:8014
              endpoint: /mcp

根据 Spring AI MCP Client Starter 文档,Streamable-HTTP 连接配置由两部分组成:

  1. url
    这是服务端的基础地址,例如 http://localhost:8014

  2. endpoint
    这是 Streamable-HTTP 端点路径。官方文档给出的默认值是 /mcp。如果没有显式配置,客户端会按默认值去拼接。

也就是说,本章这条配置最终连接的并不是单纯的根路径,而是基于基础地址和 Streamable-HTTP 端点拼出来的服务入口。服务端上一章显式声明了 protocol: STREAMABLE,客户端这一章再通过 endpoint: /mcp 去连接它,这样两边的配置就能完整对上。

5.2 连接成功后,客户端做了什么

客户端启动后,并不是立刻让模型开始调工具,而是会先完成一次 MCP 初始化过程。这个过程通常包括:

  1. 建立到服务端的 Streamable-HTTP 连接
  2. 完成协议初始化
  3. 进行版本和能力协商
  4. 拉取服务端已经暴露的工具列表

Spring AI 的 MCP Client Starter 在 toolcallback.enabled=true 时,会把这些发现到的远端工具整理成 ToolCallbackProvider。这也是为什么本章最终可以直接注入:

ToolCallbackProvider tools

这一步完成后,当前应用就已经知道:服务端提供了哪些工具、每个工具叫什么、需要什么参数、调用后会返回什么结果。

5.3 模型调用工具时,消息是怎样流动的

真正进入对话时,链路是这样的:

用户问题
  -> ChatClient
  -> ChatModel
  -> 模型判断需要调用远端工具
  -> ToolCallbackProvider 中对应的 MCP 工具回调
  -> MCP Client 通过会话发送 JSON-RPC 消息
  -> MCP Server 接收请求并执行本地工具方法
  -> 服务端返回工具执行结果
  -> ChatClient 将结果交回模型
  -> 模型组织最终回答

其中最关键的两个动作是:

  1. 发送消息
    客户端不会直接去调用上一章中的 Java 方法,而是把工具名称、参数等信息封装为 MCP 协议消息,通过 Streamable-HTTP 连接发给服务端。Spring AI 文档说明,底层传输层负责 JSON-RPC 消息的序列化和反序列化。

  2. 接收结果
    服务端执行完工具方法后,会把结果再按 JSON-RPC 消息返回给客户端。客户端拿到结果后,不是直接把原始数据返回给用户,而是继续交给当前对话链路中的模型,让模型基于工具结果生成最终自然语言回答。

所以从用户角度看,好像只是“模型回答了一个天气问题”;但实际内部已经发生了一次完整的 MCP 会话消息交换。

5.4 为什么这里既像远程调用,又不像普通 HTTP 接口

因为 MCP 不只是一个“请求某个 URL 然后拿 JSON”的简单接口,它本身还负责:

  • 能力发现
  • 协议初始化
  • 工具描述统一
  • 调用消息标准化
  • 结果回传

普通 HTTP 接口只解决“发请求、拿响应”,而 MCP 解决的是“AI 应用如何以统一协议理解并调用外部能力”。这也是为什么这一章里,客户端只要拿到 ToolCallbackProvider,后面的工具调用就可以直接挂到 ChatClient 上,而不需要手写一套天气接口适配逻辑。

5.5 为什么这里改用 Streamable-HTTP

这一章最开始也可以用 SSE 跑通,但最终改成 Streamable-HTTP 更合适,主要有两个原因。

第一,Spring AI 官方文档已经把 Streamable-HTTP 作为更推荐的方向来描述。它比早期的 SSE 方案更贴近 MCP 后续演进的主线,因此用它来写当前版本的笔记,稳定性和可迁移性都会更好一些。

第二,Streamable-HTTP 的配置语义更清楚。客户端配置里直接写基础地址和 endpoint,服务端则显式切到 STREAMABLE 协议,阅读成本比 SSE 场景下去理解默认 /sse 端点更低。对于这一章这种本地联调案例,这种写法更容易把“服务地址”和“协议端点”区分开。

六、测试方式

启动顺序如下:

  1. 先启动上一章中的本地 MCP 服务
  2. 再启动当前客户端应用

测试接口:

http://localhost:8015/mcpclient/chat?msg=上海天气怎么样
http://localhost:8015/mcpclient/chat2?msg=上海天气怎么样

这两条接口的差异很清楚:

  • /mcpclient/chat:带 MCP 工具能力
  • /mcpclient/chat2:只用模型本身回答

如果链路已经打通,/mcpclient/chat 的返回会带上上一章天气工具中的固定结果;如果没有调通,通常会返回“无法实时获取天气信息”这类模型自答内容。

七、本章小结

这一章的核心就是把远端 MCP 工具接到本地对话链路里。对应到代码层面,关键实现只有这一句:

.defaultToolCallbacks(tools.getToolCallbacks())

它把上一章暴露出来的工具能力真正注册给了 ChatClient。之后模型在回答问题时,就具备了调用本地 MCP 服务的能力。


本章重点

  1. 当前应用的角色是 MCP Client,不再负责定义工具。
  2. ToolCallbackProvider 提供的是远端工具回调集合。
  3. defaultToolCallbacks(...) 是当前项目最终跑通的接入方式。

下章剧透(s16):

本地 MCP 服务联通后,下一章继续扩展到第三方 MCP 服务接入。


📝 编辑者:Flittly
📅 更新时间:2026年4月
🔗 相关资源MCP 官方文档 | Spring AI MCP

目录
相关文章
|
存储 人工智能 Java
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
本章深度解析 Spring AI 中 `ChatModel`(底层接口)与 `ChatClient`(高级封装)的本质区别:前者如“手动挡”,精准控制但需写大量样板代码;后者似“智能点餐机”,链式调用、支持系统提示、模板、工具调用等,开发高效。初学者推荐优先使用 `ChatClient`。
179 0
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
|
28天前
|
存储 人工智能 关系型数据库
OpenClaw怎么可能没痛点?用RDS插件来释放OpenClaw全部潜力
OpenClaw插件是深度介入Agent生命周期的扩展机制,提供24个钩子,支持自动注入知识、持久化记忆等被动式干预。相比Skill/Tool,插件可主动在关键节点(如对话开始/结束)执行逻辑,适用于RAG增强、云化记忆等高级场景。
812 56
OpenClaw怎么可能没痛点?用RDS插件来释放OpenClaw全部潜力
|
13天前
|
人工智能 Linux API
OpenClaw多Agent协作系统实操:本地+阿里云部署与千问/Coding Plan API配置全指南
2026年OpenClaw(原Clawdbot)推出的多Agent协作系统,彻底打破了单一AI智能体的能力边界,让多个AI Agent像人类团队一样实现智能分工、实时信息同步与灵活角色配置,可高效完成内容创作、软件开发、数据分析等复杂复合型任务。在实际落地过程中,开发者不仅需要掌握多Agent协作系统的基础使用逻辑,更需要完成OpenClaw在本地多系统(MacOS/Linux/Windows11)与阿里云的稳定部署,同时实现与阿里云千问大模型API、免费Coding Plan API的无缝对接,才能真正发挥多Agent协作的核心价值。本文将深度解析OpenClaw多Agent协作系统的核心
797 10
|
13天前
|
人工智能 Linux API
阿里云+本地全平台部署OpenClaw|iMessage集成+大模型千问/Coding Plan API+避坑指南
2026年,AI自动化框架OpenClaw(原Clawdbot)凭借云端+本地双部署、多模型兼容与iMessage深度集成能力,成为连接苹果生态与AI能力的核心工具。阿里云提供轻量服务器、ECS、计算巢三种一键部署方案,本地支持MacOS、Linux、Windows11全系统运行,搭配阿里云千问大模型、免费Coding Plan API,可实现iMessage消息收发、自然语言交互、任务自动化执行,满足个人效率管理、移动AI助手、轻量业务开发等场景需求。
193 14
阿里云+本地全平台部署OpenClaw|iMessage集成+大模型千问/Coding Plan API+避坑指南
|
2天前
|
弹性计算 人工智能 Linux
阿里云ECS/轻量服务器部署 OpenClaw 图文攻略:Slack集成+千问Qwen3.6-Plus与Coding Plan配置教程
本文完整覆盖2026年**阿里云轻量服务器/ECS云服务器部署OpenClaw、本地MacOS/Linux/Windows11全平台搭建、千问Qwen3.6-Plus付费API与免费Coding Plan双模型配置、Slack全球协作工具集成**四大核心流程,搭配全场景高频问题排查方案,所有命令均为实测可直接复制,无需复杂操作即可完成部署。
172 18
|
4天前
|
Windows
Notepad++ 8.6 文本编辑器安装教程:详细步骤+自定义路径+桌面快捷方式
Notepad++是一款免费、轻量且功能强大的文本编辑器,支持多种编程语言,具备语法高亮、代码折叠等特性。本指南详解v8.6版的下载、解压、管理员安装、路径自定义及快捷方式设置,助您快速完成安装并启动使用。(239字)
|
17天前
|
缓存 JavaScript 安全
一文告诉你 Windows 彻底卸载 OpenClaw+ClawHub+飞书机器人 完整版指南 删干净、不留痕迹、无后门 让疯狂燃烧的 token停下来
本文详解Windows下彻底卸载OpenClaw及ClawHub的完整流程:停止网关服务、全局卸载npm包、清理缓存与全部配置文件(含`.openclaw`等隐藏目录)、卸载ClawHub、验证命令失效,并同步删除飞书开放平台应用,确保零残留。
1136 2
一文告诉你 Windows 彻底卸载 OpenClaw+ClawHub+飞书机器人 完整版指南 删干净、不留痕迹、无后门 让疯狂燃烧的 token停下来
|
15天前
|
Java 应用服务中间件 Maven
5-微服务篇-1
本文详解SpringBoot核心机制:①自动装配原理——通过@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→spring.factories加载条件化配置类;②启动流程三阶段:初始化、上下文创建、自动配置;③常用起步依赖、配置文件类型(properties/YAML)及加载优先级;④四种运行方式。
|
27天前
|
人工智能 安全 Linux
小龙虾AI🦞 OpenClaw理性使用指南(阿里云/本地部署+免费Coding Plan API成本控制+安全防护+避坑手册)
“睡一觉赚大钱”“一人公司坐拥10个AI员工”“500元上门安装”——2026年开春,OpenClaw(曾用名Clawdbot)被流量裹挟成“暴富神话”。社交平台上,代安装服务报价从几百元飙升至数千元,大厂甚至下场举办“公益装机”活动;但另一面,真实用户面对每月1.5万甚至2.6万的API账单崩溃发问:“为什么不直接雇实习生?”
425 10

热门文章

最新文章