背景:调用服务实现特定功能
此次演示为demo版,大家可根据需求自定义!
步骤一:服务端模块
基于响应式编程实现,教大家一个绝招,查询依赖底层,可以轻松的解决依赖冲突问题,如下:
最外层的pom.xml引入的不过是层层封装,定义为已有的,如遇到多个依赖冲突,则可以以下方法:
<!--举例说明-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<exclusions>
<exclusion>
<groupId>com.github.victools</groupId>
<artifactId>jsonschema-generator</artifactId>
</exclusion>
</exclusions>
</dependency>
[1]pom.xml
<!--核心依赖-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId>
<version>${spring-ai.version}</version>
</dependency>
[2]application.yml
spring:
main:
banner-mode: off
ai:
mcp:
server:
name: my-meeting-server
version: 0.0.1
server:
port: 9091
[3]MeetingReservationService
@Service
@Slf4j
public class MeetingReservationService {
/**
* 查询会议
*
* @return
*/
@Tool(name = "meeting_getMeetingInfo", description = "查询用户会议")
public String getMeetingInfo() {
return "当前用户会议内容: 用户张三,会议室101";
}
/**
* 预约会议
*
* @return
*/
@Tool(name = "meeting_addMeetingRecord", description = "预约会议")
public String addMeetingRecord() {
return "会议预约成功";
}
}
由于是简易版,大家可自定义方法,在方法中编写业务代码!
[4]MyMcpServerApplication
@SpringBootApplication
@ComponentScan(basePackages = {"org.springframework.ai.mcp.sample.service"})
public class MyMcpServerApplication {
public static void main(String[] args) {
SpringApplication.run(MyMcpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider meetingTools(MeetingReservationService meetingReservationService) {
return MethodToolCallbackProvider.builder()
.toolObjects(meetingReservationService)
.build();
}
}
使用Bean注解实现服务注册,类似于微服务的Nacos、Eureka组件
步骤二:客户端模块
[1]pom.xml
<!--核心依赖-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId>
<version>${spring-ai.version}</version>
</dependency>
[2]application.yml
server:
port: 9092
spring:
application:
name: mcp-client
ai:
dashscope:
api-key: 个人key
chat:
options:
model: qwen-max
mcp:
client:
enabled: true
name: meeting-assistant
version: 1.0.0
request-timeout: 30s
type: ASYNC
sse:
connections:
server1:
url: http://ip:server模块的port
[3]TestController
@RestController
@RequestMapping("/mcpT")
public class TestController {
@Autowired
private ChatModel chatModel;
@Autowired
private ToolCallbackProvider toolCallbackProvider;
@GetMapping("/test")
public String mcpTest(@RequestParam(value = "input") String input) {
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultTools(toolCallbackProvider)
.build();
return chatClient.prompt(new Prompt(input)).call().content();
}
}
步骤三:测试
接口测试
至此,简易版的demo已完成
问题记录
客户端配置信息不完整,错误记录如下
原因如下:
更改后,启动成功
本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走得更远。QQ群号:925317809 备注:技术交流 即可通过!