Spring AI系列——开发MCP Server和MCP Client(SSE方式)

Spring AI系列——开发MCP Server和MCP Client(SSE方式)

文章目录


一、概述

MCP架构图

在这里插入图片描述

MCP生命周期

在这里插入图片描述

二、创建MCP SERVER的java工程

生成初始化工程代码

访问网址:https://start.spring.io/
填写基本信息→添加依赖项

在这里插入图片描述


选择Server

在这里插入图片描述


点击生成

在这里插入图片描述
在这里插入图片描述


解压后用IDEA打开

修改pom.xml文件

把spring-ai-starter-mcp-server依赖改为spring-ai-starter-mcp-server-webmvc

在这里插入图片描述


完整pom.xml内容

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.8</version><relativePath/><!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>test-mcp-server</artifactId><version>0.0.1-SNAPSHOT</version><name>test-mcp-server</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.1.2</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

定义服务类MathTool

在这里插入图片描述
packagecom.example.tool;importorg.springframework.ai.tool.annotation.Tool;publicclassMathTool{@Tool(description ="两个数字相加")publicstaticintaddNumbers(int a,int b){return a + b;}@Tool(description ="两个数字相减")publicstaticintsubtractNumbers(int a,int b){return a - b;}}

通过配置类的方式把MathTool注入到Spring容器中

创建config包,在下面创建McpConfig类

在这里插入图片描述
packagecom.example.test_mcp_server.config;importcom.example.tool.MathTool;importorg.springframework.ai.tool.ToolCallbackProvider;importorg.springframework.ai.tool.method.MethodToolCallbackProvider;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassMcpConfig{@BeanpublicToolCallbackProvidermathTool(){returnMethodToolCallbackProvider.builder().toolObjects(newMathTool()).build();}}

修改配置文件application.yaml

配置内容为:

server:port:8080spring:application:name: math_mcp_server ai:mcp:server:enabled:truename: test_mcp_server version: 1.0.0 sse-endpoint: /api/v1/sse sse-message-endpoint: /api/v1/mcp capabilities:tool:truelogging:level:# 查看MCP详细日志io.modelcontextprotocol: TRACE org.springframework.ai.mcp: TRACE 

启动服务

在这里插入图片描述


启动成功,并提示注册了两个Tool

在这里插入图片描述

三、如何使用MCP Server

方式一:使用Chatbox连接MCP Server

设置AI模型提供方

在这里插入图片描述


我这里选择智谱的ChatGLM6B, API密钥去智谱官网申请,点击检查

在这里插入图片描述


在这里插入图片描述


点确认

在这里插入图片描述


在这里插入图片描述

配置MCP服务器

点击左侧的MCP

在这里插入图片描述


添加服务器

在这里插入图片描述


在这里插入图片描述


配置信息后点击测试

在这里插入图片描述


编写的两个工具成功显示

在这里插入图片描述


**PS:必须点测试,这样才能完成服务端的初始化连接**
服务端日志:

在这里插入图片描述

点击保存

在这里插入图片描述

使用MCP Server

按ECS键退出设置,点击新对话,可以看到刚才添加的MCP服务

在这里插入图片描述

输入“运维小兵的计算服务有哪些功能”
AI给的回复很好的总结了工具的功能

在这里插入图片描述

问:8加7等于几
工具成功调用

在这里插入图片描述


服务端日志内容

在这里插入图片描述


测试完毕,符合预期

方式二:开发一个Client来连接Server

创建java工程

跟创建MCP Server类似,改下Artifact名字

在这里插入图片描述


添加Client的依赖

在这里插入图片描述


在这里插入图片描述


保存工程文件,解压后用IDEA打开

修改pom.xml,添加核心依赖

<properties><java.version>17</java.version><spring-ai.version>1.1.2</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--调用智谱系列大模型的依赖--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

配置application.yaml

server:port:8081spring:application:name: test-mcp-client ai:zhipuai:# 智谱官网创建API Key,配置到机器的环境变量ZHIPU_KEYapi-key: ${ZHIPU_KEY}base-url:"https://open.bigmodel.cn/api/paas"# 配置模型地址chat:options:model: glm-4-flash mcp:client:sse:connections:server1:# 填写MCP Server的地址url: http://localhost:8080sse-endpoint: /api/v1/sse 

创建Controller

在这里插入图片描述

ConnectMcpServer.java

packagecom.example.test_mcp_client.controller;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.tool.ToolCallbackProvider;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/mcp")publicclassConnectMcpServer{privatefinalChatClient chatClient;publicConnectMcpServer(ChatClient.Builder builder,ToolCallbackProvider toolCallbackProvider){this.chatClient = builder .defaultToolCallbacks(toolCallbackProvider.getToolCallbacks()).build();}@GetMapping("/test")publicStringtest(@RequestParam(name ="query")String query){return chatClient.prompt().system("你是一个有用的AI助手").user(query).call().content();}}

启动Client服务

服务启动成功

在这里插入图片描述


SERVER端完成初始化

在这里插入图片描述

访问接口进行测试

GET http://localhost:8081/mcp/test?query=8加6等于几

在这里插入图片描述


查看SERVER日志


完美。

四、资料

Spring AI官网:https://docs.spring.io/spring-ai/reference/index.html
视频:https://www.bilibili.com/video/BV1yT8qzMEbd/?spm_id_from=333.337.search-card.all.click&vd_source=0467ab39cc5ec5940fee22a0e7797575

Read more

【Java 开发日记】运行时有出现过什么异常?

【Java 开发日记】运行时有出现过什么异常?

目录 第一类:常见的运行时异常 第二类:业务相关的特定异常 第三类:框架和集成相关的异常 需要避免的坑 总结 在我的项目开发和生产运维中,遇到的异常可以归纳为以下几类: 第一类:常见的运行时异常 这类异常通常是由于编码疏忽或逻辑不严谨造成的。 * 空指针异常 * 场景: 最经典的比如:调用 null 对象的方user.getName(), 从Map中get一个不存在的键返回null后继续操作,或者自动拆箱Integer为int时对象为null。 * 原因与解决: 根本原因是缺少null值判断。我的解决方法是:1)在调用前进行判空;2)使用Optional类来优雅地处理可能为null的情况;3) 在获取 Map 值时使用getOrDefault方法。 * 类型转换异常 * 场景: 在使用集合框架时,比如从一个声明为List的集合里取出一个元素并强转为String,但实际上里面存放的是Integer。 * 原因与解决: 原因是类型不安全。解决方法是:1)在使用泛型集合时,始终指定具体的类型参数,利用编译器的类型检查;2)在强制转换前使用inst

By Ne0inhk
将openclaw接入飞书:10分钟,让你的AI员工直接操作你的文档和表格!

将openclaw接入飞书:10分钟,让你的AI员工直接操作你的文档和表格!

上一篇,我们给小龙虾接了 Telegram,实现了手机遥控。 但说实话,Telegram 只解决了"能聊天"的问题。你跟小龙虾说"帮我写个文档",它写完了——然后呢?你还得自己复制粘贴到你的编辑器中。 这就像请了个助手,他只能站在门外隔着门跟你喊话,但不能进屋帮你干活。 今天这篇,我们把门打开。让小龙虾直接进入你的飞书——读文档、写文档、操作表格、管理日程,全部自己来。 先看效果👇 飞书的配置比 Telegram 多一些步骤,但别慌——跟着我走,每一步都有截图,大概10分钟搞定。 飞书的接入分四个阶段,先有个全局概念,不容易迷路: 1. 在飞书上造一个机器人 — 相当于给小龙虾办一张飞书工牌 2. 在服务器上装飞书插件 — 让小龙虾学会"说飞书的语言" 3.

By Ne0inhk
Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路

Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 前言 * 误区一:过度依赖框架,忽视底层原理 * 1.1 误区表现 * 1.2 问题诊断流程 * 1.3 正确做法:从零构建理解 * ❌ 错误示范:直接使用框架 * ✅ 正确示范:先理解底层,再用框架 * 1.4 学习路径对比 * 误区二:忽视Java特性,照搬Python方案 * 2.1 误区表现 * 2.2 常见错误对比 * 2.3 典型错误案例 * ❌ 错误1:字符串拼接JSON * ✅ 正确1:使用Java类型系统 * ❌ 错误2:同步阻塞调用 * ✅ 正确2:使用Java响应式编程 * 2.4

By Ne0inhk
JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

目录 1、JDK官网 2、基于JDK官网下载JDK版本 3、基于其它镜像的下载JDK版本  3.1 使用华为镜像 3.2 使用injdk镜像 4、JDK的安装 5、配置JDK的环境变量 6、ideal选择相应的JDK版本 6.1 新建项目(new project) 6.2 创建项目后,调整JDK版本 6.3通过Maven依赖来控制JDK的版本 1、JDK官网 官网地址:Java Downloads | Oracle 中国https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows 官网地址(jdk17版本之前的):https://www.oracle.

By Ne0inhk