Spring AI实现MCP Server和Client #java

官方参考文档:模型上下文协议 (MCP) :: Spring AI 参考 - Spring 框架

下面实现一个简单实例:

MCP Server服务

 主要步骤:将 Spring Boot 项目改造成一个 MCP Server,通过引入 Spring AI MCP Server 相关依赖,将业务能力以 MCP Tool / Resource 的形式标准化的暴露给大模型,并通过 SSE(Server-Sent Events) 与模型侧建立长连接通信。

引入依赖

 <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

注解开发

在com.fang.mcp.tool包下面,定义了一个MyMathTool  的自定义计算类,使用McpTool注解将方法声明成可通过 MCP 协议暴露给大模型调用的工具(Tool):

@Component public class MathTools { @McpTool(name = "add", description = "计算两个数字的cp指数") public double add( @McpToolParam(description = "第一个数字", required = true) double a, @McpToolParam(description = "第二个数字", required = true) double b) { return 1314 *(a + b) / 520; } @McpTool(name = "fangCal", description = "计算小方数") public double fangCal( @McpToolParam(description = "被计算数字", required = true) double a) { return a * a - a + 520; } }

配置文件

server: port: 8080 spring: application: name: mcp_server #启用一个 MCP Server,并通过 SSE协议,把本服务的能力暴露给 LLM 使用 ai: mcp: server: name: mcp_server version: 1.0.0 enabled: true protocol: SSE sse-endpoint: /api/v1/sse #SSE 长连接端点(通过这个地址建立 SSE 长连接) sse-message-endpoint: /api/v1/mcp #MCP 消息交互接口(MCP Client 通过 HTTP-POST 实际调用入口) capabilities: #能力是显式声明的,包括tool,resource,prompt,memory(像高德MCP仅支持tool) tool: true

然后启动项目即可,可以用postMan先测试一下:可以看到以及能正常获取并使用工具的功能:

MCP Client

Web客户端 应用通过 Spring AI的OpenAI SDK 调用大模型,引入 MCP Client,通过 SSE 接入独立的 MCP Server,实现模型与工具、数据能力的解耦。

使用Spring Initializr构造一个web的项目骨架:依赖带上web、openAI和McpClient

大模型配置类

com.fang.mcp_client.config包下,创建 ChatClientConfig:

@Configuration public class ChatClientConfig { @Bean public ChatMemory chatMemory() { //默认使用的存储库就是InMemory(基于本地内存)无持久化,默认窗口大小是20 return MessageWindowChatMemory.builder() .build(); } @Bean public ChatClient chatClient(OpenAiChatModel model, ChatMemory chatMemory, ToolCallbackProvider mcpTools) { return ChatClient .builder(model) .defaultSystem("你是一个数学老师!") .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor .builder(chatMemory) .build() ) .defaultToolCallbacks(mcpTools) //在这里引入MCP的工具 .build(); } }

这样就定义了一个接入了外部MCP工具以及带有记忆功能的简单的大模型。

controller入口

@RequiredArgsConstructor @RestController @RequestMapping("/ai") public class AIController { private final ChatClient chatClient; //个人习惯用构造器注入 @RequestMapping(value = "/{chatMessage}",produces = "text/html;charset=utf-8") public String textChat(@PathVariable("chatMessage") String chatMessage){ return chatClient.prompt() .user(chatMessage) .advisors(a -> a.param(CONVERSATION_ID, 10086)) //传入ID,先随便给一个 .call() .content(); } }

配置文件

server: port: 8081 spring: application: name: spring-car ai: openai: api-key: #填上自己在阿里云申请的Key base-url: https://dashscope.aliyuncs.com/compatible-mode chat: #对话模型 options: model: qwen-max-latest mcp: client: sse: connections: server1: url: http://localhost:8080 sse-endpoint: /api/v1/sse #还可以加上其他的MCP服务,比如高德的

然后启动项目即可,在浏览器测试如下:可以看到大模型已经能按照我们之定义的规则进行计算。

SSE协议(补充)

SSE 的连接过程是一次普通get HTTP 请求建立长连接,服务器通过 text/event-stream 持续推送事件数据,连接保持期间无需客户端轮询,断开后支持自动重连,非常适合 MCP 中 Tool 执行的流式反馈场景。 适用于远程部署的 MCP 服务器,可以通过 HTTP 协议与 MCP 服务器进行通信。

对比:HTTP 是一次请求一次响应的无状态模型,每次反复发起请求增加网络开销,也不利于维护会话上下文。

前面服务端有配置:

sse-endpoint: /api/v1/sse #SSE 长连接端点(通过这个地址建立 SSE 长连接) sse-message-endpoint: /api/v1/mcp #MCP 消息交互接口(MCP Client 通过 HTTP-POST 实际调用入口)

具体实现过程:(先向sse-endpoint发送HTTP的get请求建立长连接,返回session-ID,再向sse-message-endpoint发送pose请求带上请求体和ID,最后会在se-endpoint收到请求的回复)

可以参考:Lifecycle - Model Context Protocol,介绍MCP的生命周期

Read more

Flutter 三方库 at_server_status 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、实时的 @protocol 去中心化身份服务器状态感知与鉴权监控引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 at_server_status 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、实时的 @protocol 去中心化身份服务器状态感知与鉴权监控引擎 在鸿蒙(OpenHarmony)系统的隐私保护应用、去中心化身份管理工具(基于 @protocol 协议)或需要实时监控全球分布式节点健康状况的场景中,如何判定一个 @sign(电子签名标识)背后的 Root 服务器或 Secondary 服务器是否在线、配置是否由于由于由于由于已就绪?at_server_status 为开发者提供了一套工业级的、基于协议栈的状态审计与自检方案。本文将深入实战其在鸿蒙 Web3 身份安全底座中的应用。 前言 什么是 atServer Status?它是 @protocol(一种旨在让用户完全掌控数据的去中心化协议)官方生态的核心组件。

By Ne0inhk
鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现

鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现

《鸿蒙APP开发从入门到精通》第19篇:鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现 📊🌍💰 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第19篇——生态合作、用户运营、数据变现篇,100%承接第18篇的风险控制、合规审计、产品创新架构,并基于金融场景的生态合作、用户运营、数据变现要求,设计并实现鸿蒙金融理财全栈项目的生态合作、用户运营、数据变现功能。 学习目标: * 掌握鸿蒙金融理财项目的生态合作设计与实现; * 实现金融机构合作、支付渠道合作、数据分析合作; * 理解用户运营在金融场景的核心设计与实现; * 实现用户增长、用户留存、用户转化; * 掌握数据变现在金融场景的设计与实现; * 实现数据服务、数据产品、数据变现; * 优化金融理财项目的用户体验(生态合作、用户运营、数据变现)。 学习重点: * 鸿蒙金融理财项目的生态合作设计原则; * 用户运营在金融场景的应用; * 数据变现在金融场景的设计要点。 一、 生态合作基础 🎯 1.1 生态合作定义 生态合作是指金融理财项目与其他金融机构、

By Ne0inhk

Flutter 三方库 encrypter_plus 的鸿蒙化适配指南 - 打造工业级多重加密隔离、安全存储实战、鸿蒙级数据隐私专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 encrypter_plus 的鸿蒙化适配指南 - 打造工业级多重加密隔离、安全存储实战、鸿蒙级数据隐私专家 在鸿蒙跨平台应用处理用户核心资产、敏感通讯或离线隐私数据库时,单一的加密手段往往难以应对复杂的逆向工程攻击。我们需要一套功能全面、算法严谨且易于在鸿蒙端进行多层加固的方案。今天我们要深度解析的 encrypter_plus——一个集成了 AES、RSA、Salsa20 等多种主流算法的增强型加密工具集,正是帮你构建“数据保险柜”的核心组件。 前言 encrypter_plus 是对经典 encrypt 库的功能增强与性能优化版。它提供了更直观的操作符抽象和更健壮的填充(Padding)机制。在鸿蒙端项目中,利用它你可以轻松实现前端文件加密、服务端通讯非对称握手以及本地敏感配置的字段级混淆,确保即使用户设备的物理文件被导出,数据依然处于不可读的“致密状态”。 一、原理解析 / 概念介绍 1.1

By Ne0inhk
终于把LLaMA 2跑起来了,然后呢?本地大模型部署的残酷真相!

终于把LLaMA 2跑起来了,然后呢?本地大模型部署的残酷真相!

“终于把LLaMA 2跑起来了!” 深夜11点,程序员小林在朋友圈晒出电脑屏幕截图——黑色命令行窗口里,一行行代码滚动后,本地大模型吐出了第一句回答。他兴奋地刷新着评论区,看着“大佬”“技术牛”的赞美,感觉自己摸到了AI时代的“核心门槛”。 可这份热情没能撑过一个月。如今,那台专门升级了显卡的电脑,大模型程序静静躺在硬盘深处,偶尔开机,也只是为了清理缓存。“生成一句话要等10秒,写周报还能把部门名写错,不如直接用GPT-4 API,3秒出结果还靠谱。”小林的话,道出了无数本地部署玩家的心声。 2023年以来,“本地部署大模型”成了AI圈的热门话题。从技术博主的“手把手教程”,到论坛里的“配置交流帖”,仿佛人人都能拥有一台“私人AI服务器”。但热闹背后,是一场无声的“弃坑潮”:某技术社区调研显示,70%的个人用户在部署完成后3个月内停止使用,曾经的“技术勋章”,最终沦为“电子垃圾”。 这股热情的消退,绝非偶然。当“掌控AI”

By Ne0inhk