)
专栏Spring AI 探索手札个人主页手握风云目录一、MCP 概述1.1. MCP 的由来1.2. MCP 是什么1.3. MCP 能做什么二、MCP Java SDK 三层架构2.1. 三层核心架构2.2. 传输协议三、MCP 生态3.1. MCP Server3.2. MCP Client四、Spring AI 接入 MCP4.1. 项目初始化与基础依赖搭建4.2. 接入 MCP Server一、MCP 概述1.1. MCP 的由来当下 AI 应用生态快速发展涌现出大量需要大模型对接外部系统的业务场景例如智能助手调取地图获取位置数据、用户提问时系统联网检索资料或是企业内部多套 AI 应用共用同一套权限校验服务、知识库查询工具、审批流程接口。Tool Calling 工具调用能力虽然能够打破大模型纯文本生成的局限让模型主动发起外部系统调用以完成真实业务任务但随着工具数量持续增加、业务场景愈发复杂传统 Tool Calling 实现方案暴露出诸多工程层面的缺陷各类外部工具接口格式不统一开发人员需要为每一个外部服务单独编写专属解析逻辑工具名称、参数 Schema 等信息硬编码在模型内部无法动态识别新增工具整体方案跨平台适配能力不足。为解决以上一系列痛点模型上下文协议 MCP 作为一套全新标准应运而生MCP 并不会取代 Tool Calling而是为 Tool Calling 提供一套统一、可扩展、跨平台的底层连接基础设施相当于 Tool Calling 的标准化运行时。二者分工清晰Tool Calling 代表模型层面的决策行为由大模型自主判断是否需要调用工具、选择哪一个工具、传入何种参数MCP 则是标准化通信协议统一规定了工具描述方式、工具调用发起流程、返回结果传输规则以及会话状态全生命周期管理二者的关系可以类比 Web 开发里浏览器与 HTTP 协议浏览器决定访问哪个网页对应模型做出工具调用决策而 HTTP 协议负责底层数据传输对应 MCP 承载完整的工具通信流程。以旅游推荐机器人为例该机器人需要分别对接天气查询、景点检索、酒店预订三类独立服务三类服务分属不同团队维护交互规范各不相同有的采用 REST 接口、有的使用 gRPC返回数据格式有 XML 也有 JSON同时各自有专属头部鉴权规则如果没有 MCP开发者就要单独编写三套完整调用逻辑维护三套独立的异常处理机制开发与维护成本极高除此之外大模型本身无法理解 HTTP 请求构造、JSON 数据组装等底层逻辑仅能输出 “查询某地地址” 这类抽象意图接口请求、参数封装、返回结果解析全部需要人工额外开发而 MCP 恰好充当了 AI 与各类外部服务之间的统一翻译官与中介平台这也是 MCP 诞生的核心意义。1.2. MCP 是什么MCP 全称 Model Context Protocol模型上下文协议是一款用于连接 AI 应用与外部系统的开源标准协议依托该协议Claude、ChatGPT 等大模型驱动的 AI 应用能够对接多类外部资源涵盖本地文件、数据库等数据源搜索引擎、计算器等工具以及专用提示词这类工作流以此获取信息、完成实体任务。文档中将 MCP 类比为 AI 领域的 USB-C 通用接口就像 USB-C 统一了电子设备的充电与数据传输标准MCP 统一规范了 AI 与外部系统的对接方式在 MCP 出现前每一类 AI 工具想要接入日历、邮箱等外部服务都需要单独开发一套专属对接逻辑而遵循 MCP 标准后所有外部系统均可实现即插即用。MCP 能够实现双向数据流传输打通三类核心主体一是各类 AI 客户端应用包含 Claude 桌面端、LibreChat 对话界面、Claude Code、Goose 等代码编辑器工具二是各类数据源与文件系统例如 PostgreSQL、SQLite 数据库、GDrive 云盘三是开发、生产力类工具包含 Git、Sentry、Slack、谷歌地图等软件与服务依靠统一标准化协议完成多方双向通信。1.3. MCP 能做什么MCP 能够拓展大模型的能力边界官方文档列举了多种成熟落地场景。AI 智能代理可以读取用户的谷歌日历、Notion 文档打造高度个性化的私人助手Claude Code 能够读取 Figma 设计稿全自动生成完整网页应用企业对话机器人可打通组织内多套数据库支持用户用自然语言完成数据查询与分析大模型还能驱动 Blender 完成 3D 建模并联动 3D 打印机输出实体模型。综合来看MCP 赋予 AI 模型三类核心能力在用户授权前提下读取私人数据、调用各类专业工具执行实体任务、串联多工具链路自动完成复杂工作流。以企业数据分析场景为例当销售经理询问上月华南区销量下滑原因时AI 可通过 MCP 同时打通 CRM 客户系统、ERP 库存发货系统、企业内部邮件系统整合多维度数据定位出供应商延期交货缺货的核心问题还能自动生成可视化图表与业务优化建议文档。针对不同使用群体MCP 均具备显著实用价值。对开发者而言只需开发一套 MCP Server就能被所有兼容 MCP 标准的 AI 应用复用无需重复编写插件对 AI 产品厂商来说可快速接入海量社区工具低成本丰富产品功能、提升市场竞争力对普通用户而言AI 不再局限于单纯问答能够联动外部系统处理真实事务摆脱传统 “百科式机器人” 的局限。二、MCP Java SDK 三层架构MCP Java SDK 是模型上下文协议MCP的 Java 标准化实现支持同步、异步两种通信模式统一完成 AI 模型与外部工具、数据源的交互整体采用三层分层架构底层提供多种可替换的传输协议分层职责完全解耦灵活性与扩展性强。2.1. 三层核心架构分层层级核心组件核心能力与职责外卖场景类比Client/Server 顶层McpClient客户端AI 应用侧组件接收用户自然语言请求封装为标准 MCP 请求发送屏蔽底层网络、传输细节只关注业务调用需求点餐顾客 / 私人点餐助理McpServer服务端工具服务侧组件接收客户端请求执行工具逻辑地图、12306、自定义业务接口等处理完成后返回结构化结果麦当劳厨房 接单收银系统Session 中间层DefaultMcpSession1. 统一管理会话生命周期2. 为每个请求分配唯一编号避免多请求混淆、丢消息3. 跟踪会话全状态流转4. 支持异步并发多任务同时执行订单管理系统订单管家Transport 底层McpTransport1. 完成 Java 对象与 JSON-RPC 报文的序列化 / 反序列化2. 提供消息传输通道实现收发3. 屏蔽底层通信差异上层无需感知传输方式外卖骑手 消息传输管道完整消息通信流转流程首先用户向 AI 助手发起业务需求如查询西安天气随后 McpClient 将用户需求封装为标准 MCP 请求再由 DefaultMcpSession 创建会话、分配唯一请求 ID 并记录会话状态接着 McpTransport 将对象转为 JSON-RPC 报文通过指定通道完成报文发送远端 McpServer 接收报文并执行对应的工具逻辑最后工具执行结果沿原路径逐层向上回传最终由 McpClient 返回给大模型完成整套消息通信流转。2.2. 传输协议传输层提供 3 种独立通信方式底层消息统一采用 JSON-RPC 标准仅传输载体不同适配本地、远程、高并发响应式不同场景。Stdio 标准输入输出进程间通信原理是通过程序标准输入stdin、标准输出stdout完成进程内消息传输无网络依赖通信高效可以通俗类比为两个人面对面直接交谈适用于本地插件化 MCP Server、本地 jar 服务、本地开发调试。Java HttpClient SSE 客户端传输原理是基于 Java 原生 HttpClient 建立 HTTP 长连接接收服务端持续推送的 SSE 事件流通俗类比为微信实时聊天持续接收对方实时消息适用于独立部署远程 MCP 服务、普通同步 Web 项目。WebFlux SSE 客户端传输响应式 SSE原理是基于 Spring WebFlux 非阻塞响应式编程模型处理 SSE 流式消息支持高并发、动态实时推送通俗类比为导航实时路况持续动态更新拥堵、剩余里程同时监控多条路线适用于高并发、响应式 Reactive 后端项目。三、MCP 生态3.1. MCP ServerMCP Server 是提供标准化工具、资源、能力服务的服务端程序对外统一暴露符合 MCP 协议的工具接口供各类 MCP 客户端调用是 AI 获取外部能力的数据源与功能载体。MCP Server 社区MCP.so - MCP Marketplace这些平台按人气、功能分类检索 MCP 服务开发者可上架自研 MCP Server完善 MCP 生态。3.2. MCP ClientMCP Client 是连接 AI 应用 / 开发工具与 MCP Server 的桥梁它会读取配置、启动并连接远端 MCP 服务向大模型同步服务提供的 Tools、Resources、Prompts 能力接收模型的工具调用指令并转发至 MCP Server 执行最后接收工具返回的结果回传给大模型来生成最终回答。含义Tools工具调用能力能否调用 MCP 服务提供的业务功能查天气、查车票、浏览器操作绝大多数客户端支持Resources资源访问读取 MCP 服务托管的文件、数据库、知识库等数据Prompts标准化提示模板加载 MCP 服务预设的可复用 Prompt 模板Sampling多结果采样生成多套候选答案择优输出Roots资源权限隔离限制 AI 可访问的文件根目录安全管控四、Spring AI 接入 MCP4.1. 项目初始化与基础依赖搭建创建 mcp-client-demo引入 Spring AI Alibaba 的模块dependencies !-- Spring Boot Web 基础接口开发必备 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- WebFlux 响应式组件流式对话/流式语音推荐引入 -- dependency groupIdorg.springframework/groupId artifactIdspring-webflux/artifactId /dependency !-- Spring Boot 单元测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !-- Spring AI Alibaba 核心启动器整合百炼全能力对话/图像/语音/视频 -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter-dashscope/artifactId /dependency !--mcp client-- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-client/artifactId /dependency /dependencies dependencyManagement dependencies !-- Spring AI Alibaba 版本统一管理BOM -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-bom/artifactId version1.0.0.2/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement基础配置spring: ai: dashscope: api-key: DASHSCOPE_API_KEY启动类package com.yang.mcp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class McpClientDemo { public static void main(String[] args) { SpringApplication.run(McpClientDemo.class, args); } }聊天接口package com.yang.mcp.controller; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/chat) public class ChatController { private ChatClient chatClient; public ChatController(DashScopeChatModel chatModel) { this.chatClient ChatClient.builder(chatModel).build(); } RequestMapping(/generate) public String generate(String message) { return chatClient.prompt() .user(message) .call() .content(); } }4.2. 接入 MCP Server在 application.yml 补充 MCP 客户端全局参数spring: ai: mcp: client: # 请求超时 request-timeout: 60000 stdio: # 指定 stdio 传输模式的 MCP 服务配置文件路径 servers-configuration: classpath:/mcp/mcp-servers-config.json # 开启 MCP 客户端日志 logging: pattern: console: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n file: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n level: io: modelcontextprotocol: client: DEBUG spec: DEBUGMCP 服务 JSON 配置文件{ mcpServers: { playwright: { command: npx.cmd, args: [ -y, playwright/mcplatest ] }, baidu-map: { command: npx.cmd, args: [ -y, baidumap/mcp-server-baidu-map ], env: { BAIDU_MAP_API_KEY: YOUR_API_KEY } } } }commandWindows 环境需写npx.cmd避免命令识别失败args执行百度地图 MCP npm 包env注入百度地图开放平台申请的BAIDU_MAP_API_KEY密钥绑定 MCP 工具到 ChatClient首先注入框架自动生成的 ToolCallbackProvider也就是 MCP 工具回调提供者接着在构建 ChatClient 的时候调用 .defaultToolCallbacks(toolCallbackProvider) 方法完成将所有 MCP 标准化工具注册给大模型的操作如果移除这项配置MCP 工具就会失效大模型也就无法调用外部服务。public ChatController(DashScopeChatModel chatModel, ToolCallbackProvider toolCallbackProvider) { this.chatClient ChatClient.builder(chatModel) .defaultToolCallbacks(toolCallbackProvider) .build(); }测试接口http://127.0.0.1:8080/chat/generate?message查询天安门的坐标。