当前位置: 首页 > article >正文

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用

Spring AI Alibaba MCP协议实战模型上下文协议集成与工具调用导读MCPModel Context Protocol模型上下文协议是 Anthropic 于 2024 年末发布的开放标准旨在解决 AI 工具调用的碎片化问题。Spring AI Alibaba 1.1 版对 MCP 提供了完整支持。本文深入讲解 MCP 的三层架构、服务端开发、客户端接入以及与 Python MCP Server 的跨语言互通。一、MCP 的诞生背景在 MCP 出现之前每个 AI 应用都需要为自己的工具调用写一套独立的集成代码。你用的是通义千问我用的是 GPT他用的是 Claude各自的工具接口不通无法复用——这就是 AI 工具生态碎片化的现状。MCP 的价值在于定义了一套统一的工具调用协议类似于 REST API 之于 Web 服务的地位没有 MCP碎片化 Application A ←→ 自定义集成 ←→ Tool 1 Application B ←→ 自定义集成 ←→ Tool 2 Application C ←→ 自定义集成 ←→ Tool 3 有了 MCP标准化 Application A ──┐ Application B ──┤←→ MCP Protocol ←→ MCP ServerTool 1 Tool 2 Tool 3 Application C ──┘二、MCP 三层架构------------------- MCP Protocol ------------------ | Host宿主层 | ←←←←←←←←←←←←←←←←←← | Server服务层 | | | →→→→→→→→→→→→→→→→→→ | | | - AI 应用 | | - 工具实现 | | - 管理 Client | --------------- | - 资源暴露 | ------------------- | Client客户层| | - Prompt 模板 | | | - 工具发现 | ------------------ --→ 创建 Client → | - 工具调用 | | - 资源访问 | --------------- 传输协议 Stdio标准输入输出本地进程通信适合本地工具 SSEServer-Sent EventsHTTP 长连接适合远程服务 WebSocket双向通信适合高频实时交互三种能力类型MCP Server 可以暴露Tool可调用的函数最常用Resource可读取的资源如文件、数据库Prompt预定义的提示模板如角色扮演模板。三、依赖配置3.1 Server 端依赖!-- Spring AI MCP Server提供工具服务--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-mcp-server-spring-boot-starter/artifactId/dependency!-- SSE 传输模式需要 Web 支持 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency3.2 Client 端依赖!-- Spring AI MCP Client消费工具服务--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-mcp-client-spring-boot-starter/artifactId/dependency!-- DashScope 模型 --dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-dashscope/artifactId/dependency四、MCP Server 开发4.1 基于 SSE 传输的 MCP Serverpackagecom.example.mcp.server;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.ai.tool.annotation.ToolParam;importorg.springframework.stereotype.Component;importlombok.extern.slf4j.Slf4j;/** * 天气查询 MCP 工具 * 通过 MCP 协议暴露给任何兼容的 AI 应用 */Slf4jComponentpublicclassWeatherMcpTool{/** * 获取城市天气 * Tool 注解的方法会自动通过 MCP 协议暴露为工具 */Tool(description获取指定城市的实时天气信息包括温度、天气状况、湿度、风力等)publicWeatherInfogetWeather(ToolParam(description城市名称支持中文如北京、上海)Stringcity){log.info([MCP Tool] 天气查询{},city);// 实际项目调用真实天气 API和风天气、高德天气等returnnewWeatherInfo(city,晴转多云,22.5,68,东南风 3级);}/** * 获取天气预报未来 N 天 */Tool(description获取城市未来几天的天气预报最多7天)publicStringgetWeatherForecast(ToolParam(description城市名称)Stringcity,ToolParam(description预报天数1-7之间)intdays){log.info([MCP Tool] 天气预报查询{} 未来{}天,city,days);StringBuildersbnewStringBuilder(city).append( 未来).append(days).append(天预报\n);String[]conditions{晴,多云,阴,小雨,晴,多云,晴};int[]temps{22,20,18,16,19,21,23};for(inti0;iMath.min(days,7);i){sb.append(String.format(第%d天%s气温约%d°C\n,i1,conditions[i],temps[i]));}returnsb.toString();}publicrecordWeatherInfo(Stringcity,Stringcondition,doubletemperature,inthumidity,Stringwind){}}/** * 数据库查询 MCP 工具 */Slf4jComponentRequiredArgsConstructorpublicclassDatabaseMcpTool{privatefinalUserRepositoryuserRepository;privatefinalOrderRepositoryorderRepository;Tool(description根据用户ID查询用户基本信息)publicStringgetUserInfo(ToolParam(description用户ID)StringuserId){returnuserRepository.findById(userId).map(u-String.format(用户%s, 邮箱%s, 注册时间%s,u.getName(),u.getEmail(),u.getCreatedAt())).orElse(用户 userId 不存在);}Tool(description查询用户最近的订单记录)publicStringgetRecentOrders(ToolParam(description用户ID)StringuserId,ToolParam(description查询条数1-20之间)intlimit){ListOrderordersorderRepository.findByUserIdOrderByCreatedAtDesc(userId,PageRequest.of(0,Math.min(limit,20)));if(orders.isEmpty())return暂无订单记录;returnorders.stream().map(o-String.format(订单%s%s ¥%.2f [%s],o.getId(),o.getProductName(),o.getAmount(),o.getStatus())).collect(Collectors.joining(\n));}}4.2 Server 配置# application.ymlMCP Server 端spring:application:name:mcp-weather-serverai:mcp:server:# 服务名称客户端用于标识此 Servername:weather-and-database-tools# 版本version:1.0.0# 传输模式SSEHTTP 或 STDIO标准输入输出transport:SSE# 服务描述description:提供天气查询和数据库查询能力的 MCP Serverserver:port:8090启动后MCP Server 会自动在以下端点暴露工具信息GET /mcp/tools- 查询可用工具列表POST /mcp/call- 调用工具五、MCP Client 接入5.1 配置 MCP Client# application.ymlMCP Client 端spring:ai:mcp:client:# 配置多个 MCP Serverservers:# 本地天气服务SSE 模式weather-server:transport:SSEurl:http://localhost:8090# 超时配置connection-timeout:5srequest-timeout:30s# 远程数据分析服务SSE 模式analytics-server:transport:SSEurl:https://analytics.internal.company.com/mcp# 本地 Python MCP ServerStdio 模式python-tools:transport:STDIOcommand:pythonargs:[-m,my_mcp_server]5.2 在 ChatClient 中使用 MCP 工具ServiceRequiredArgsConstructorSlf4jpublicclassMcpChatService{privatefinalChatClientchatClient;// Spring AI 自动注入所有已配置的 MCP 工具privatefinalListMcpSyncClientmcpClients;/** * 使用 MCP 工具的智能对话 * Spring AI 自动处理 MCP 工具的发现和调用 */publicStringchatWithMcpTools(Stringmessage){log.info(使用 MCP 工具处理消息{},message);// 获取所有 MCP 工具的 ToolCallbackProviderListToolCallbackmcpToolCallbacksmcpClients.stream().flatMap(client-{// 工具发现获取 Server 暴露的所有工具vartoolsResultclient.listTools();returntoolsResult.tools().stream().map(tool-McpFunctionCallback.builder().mcpClient(client).tool(tool).build());}).collect(Collectors.toList());returnchatClient.prompt().user(message).tools(mcpToolCallbacks.toArray(newToolCallback[0])).call().content();}/** * 动态工具发现运行时查询 MCP Server 可用工具 */publicListStringdiscoverTools(){returnmcpClients.stream().flatMap(client-{StringserverNameclient.getServerInfo().name();returnclient.listTools().tools().stream().map(tool-serverName/tool.name()tool.description());}).collect(Collectors.toList());}}六、与 Python MCP Server 跨语言互通MCP 的一大优势是语言无关性。Python 社区有大量优秀的 MCP Server 实现如代码执行、数据分析等可以直接从 Java 侧接入# 接入 Python MCP ServerStdio 模式spring:ai:mcp:client:servers:python-analyzer:transport:STDIO# 启动 Python MCP Server 进程command:/usr/bin/python3args:[/opt/mcp-servers/data-analyzer/main.py]# 环境变量传入数据库连接等配置environment:DB_HOST:localhostDB_PORT:5432Python 侧 MCP Server 示例仅供理解协议不做重点展开# main.py - Python MCP Server 示例结构frommcp.serverimportServerfrommcp.server.stdioimportstdio_server appServer(data-analyzer)app.call_tool()asyncdefanalyze_data(name:str,arguments:dict)-list:ifnamerun_sql:queryarguments[query]# 执行 SQL 并返回结果return[{type:text,text:f查询结果:{execute_sql(query)}}]asyncdefmain():asyncwithstdio_server()asstreams:awaitapp.run(*streams,app.create_initialization_options())Java 侧通过 Stdio 模式调用 Python Server完全透明。七、安全机制7.1 Server 端安全隔离spring:ai:mcp:server:# 启用工具白名单只允许调用指定工具tool-whitelist:-getWeather-getWeatherForecast-getUserInfo# 不在列表中的工具不对外暴露# 启用请求鉴权security:enabled:trueapi-key:${MCP_SERVER_API_KEY}7.2 Client 端权限控制ConfigurationpublicclassMcpSecurityConfig{/** * MCP Client 请求拦截器添加认证头 */BeanpublicMcpClientCustomizermcpClientCustomizer(){return(clientBuilder)-clientBuilder// 为每个 MCP 请求添加认证 Header.requestInterceptor(request-{request.headers().add(X-MCP-API-Key,System.getenv(MCP_SERVER_API_KEY));returnrequest;})// 请求超时.requestTimeout(Duration.ofSeconds(30));}}八、企业内部 MCP Registry大型企业可以构建内部的 MCP 工具注册中心统一管理所有 MCP Server/** * MCP Registry企业内部工具注册中心 */RestControllerRequestMapping(/api/mcp/registry)RequiredArgsConstructorpublicclassMcpRegistryController{privatefinalMcpRegistryServiceregistryService;/** * 注册新的 MCP Server */PostMapping(/register)publicResponseEntityMcpServerInforegister(RequestBodyMcpServerRegistrationregistration){McpServerInfoinforegistryService.register(registration);returnResponseEntity.ok(info);}/** * 查询所有可用的 MCP Server 和工具 */GetMapping(/discover)publicResponseEntityListMcpServerInfodiscover(RequestParam(requiredfalse)Stringcategory,RequestParam(requiredfalse)Stringkeyword){returnResponseEntity.ok(registryService.discover(category,keyword));}/** * 健康检查验证所有注册的 MCP Server 是否在线 */GetMapping(/health)publicResponseEntityMapString,StringhealthCheck(){returnResponseEntity.ok(registryService.checkAllHealth());}}九、总结MCP 正在成为 AI 工具生态的通用插座本文的核心收获MCP 三层架构Host宿主→ Client客户端→ Server工具服务传输协议Stdio 适合本地进程SSE 适合远程 HTTP 服务三种能力Tool可调用函数、Resource可读资源、Prompt模板Server 开发Tool注解 Spring Boot几行代码构建 MCP Server跨语言互通通过 Stdio 模式接入 Python、Node.js 等语言的 MCP Server安全机制工具白名单 API Key 认证防止未授权访问。下一篇将进入 Deep Research 自动化调研领域探讨如何利用 Spring AI Alibaba 1.1 的推理模式实现多步骤深度研究报告自动生成。参考资料MCP 官方规范文档Spring AI MCP 集成文档Spring AI Alibaba MCP 示例

相关文章:

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用 导读:MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年末发布的开放标准,旨在解决 AI 工具调用的碎片化问题。Spring AI …...

嵌入式信号发生器库:高精度方波生成与载波调制

1. SignalGenerator 库概述SignalGenerator 是一个轻量级、可移植的嵌入式信号发生器开源库,专为资源受限的微控制器设计。其核心目标是在任意 GPIO 引脚上生成高精度、可编程的方波信号,同时支持载波调制(Carrier Modulation)功能…...

XPath 语法完全指南:从基础语法到 SQL 注入中的应用

爬虫、处理过配置文件、或者接触过 MySQL 的 XML 函数的一定都见过 XPath 这个名词。它是一种专门用来在 XML 文档中“寻址”的语言,语法像文件路径一样直观。同时,XPath 是 Web 安全领域中 SQL 报错盲注中的关键角色。一、XPath 是什么?XPat…...

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署+对话记忆管理+审计日志扩展接口

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署对话记忆管理审计日志扩展接口 想在企业内部部署一个既智能又安全的对话AI吗?今天我们来聊聊如何基于南北阁 Nanbeige 4.1-3B 模型,打造一个功能完备的企业级对话应用。这个方案不仅支持纯本…...

保姆级教程:用Python+Robotics Toolbox搞定Panda机械臂的DH建模与正逆解(附避坑指南)

从零实现Panda机械臂运动学:Python Robotics Toolbox实战指南 机械臂控制是机器人领域的核心技术之一,而运动学建模则是实现精准控制的基础。本文将带您使用Python的Robotics Toolbox,一步步完成Franka Emika Panda机械臂的DH参数建模、正运动…...

【JSReverser-MCP】一句话逆向猿人学21题

近期听闻AI可以做逆向了,于是赶紧来试一试。 相关参考: vibe coding 氛围编程 Vibe coding 用 AI 做 JS 逆向食用教程 JSReverser-MCP 源:https://github.com/NoOne-hub/JSReverser-MCP 安装 环境要求 nodejs v22及以上 已部署Claude code或codex…...

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳!

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳! 1. 引言:语音克隆技术的新突破 在数字内容爆炸式增长的今天,个性化语音合成技术正成为内容创作者、企业客服、教育机构等领域的刚需。传统语音克隆方案往往需要数小…...

Adafruit ICM20X库详解:ICM20649与ICM20948驱动开发指南

1. 项目概述 Adafruit ICM20X 是 Adafruit 官方维护的 Arduino 兼容库,专为 TDK InvenSense 公司推出的 ICM20649 与 ICM20948 两款高性能 MEMS 运动传感器设计。该库并非通用型 ICM20X 系列驱动,而是聚焦于 Adafruit 自行设计并销售的硬件模块——即 I…...

计算机视觉进阶教学之Mediapipe库(一)

目录 简介 一、Mediapipe Python的安装和应用 二、手部检测 1. 导入必要的库 2. 初始化 MediaPipe 组件 3. 配置并创建手部检测模型实例 4. 启动摄像头并进入主循环 5. 绘制检测结果 三、手势识别 1. 手势识别核心逻辑 a. 计算基准距离 (Base Distance) b. 计算各手…...

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水 1. 项目概述 Alpamayo-R1-10B是NVIDIA推出的自动驾驶专用开源视觉-语言-动作(VLA)模型,作为一套完整的自动驾驶研发工具链&#xf…...

SmolVLA参数详解:256×256输入分辨率对边缘计算设备的友好性分析

SmolVLA参数详解:256256输入分辨率对边缘计算设备的友好性分析 1. 引言:为什么边缘设备需要紧凑的视觉语言动作模型 在机器人技术和边缘计算领域,我们经常面临一个核心矛盾:强大的AI能力需要大量计算资源,而边缘设备…...

论文AI率突然从20%涨到50%怎么办?紧急处理攻略

论文AI率突然从20%涨到50%怎么办?紧急处理攻略 上周五,一个学妹发消息给我,语气挺崩溃的:“学长,我的论文上个月查AI率才18%,今天重新查直接变成52%了,后天就要交终稿,怎么办啊&…...

密码学算法 - 连分数算法

当你在计算某个数的近似值时🔍,或者在求解某个方程的根时🧮,连分数算法 就像一把神奇的放大镜🔎,能帮你逐步逼近那个隐藏在数字背后的真相。 欢迎来到《密码学核心算法实战》的连分数专题!这里…...

Linux内核构建三要素:Makefile、Kconfig与.config协同机制

1. Linux内核构建系统核心机制解析:Makefile、Kconfig与.config的协同关系在嵌入式Linux开发实践中,内核编译常被视为一道技术门槛。开发者面对庞大的源码树(以Linux-3.4.2为例,包含超过2.5万文件),往往陷入…...

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗 四足机器人正从实验室走向创客空间。想象一下,周末午后在自家工作台上组装出一台能行走、奔跑甚至跳舞的机器狗——这不再是科幻场景。得益于MIT Mini Cheetah等开源项目的出现,普通爱…...

HAR实战指南:从Kinetics-400数据集获取到视频帧预处理全流程解析

1. Kinetics-400数据集入门指南 第一次接触Kinetics-400数据集时,我被它庞大的规模震撼到了。这个包含40万段视频片段的数据集,涵盖了从"打篮球"到"刷牙"等400种日常动作,是训练人体动作识别(HAR)模型的黄金标准。但随之…...

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速 1. 为什么需要对Qwen3-Reranker做TensorRT优化 你可能已经试过直接加载Qwen3-Reranker-0.6B跑重排序任务,但很快会发现:推理速度不够快,显存占用偏高,尤其在…...

2026年AI提示词(Prompt)终极指南:国内聚合站实战技巧

在AI应用日益深入的2026年,能否写出高质量的提示词(Prompt),直接决定了你从GPT、Claude、Gemini等大模型中获得价值的效率与深度。对于国内用户,学习和实践提示词工程的最佳平台是聚合型AI镜像站。目前,通过…...

大模型学习笔记------SAM模型架构拆解与实战指南

1. SAM模型架构全景拆解 第一次接触SAM模型时,我被它"分割一切"的野心震撼到了。这就像给计算机视觉领域扔下了一颗原子弹——传统需要专门训练的分割任务,现在通过提示词就能实时完成。在实际部署医疗影像标注系统时,我发现理解这…...

读了Linux内核slab源码,发现Linus在20年前就写出了比std::pmr更高效的内存池——内核内存管理的4个设计模式

一、C++的内存池,和内核比差在哪? C++程序员对内存管理不陌生。从最基本的new/delete,到C++17引入的std::pmr::polymorphic_allocator,再到各种第三方库的对象池实现,我们一直在和内存分配器打交道。 但你有没有想过一个问题:为什么C++标准库直到2017年才搞出std::pmr这…...

Dify + Celery + Webhook深度集成:构建高可靠异步管道的6大关键配置点

第一章:Dify自定义节点异步处理的核心架构演进Dify 自 v0.6.10 起将自定义节点(Custom Node)的执行模型从同步阻塞式全面转向基于事件驱动的异步处理架构,其核心目标是解耦节点执行与工作流调度,提升高并发场景下的资源…...

JTAG接口原理、失效诊断与硬件防护实战指南

1. JTAG接口原理与工程实践深度解析在嵌入式系统与可编程逻辑器件的开发流程中,JTAG(Joint Test Action Group)接口不仅是调试与烧录的核心通道,更是硬件工程师验证设计完整性、定位物理层故障的关键工具。本文基于FPGA开发中频繁…...

STM32电机控制库5.4版:开源无感驱动注释详解——从寄存器设置到弱磁控制策略实现

STM32电机库5.4开源无感注释 KEIL工程文件 辅助理解ST库 寄存器设置AD TIM1 龙贝格PLL 前馈控制 弱磁控制 foc的基本流 svpwm占空比计算方法 斜坡启动 死区补偿 有详细的注释, 当前是无传感器版本龙贝格观测,三电阻双AD采样!搞STM32电机控制就像在玩硬件…...

高效掌握SeisUnix:从架构解析到实战应用

高效掌握SeisUnix:从架构解析到实战应用 【免费下载链接】SeisUnix The CWP/SU: Seismic Un*x Package - a free open seismic processing, research, and educational software package. Please seek distribution gzipped tar files at https://wiki.Seismic-Unix…...

Windows任务栏美化:TranslucentTB打造个性化视觉体验

Windows任务栏美化:TranslucentTB打造个性化视觉体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在Windows桌面个性化领域…...

嵌入式可观测性库:面向教学的轻量级实时调试方案

Elec350_OBS:面向嵌入式教学的实时观测与调试库深度解析1. 项目概述Elec350_OBS 是为加拿大麦吉尔大学(McGill University)ELEC 350 ——《嵌入式系统设计导论》课程配套开发的轻量级观测(Observability)支持库。该库并…...

C语言实现OTA安全降级与故障隔离:3层状态持久化+2次幂回退重试,让固件升级不再“一失足成千古恨”

第一章:C语言OTA升级失败处理的总体设计哲学在资源受限的嵌入式系统中,C语言实现的OTA升级失败处理并非简单的错误重试逻辑,而是一种以**确定性、可回滚性与状态自明性**为核心的系统级设计哲学。它要求每个操作步骤都具备原子边界&#xff0…...

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independently f…...

OpenClaw技能扩展:GLM-4.7-Flash加持的微信公众号排版

OpenClaw技能扩展:GLM-4.7-Flash加持的微信公众号排版 1. 为什么需要自动化公众号排版 每次在微信公众号后台手动调整格式的经历,都让我想起被Word排版支配的恐惧。图片尺寸不统一、行间距忽大忽小、代码块显示错位——这些琐碎问题消耗了我大量本可用…...

告别低效!用Postman Runner批量执行API,让8000条数据自动流转

1. 从手工操作到批量执行的效率革命 上周我接手了一个数据迁移项目,需要将8000多条用户记录通过API推送到新系统。刚开始我手动调用了十几条就发现不对劲——每次点击发送、等待响应、核对结果要花20秒,按这个速度完成全部操作需要连续工作44小时&#…...