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

spring-ai 1.0.0 学习(十八)——MCP Server

上一篇学习了如何调用外部工具,这一篇我们看看如何将自己的服务发布为外部工具,供他人调用

最小化样例

与使用Mcp Client一样,分为三步,引入依赖,添加配置,修改代码

      <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency>

根据自身需要引入上述三个依赖之一,分别对应STDIO、WebFlux、Http模式

以http为例,在application文件中添加如下配置

# Using spring-ai-starter-mcp-server-webmvc
spring:ai:mcp:server:name: webmvc-mcp-serverversion: 1.0.0type: SYNCinstructions: "This server provides weather information tools and resources"sse-message-endpoint: /mcp/messagescapabilities: tool: true       #是否开启工具resource: true   #是否开启资源prompt: true     #是否开启提示词completion: true #是否开启补全

instructions用来介绍当前服务器提供的功能

然后将想要暴露的服务上添加Tool注解

@Service
public class WeatherService {@Tool(description = "Get weather information by city name")public String getWeather(String cityName) {// Implementation}
}

之后将服务注册为ToolCallbackProvider

@SpringBootApplication
public class McpServerApplication {public static void main(String[] args) {SpringApplication.run(McpServerApplication.class, args);}@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}

然后就可以通过MCP Client进行调用了

进阶知识

内部原理

以http为例,spring-ai首先会将spring.ai.mcp.server相关配置注入McpServerProperties

然后根据McpServerProperties创建WebMvcSseServerTransportProvider,负责创建并管理会话

之后根据WebMvcSseServerTransportProvider、注册的ToolCallbackProvider等组件,创建McpSyncServer

McpSyncServer内部包含了服务器信息(如服务器介绍、支持的能力等)和具体的能力(如工具列表),在构造函数中,声明了一系列的请求及其处理器(例如工具相关请求tool/list和tool/call)

每当WebMvcSseServerTransportProvider收到会话请求,就会创建一个McpServerSession,并将McpSyncServer中声明的请求及处理器交给McpServerSession

McpServerSession根据请求路径选择相应的处理器进行处理

http://www.lryc.cn/news/576068.html

相关文章:

  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 【C语言】知识总结·指针篇
  • linux dts overlay
  • Spearman检验组间相关性及SCI风格绘图
  • 基于社区电商场景的Redis缓存架构实战01-redis内核知识
  • 航拍图像中的“生命线”:基于YOLOv5的7类应急目标检测实践
  • 打造无障碍网页应用的利器:Base UI
  • Python爬虫实战:如何优雅地处理超时和延迟加载问题
  • 安全运营中的漏洞管理和相关KPI
  • 车载以太网-ARP 动态 静态
  • html配置rem实现页面自适应
  • Day57打卡 @浙大疏锦行
  • Go和Elixir极简HTTP服务对比
  • Linux 挂载从入门到精通:mount 命令详解与实战指南
  • 创建一个简单入门SpringBoot3项目
  • Spring Boot项目开发实战销售管理系统——系统设计!
  • Formality:原语(primitive)的概念
  • 中科亿海微SoM模组——基于FPGA+RSIC-V的计算机板卡
  • AI助力游戏设计——从灵感到行动-靠岸篇
  • 《人间词话》PPT课件
  • LeRobot框架设计与架构深度剖析:从入门到精通
  • C#语言入门-task4 :C#语言的高级应用
  • 带标签的 Docker 镜像打包为 tar 文件
  • 七天学会SpringCloud分布式微服务——04——Nacos配置中心
  • Java-异常类
  • Windows Server 2019 查询远程登录源 IP 地址(含 RDP 和网络登录)
  • Spring Boot 性能优化与最佳实践
  • django-celery定时任务
  • Prism框架实战:WPF企业级开发全解
  • Greenplum