news 2026/10/3 12:10:04

Spring-AI 结合自定义 mcp server 实现飞书智能机器人

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring-AI 结合自定义 mcp server 实现飞书智能机器人

1. 简介

本文主要介绍基于 spring ai 自定义搭建 mcp 服务端和客户端,主要场景是:

基于本地的mcp服务让飞书机器人跟场景回答不同的问题

实现效果如下

最后附了源码链接.整体代码非常简单,容易上手。

2.概念

2.1 什么是 AI MCP?

MCP(Model Context Protocol)是一种 ​标准化协议​,用来解决一个长期痛点:

👉如何让 AI“安全、可控、标准化地”调用外部工具 / 系统能力?

它的核心目标不是“让 AI 更聪明”,而是:

  • 让AI 能调用真实系统
  • 同时避免 AI 乱编、乱连、乱访问
  • 并且工具接入方式统一

2.2 MCP 解决了什么问题?

1️⃣ 传统 Function Call 的问题

以 OpenAI Function Calling / Tool Calling 为例:

  • 工具定义写死在 Prompt 或代码里
  • 每个 AI 框架一套接口
  • 权限 / 生命周期 / 连接管理全靠业务自己写
  • 工具多了以后极难维护

👉 在真实系统里会变成:

  • Prompt 很长
  • Tool 定义重复
  • 不同 AI 模型不可复用

2️⃣ MCP 的解决思路

MCP 把 ​工具变成一个标准化的 Server​:

AI Model | | MCP 协议 | MCP Client ────── MCP Server ├─ 查数据库 ├─ 调内部系统 ├─ 查文件 ├─ 调 HTTP API

AI ​不直接接触工具实现​,只通过 MCP 协议:

  • 发现工具
  • 调用工具
  • 获取结构化结果

3. 工程结构

主要分为2个模块,mcp-server和mcp-client, mcp-client里面通过java -jar的形式运行 mcp 服务端,在mcp-client最终结合 AI 以及飞书机器人的集成实现消息的回复.

4. 相关源码介绍

4.1 mcp 服务端

服务端非常简单,例如保留一个天气的服务,只需要在方法上加入org.springframework.ai.tool.annotation.Tool;注解即可

importio.kings1990.mcp.mcpserver.enums.WeatherType;importio.kings1990.mcp.mcpserver.record.WeatherRequest;importio.kings1990.mcp.mcpserver.record.WeatherResult;importlombok.extern.slf4j.Slf4j;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.ai.tool.annotation.ToolParam;importorg.springframework.stereotype.Service;@Service@Slf4jpublicclassWeatherService{@Tool(name="getWeather",description="查询指定城市的天气")publicWeatherResultgetWeather(@ToolParam(description="请求参数")WeatherRequestreq){log.info("MCP Tool getWeather called, city={}",req.city());returnnewWeatherResult(req.city(),WeatherType.SUNNY,"25°C","°C","mcp:getWeather");}}

4.2 mcp客户端

4.2.1让 AI 集成 ToolCallbacks

@ConfigurationpublicclassAiConfig{@BeanpublicChatClientchatClient(ChatClient.Builderbuilder,List<McpSyncClient>mcpSyncClients){returnbuilder.defaultSystem("你是一个AI助手,必须调用工具 kings-spring-ai-mcp-tools 下的方法,如果工具不可用,就明确说明无法调用工具,不要编造。").defaultToolCallbacks(SyncMcpToolCallbackProvider.builder().mcpClients(mcpSyncClients).build()).build();}}

4.2.2基于飞书机器人的长链接集成,实现消息的自动回复

importcn.hutool.core.thread.ThreadUtil;importcom.lark.oapi.event.EventDispatcher;importcom.lark.oapi.service.im.ImService;importcom.lark.oapi.service.im.v1.model.P2MessageReceiveV1;importcom.lark.oapi.ws.Client;importjakarta.annotation.Resource;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.boot.CommandLineRunner;importorg.springframework.stereotype.Component;@ComponentpublicclassLarkWsListenerimplementsCommandLineRunner,DisposableBean{@ResourceprivateLarkBotServicebotService;@ResourceprivateClient.BuilderlarkWsBuilder;@Overridepublicvoidrun(String...args){//verificationToken和 encryptionKey 可选,用于验证和解密事件EventDispatcherhandler=EventDispatcher.newBuilder("","").onP2MessageReceiveV1(newImService.P2MessageReceiveV1Handler(){@Overridepublicvoidhandle(P2MessageReceiveV1event)throwsException{// 1) messageId 用于 replyStringmessageId=event.getEvent().getMessage().getMessageId();// 2) content 是 JSON 字符串,需要解析出文本StringcontentJson=event.getEvent().getMessage().getContent();System.err.println("收到消息: "+contentJson);StringuserText=LarkMsgParser.extractText(contentJson);ThreadUtil.execAsync(()->{botService.onUserMessage(messageId,userText);});}}).build();// 建议把 appId/appSecret 放配置文件ClientwsClient=larkWsBuilder.eventHandler(handler).build();wsClient.start();}@Overridepublicvoiddestroy()throwsException{}}

4.2.3 AI Api-Key 植入

我这边使用 zhipu ai. 这边可以获取api-key.

加入依赖

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId></dependency>

并且在配置中配置 api-key

spring: ai: zhipuai: api-key: your_api_key_here chat: options: model: glm-4.6

5.启动

直接运行mcp-client主程序,查看飞书机器人是否注册成功

connected to wss://msg-frontier.feishu.cn/

启动成功后在飞书应用里输入例如北京,等待机器人回复

6.源码

github 仓库. 可以 star 查看后续更新


Fast Request是一个类似于 Postman 的 IDEA 插件。它是一个强大的 restful api 工具包插件,可以根据已有的方法帮助您快速生成 url 和 params。Restful Fast Request = API调试工具 + API管理工具 + API搜索工具。 它有一个漂亮的界面来完成请求、检查服务器响应、存储你的 api 请求和导出 api 请求。插件帮助你在 IDEA 界面内更快更高效得调试你的 API。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 15:56:43

人人都是好朋友【牛客tracker 每日一题】

人人都是好朋友 时间限制&#xff1a;2秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每…

作者头像 李华
网站建设 2026/10/2 15:56:43

通过SSH设置跳板机访问内网Miniconda训练环境

通过SSH设置跳板机访问内网Miniconda训练环境 在高校实验室或企业AI研发团队中&#xff0c;一个常见的场景是&#xff1a;GPU服务器部署在内网深处&#xff0c;安全策略严格&#xff0c;无法直接从外部连接。而开发者又需要频繁登录进行模型调试、运行Jupyter Notebook、管理训…

作者头像 李华
网站建设 2026/10/2 19:13:02

水上乐园地面用什么材料比较好:技术痛点与解决方案剖析

行业症结深挖 水上乐园地面用什么材料比较好&#xff0c;一直是行业关注的焦点。当前该领域面临几个技术挑战。长期浸水环境导致材料易老化。湿滑表面带来安全隐患。化学消毒剂持续腐蚀常见铺装材料。色彩耐久性不足影响视觉效果。环保标准提升对材料提出更高要求。这些问题直接…

作者头像 李华
网站建设 2026/10/3 3:45:16

从Anaconda迁移到Miniconda以节省磁盘空间的方法

从 Anaconda 迁移到 Miniconda&#xff1a;轻量化 Python 环境的实践之道 在一台刚租用的云服务器上跑通第一个机器学习模型时&#xff0c;你是否曾因磁盘空间不足而卡在环境配置阶段&#xff1f;又或者&#xff0c;在团队协作中&#xff0c;是否遇到过“我这边能跑&#xff0c…

作者头像 李华
网站建设 2026/10/3 7:56:15

使用Conda-pack打包Miniconda环境迁移到离线机器

使用 Conda-pack 打包 Miniconda 环境迁移到离线机器 在人工智能项目落地的过程中&#xff0c;你是否经历过这样的场景&#xff1a;模型在开发机上训练得好好的&#xff0c;一搬到客户现场或内网服务器就“水土不服”&#xff1f;报错信息五花八门——缺依赖、版本不匹配、甚至…

作者头像 李华
网站建设 2026/10/3 7:56:15

利用conda env export生成可复现的PyTorch环境文件

利用 conda env export 生成可复现的 PyTorch 环境文件 在深度学习项目中&#xff0c;最令人头疼的问题之一莫过于“在我机器上明明能跑”的尴尬局面。模型训练完成、代码提交、文档写好&#xff0c;结果合作者或评审者拉下代码后却因为环境不一致导致依赖冲突、版本错乱&#…

作者头像 李华