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

工具调用MCP_Server 开发梳理

一、MCP 简介

MCP(Model Context Protocol)是 Spring AI 提供的工具调用协议,允许 AI 模型通过标准化接口调用外部工具。本项目是一个基于 Spring Boot 的图片搜索 MCP 服务器实现。

三、开发步骤

步骤 1:创建 Maven 项目

pom.xml中添加以下核心依赖:

<!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring AI MCP Server WebMVC 依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency><!-- Hutool 工具库(可选,用于HTTP请求和JSON处理) --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version></dependency>

步骤 2:创建工具类

创建一个 Spring Service 类,并使用@Tool注解标记工具方法:

packagecom.imagesearchmcpserver.tools;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.ai.tool.annotation.ToolParam;importorg.springframework.stereotype.Service;@ServicepublicclassImageSearchTool{@Tool(description="search image from web")publicStringsearchImage(@ToolParam(description="Search query keyword")Stringquery){// 实现工具逻辑returnsearchMediumImages(query).toString();}}

关键注解说明:

注解用途
@Tool标记该方法为 MCP 工具,description用于描述工具功能
@ToolParam标记方法参数,description用于描述参数含义
@Service注册为 Spring Bean

步骤 3:配置工具提供者

在启动类中配置ToolCallbackProviderBean:

@SpringBootApplicationpublicclassYuImageSearchMcpServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(YuImageSearchMcpServerApplication.class,args);}@BeanpublicToolCallbackProviderimageSearchTools(ImageSearchToolimageSearchTool){returnMethodToolCallbackProvider.builder().toolObjects(imageSearchTool).build();}}

步骤 4:配置应用

创建三种配置文件:

4.1application.yml(默认配置)
spring:application:name:image-search-mcp-serverprofiles:active:sse# 默认使用 SSE 模式server:port:8127
4.2application-sse.yml(SSE 模式)
spring:ai:mcp:server:name:image-search-mcp-serverversion:0.0.1type:SYNCstdio:false# 启用 HTTP/SSE 模式
4.3application-stdio.yml(标准输入输出模式)
spring:ai:mcp:server:name:image-search-mcp-serverversion:0.0.1type:SYNCstdio:true# 启用标准输入输出模式main:web-application-type:none# 非 Web 应用banner-mode:off# 关闭启动 Banner

步骤 5:实现业务逻辑

在工具类中实现具体的业务逻辑。本项目以 Pexels 图片搜索 API 为例:

publicList<String>searchMediumImages(Stringquery){// 1. 设置请求头(包含 API 密钥)Map<String,String>headers=newHashMap<>();headers.put("Authorization",API_KEY);// 2. 设置请求参数Map<String,Object>params=newHashMap<>();params.put("query",query);// 3. 发送 HTTP 请求Stringresponse=HttpUtil.createGet(API_URL).addHeaders(headers).form(params).execute().body();// 4. 解析响应并提取图片 URLreturnJSONUtil.parseObj(response).getJSONArray("photos").stream().map(photoObj->(JSONObject)photoObj).map(photoObj->photoObj.getJSONObject("src")).map(photo->photo.getStr("medium")).filter(StrUtil::isNotBlank).collect(Collectors.toList());}

四、启动方式

方式 1:SSE 模式(默认)

# 开发环境运行./mvnw spring-boot:run# 或打包后运行./mvnw clean packagejava-jartarget/image-search-mcp-server-0.0.1-SNAPSHOT.jar

方式 2:Stdio 模式

./mvnw spring-boot:run -Dspring-boot.run.profiles=stdio# 或java-jartarget/image-search-mcp-server-0.0.1-SNAPSHOT.jar--spring.profiles.active=stdio

五、两种运行模式对比

特性SSE 模式Stdio 模式
通信方式HTTP + Server-Sent Events标准输入/输出流
适用场景远程服务、多客户端连接本地进程调用、安全沙箱环境
Web 服务
配置参数stdio: falsestdio: true

六、MCP 工具调用流程

┌─────────────────┐ HTTP/SSE ┌──────────────────────┐ │ AI 客户端 │ ────────────────► │ MCP Server │ │ (如 LlamaIndex)│ │ (Spring Boot) │ └─────────────────┘ └──────────┬───────────┘ │ ▼ ┌──────────────────────┐ │ ToolCallbackProvider│ │ 发现并注册工具方法 │ └──────────┬───────────┘ │ ▼ ┌──────────────────────┐ │ ImageSearchTool │ │ 执行具体业务逻辑 │ └──────────────────────┘

七、扩展开发

添加新工具

只需创建新的 Service 类并添加@Tool注解:

@ServicepublicclassWeatherTool{@Tool(description="Get current weather")publicStringgetWeather(@ToolParam(description="City name")Stringcity){// 实现天气查询逻辑return"Weather in "+city+": sunny";}}

更新工具提供者

在启动类中添加新工具:

@BeanpublicToolCallbackProvidertools(ImageSearchToolimageSearchTool,WeatherToolweatherTool){returnMethodToolCallbackProvider.builder().toolObjects(imageSearchTool,weatherTool).build();}

八、注意事项

  1. API Key 管理:敏感信息如 API Key 应通过环境变量或配置中心管理,避免硬编码
  2. 错误处理:工具方法应妥善处理异常,返回友好的错误信息
  3. 参数校验:对输入参数进行必要的校验
  4. 日志记录:建议添加适当的日志记录便于排查问题
  5. 依赖版本:确保 Spring AI BOM 版本与 MCP Server 依赖版本一致

九、前端调用方式

9.1 前端项目结构

ai-agent-frontend/ ├── src/ │ ├── api/ │ │ └── index.js # API 封装与 SSE 连接 │ ├── components/ │ │ └── ChatRoom.vue # 聊天组件 │ ├── views/ │ │ └── SuperAgent.vue # AI 超级智能体页面 │ └── main.js # 入口文件 ├── package.json └── vite.config.js

9.2 核心调用流程

前端通过SSE (Server-Sent Events)与后端建立实时通信,实现流式响应。

9.2.1 SSE 连接封装
// src/api/index.jsimportaxiosfrom'axios'constAPI_BASE_URL=process.env.NODE_ENV==='production'?'/api':'http://localhost:8123/api'exportconstconnectSSE=(url,params,onMessage,onError)=>{constqueryString=Object.keys(params).map(key=>`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&')constfullUrl=`${API_BASE_URL}${url}?${queryString}`consteventSource=newEventSource(fullUrl)eventSource.onmessage=event=>{letdata=event.dataif(data==='[DONE]'){if(onMessage)onMessage('[DONE]')}else{if(onMessage)onMessage(data)}}eventSource.onerror=error=>{if(onError)onError(error)eventSource.close()}returneventSource}
9.2.2 调用 AI 聊天接口
// AI超级智能体聊天exportconstchatWithManus=(message)=>{returnconnectSSE('/ai/manus/chat',{message})}

9.3 组件层面调用

在 Vue 组件中使用 SSE 连接:

// src/views/SuperAgent.vueimport{ref,onMounted,onBeforeUnmount}from'vue'import{chatWithManus}from'../api'constmessages=ref([])constconnectionStatus=ref('disconnected')leteventSource=nullconstsendMessage=(message)=>{// 添加用户消息addMessage(message,true,'user-question')// 关闭之前的连接if(eventSource){eventSource.close()}connectionStatus.value='connecting'letmessageBuffer=[]eventSource=chatWithManus(message)eventSource.onmessage=(event)=>{constdata=event.dataif(data&&data!=='[DONE]'){messageBuffer.push(data)// 根据标点或长度判断是否创建新消息气泡constlastChar=data.charAt(data.length-1)consthasCompleteSentence=['。','!','?','…'].includes(lastChar)constisLongEnough=messageBuffer.join('').length>40if(hasCompleteSentence||isLongEnough){addMessage(messageBuffer.join(''),false,'ai-answer')messageBuffer=[]}}if(data==='[DONE]'){if(messageBuffer.length>0){addMessage(messageBuffer.join(''),false,'ai-final')}connectionStatus.value='disconnected'eventSource.close()}}eventSource.onerror=(error)=>{connectionStatus.value='error'eventSource.close()}}

9.4 完整调用链路

┌─────────────────┐ HTTP/SSE ┌──────────────────────┐ 调用工具 ┌──────────────────────┐ │ Vue 前端 │ ────────────────► │ 后端 API Gateway │ ─────────────► │ MCP Server │ │ SuperAgent.vue │ /ai/manus/chat │ (端口 8123) │ /mcp/tools │ (端口 8127) │ └─────────────────┘ └──────────────────────┘ └──────────────────────┘ ▲ │ │ │ │ │ └─────────── SSE 流式响应 ◄───────────┴─────────── 工具执行结果 ◄───────────┘

9.5 前端配置说明

配置项开发环境生产环境
API 地址http://localhost:8123/api/api
通信方式SSE (EventSource)SSE (EventSource)
超时时间60秒60秒

9.6 注意事项

  1. 跨域处理:后端需配置 CORS 允许前端域名访问
  2. 连接管理:发送新消息前需关闭旧连接,避免重复响应
  3. 消息缓冲:SSE 可能分段传输,需缓冲后按语义合并
  4. 异常处理:监听onerror事件,优雅处理连接断开
  5. 资源清理:组件销毁前调用eventSource.close()释放资源

http://www.gsyq.cn/news/1531840.html

相关文章:

  • Base64 编码完全指南:原理、规则、计算与应用
  • DDR内存控制器初始化实战:从寄存器配置到信号完整性调试
  • HEIF图片转换终极解决方案:告别iPhone照片在Windows上的尴尬时刻
  • 2026年家用按摩椅选购指南:优质专卖店与高性价比品牌深度解析 - 优质品牌商家
  • 2026年 一件代发平台推荐榜单:常州源头货源/电商衣服一件代发/无货源仓库服务,深度解析与高性价比之选 - 企业推荐官【官方】
  • 遗传算法实操指南:选择、交叉、变异的工程调优
  • Java毕业设计-基于 SpringBoot 的古钱币文化交流与藏品管理系统 智能化钱币收藏交流分享系统的设计与开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026实力之选:热镀锌钢格栅/踏步板/沟盖板/钢格板/水沟盖板/钢结构平台板专业厂家最新实力解析 - 企业推荐官【官方】
  • rocky配置网卡手动修改配置文件与nmcli命令添加网卡配置
  • 2026年6月靠谱的积家手表回收厂家怎么选推荐,复杂功能腕表/纪念款/经典正装表回收厂家选择指南 - 海棠依旧大
  • 2026上海AI搜索GEO优化服务商技术路径深度解析
  • 少走弯路:2026年首选推荐的专业AI论文写作软件
  • 2026年廊坊靠谱黄金回收门店推荐——首选典典佳汇,诚信高价、口碑第一! - 诚鑫名品
  • 嵌入式硬件控制实战:从MSC8251寄存器视角解析GPIO与I2C驱动开发
  • Kimi K2.6 思考 LeetCode 3260. 找出最大的 N 位 K 回文数 Java实现
  • Java毕业设计-基于 SpringBoot 的线上家教服务系统设计与实现 面向校园的家教资源匹配管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Moonlight-Switch终极指南:让任天堂Switch免费畅玩PC游戏大作
  • 反向海淘订单状态机设计:taocarts 状态流转与并发控制
  • 干货合集:盘点2026年用户挚爱的一键生成论文工具
  • 2026合肥专业的陪驾公司联系电话及服务参考 - 品牌排行榜
  • 《LangChain 系列》Human-in-the-loop:什么时候必须让人工介入?
  • 寄大件用什么物流便宜?大件快递怎么寄最省钱?教你几招避坑技巧 - 快递物流资讯
  • Matlab图像处理避坑:灰度变换时im2double、uint8这些数据类型转换到底怎么用?
  • 2026测评视角拆解:香港公屋“奇葩”不规则户型,全屋定制怎么做才不翻车?
  • 深入解析MSC8251单核DSP SoC架构:从核心、内存到高速数据通路
  • 2026年更新:探寻佛山实木家具维修源头厂家的专业之选 - 品牌鉴赏官2026
  • 3步解锁显卡潜能:DLSS Swapper智能性能引擎完全实战手册
  • ESXi网络配置踩坑实录:给Ubuntu虚拟机加第二张网卡后,为什么上不了网了?
  • 2026年 防水排水板/膨润土防水毯/三维复合排水网/透水管/软式透水管/硬式透水管厂家专业实力解析 - 企业推荐官【官方】
  • 解决OpenWrt Dnsmasq常见问题:DHCP响应慢、日志刷屏与AdGuard Home兼容