Dify 快速上手 MCP!Java 搭建 MCP Server 接入 Dify详细实战攻略

近期,MCP协议在AI领域热度飙升,成为众多开发者和行业人士热议的焦点。下文先介绍MCP究竟是什么?再详细讲下 Dify + DeepSeek + Java开发 MCP server 实战。

一、MCP的基本概念

MCP,全称为模型上下文协议(Model Context Protocol),是由Anthropic推出的开放标准协议。其核心目标,是打破大型语言模型(LLMs)与外部数据源、工具之间的交互壁垒,实现高效、无缝的连接。

想象一下,在AI的世界里,MCP就像是一个万能适配器。它赋予智能模型如同使用USB接口般的便捷性,让模型能够轻松适配各类设备与服务,极大地拓展了AI的应用边界。

官网链接

https://modelcontextprotocol.io/introduction,想要深入了解MCP的朋友,可以前往官网查阅更多详细信息。

二、MCP的核心定义

从协议本质来看,MCP致力于统一应用程序为大语言模型提供上下文的模式。如果将其类比到日常生活中的设备,MCP恰似AI应用领域的USB-C接口

我们知道,USB-C接口凭借标准化设计,实现了设备与众多外设(如鼠标、键盘、音响、硬盘等)的快速、稳定连接。而MCP同样以标准化的连接方式,助力AI模型自如对接多元数据源与工具,让AI模型不再“孤立无援”。

三、MCP的实际应用价值

简而言之,MCP就是AI调用服务的“智能连接器”。通过这一协议,AI模型与各类数据源、工具间的连接变得简单高效。

无论是调用天气API获取实时气象数据,还是实现数据库的高效查询,亦或是对接其他外部服务,MCP都能以标准化路径,帮助AI模型轻松完成任务。这使得AI应用的开发与落地更加灵活、便捷,为AI技术的广泛应用提供了强大助力。

Spring MCP Server

Spring AI 刚好就有 MCP Server Boot Starter 模块,直接拿来用就行了:

https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html

Spring MCP Server 提供了三种不同的模式:

  • Standard Input/Output (STDIO) 

   spring-ai-starter-mcp-server(适合简单的本地开发和单进程通信)

  • Spring MVC (Server-Sent Events) 

   spring-ai-starter-mcp-server-webmvc(适合传统的基于 Servlet 的 Web 应用,支持同步模式)

  • Spring WebFlux (Reactive SSE) 

   spring-ai-starter-mcp-server-webflux(适合高性能、高并发的响应式应用,支持异步模式)

用Java创建MCP服务

创建MCP服务不用从头开始,Spring官方有现成的例子,我们拿来改一下就行了。

下载代码:

https://github.com/spring-projects/spring-ai-examples

找到starter-webmvc-server项目:

1、打开项目后,我们先运行 McpServerApplication.java

2、MCP服务运行成功。

3、添加自己的MCP服务

好了,现在我们可以添加我们自己的MCP服务了。

我们新增一个BIService类,在类上标注@Service注解,然后新增getProjectInfoByCustomerName和getProjectInfoByContractNum方法,模拟从数据库中查询项目信息。

注意,要让大模型能识别方法,必须在方法名上面添加@Tool注解。

@Tool注解的关键信息如下:

• name工具的名称。如果未提供,则使用方法名称。AI 模型使用此名称来识别调用该工具的工具。因此,同一个类中不允许有两个同名的工具。对于特定的聊天请求,该名称在模型可用的所有工具中必须是唯一的。

• description:工具的描述,模型可以通过该描述了解何时以及如何调用该工具。如果未提供,则方法名称将用作工具描述。但是,强烈建议提供详细的描述,因为这对于模型理解工具的用途及其使用方法至关重要。如果描述不充分,可能会导致模型在应该使用工具时不使用它,或者错误地使用它。

• returnDirect:工具结果应直接返回给客户端还是传递回模型。有关更多详细信息,请参阅直接返回。

• resultConverter:ToolCallResultConverter用于将工具调用的结果转换为可String object发送回 AI 模型的实现。更多详情,请参阅结果转换。

强烈建议仔细填写description内容。

最后我们还要在McpServerApplication类中,提供一个ToolCallbackProvider。

4、配置Dify MCP客户端

要测试我们的MCP服务还需要一个MCP客户端,Dify刚好有MCP客户端的插件,我们来安装一下。

打开Dify的插件页面,搜索MCP,安装Agent 策略(支持 MCP 工具)和 MCP SSE / StreamableHTTP插件。

5、新建一个空白ChatFlow流程

在模型下拉框中选个你喜欢的大模型,由于我们是直接调用MCP服务,大模型的作用其实就是帮我们选择具体的工具和提取参数,没必要用推理能力,用了推理大模型反而会影响选择工具的准确性。

所以,我这里没有选DeepSeek推理大模型,我选的是豆包大模型。

工具列表选择插件里的“获取MCP工具列表”:

点击“获取MCP工具列表”工具,点击“授权”按钮,添加MCP服务的连接信息:

6、MCP 服务配置

先测试自己本地代码的MCPserver是否正常

正常后再Dify 做配置

6、MCP 服务配置后进行指令配置

接下来是配置的重点了。首先把“Agent”节点连接到“开始节点”和“直接回复节点”中间:

指令栏填写:

指令的重点就是先让大模型分析用户输入的内容(sys.query),然后告诉大模型什么情况下要调用什么工具,把工具的名称告诉大模型,最好能给出几个例子,让大模型更好的理解。

最后让大模型优化输出格式,比如用表格输出。

测试看效果

全部设置好之后,整个工作流就三个节点,现在可以点预览按钮测试了:

最后

通过这个例子,我们创建了一个MCP服务,并通过Dify客户端成功调用。

用Java写MCP服务,我们只需要在Spring AI项目的基础上添加自己的Service,然后在Service里添加业务数据查询的工具就行了。

这样我们就能实现AI业务数据查询(问数)的功能啦!

如果对文章感兴趣请关注我,如果觉得有收获打个赏哈,定期发布最详细的MCP集成Dify的实战教程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣992做题笔记

左神做法的理论依据 我们可以通过 集合的包含关系 和 具体示例枚举 来直观理解这一推导过程。以下结合题目示例 1 进行详细说明: 示例 1 分析 输入:nums [1,2,1,2,3], k 2 目标:计算恰好包含 2 种不同整数 的子数组个数。 步骤一集合 A…

Kubernetes 运维操作手册:从 etcd 快照进行精确恢复

1 5 步实现 etcd 精确恢复 将快照恢复到本地 etcd 数据目录。使用恢复的数据启动本地 etcd 实例。使用 etcdctl 查询特定键(例如,ConfigMap)。使用 auger 解码以提取干净的 YAML。使用 kubectl 申请恢复到您的实时集群。 本指南将指导您从 et…

LeetCode Hot100刷题——合并区间

56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:i…

《Metasploit框架核心模块解析与安全防护实践》​

目录 ​​一、框架模块化设计与安全验证价值​​ ​​1. 漏洞验证模块(Exploit Modules)​​ ​​2. 安全评估模块(Auxiliary Modules)​​ ​​3. 安全响应模块(Post-Exploitation)​​ ​​4. 载荷安全…

Cribl 中 Parser 扮演着重要的角色 + 例子

先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…

程序设计实践--排序(1)

&#xff11;、插入排序&#xff08;一个数组&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…

MAC电脑中右键后复制和拷贝的区别

在Mac电脑中&#xff0c;右键菜单中的“复制”和“拷贝”操作在功能上有所不同&#xff1a; 复制 功能&#xff1a;在选定的位置创建一个与原始文件相同的副本。快捷键&#xff1a;CommandD用于在当前位置快速复制文件&#xff0c;CommandC用于将内容复制到剪贴板。效果&…

新能源汽车焊接智能节气阀

在新能源汽车产业迅猛发展的浪潮中&#xff0c;制造工艺的优劣直接关系到车辆的性能、安全与市场竞争力。焊接&#xff0c;作为新能源汽车生产流程里的关键一环&#xff0c;无论是构建车身框架&#xff0c;还是连接电池模组&#xff0c;其质量的好坏都起着决定性作用。而在焊接…

Linux:面试题

1. 什么是中断和异常&#xff1f; 中断&#xff1a;由外部设备&#xff08;如键盘、网卡&#xff09;触发的异步事件&#xff0c;用于通知 CPU 有紧急事件需要处理。 异常&#xff1a;由 CPU 内部执行指令时产生的同步事件&#xff08;如除零错误、缺页异常&#xff09;&#…

linux关闭某端口暂用的进程

查看是哪个端口暂用 sudo netstat -tulpn | grep :80根据图片 显示 80端口暂用的 进程id是 3002 结束进程id为3002的进程 sudo kill -9 3002

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本&#xff0c;此时选择的内核是base虚拟环境的Python内核&#xff0c;如果我想切换成其他conda虚拟环境来运行这个文件该怎么办&#xff1f;下面我们试着还原一下问题&#xff0c;并且解决问题。 【注】 这个问题出…

React Flow 边的基础知识与示例:从基本属性到代码实例详解

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…

ZooKeeper 原理解析及优劣比较

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 引言 在分布式系统中&#xff0c;服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…

模糊照片变清晰:照片高清修复 ComfyUI 使用教学

模糊照片变清晰 满心欢喜地翻出旧相册&#xff0c;想重温那些美好的回忆&#xff0c;结果照片却模糊不清&#xff0c;根本看不清当年的模样&#xff1b;又或者精心拍摄了一张超有氛围感的照片&#xff0c;结果因为手抖或者光线问题&#xff0c;变得模糊&#xff0c;无法发朋友圈…

IEEEtran中文献中的作者大于3个时,用et al.省略

latex&#xff1a; 在使用bib文件的时候&#xff0c;当参考文献超过三个作者时&#xff0c;第三个作者后加逗号并接上et al.。我使用的是IEEEtran.bst。 \begingroup \small \bibliographystyle{IEEEtran} \bibliography{newbmyref1} \endgroup1.需要将IEEEtran.bst添加到这个…

Android Studio Kotlin 中的方法添加灰色参数提示

在使用 Android Studio 时&#xff0c; 我发现使用 Java 编写方法后在调用方法时&#xff0c; 会自动显示灰色的参数。 但在 Kotlin 中没有显示&#xff0c; 于是找了各种方法最后找到了设置&#xff0c; 并且以本文章记录下来。 博主博客 https://blog.uso6.comhttps://blog.…

python宠物用品商城系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

《具身智能机器人:自修复材料与智能结构设计的前沿探索》

在具身智能机器人的研发进程中&#xff0c;自修复材料与智能结构设计无疑是极具挑战性与创新性的关键领域&#xff0c;吸引着无数科研人员投身其中&#xff0c;探寻未知。 传统机器人在复杂多变的环境中执行任务时&#xff0c;一旦材料出现损伤&#xff0c;如外壳刮擦、内部线…

矩阵的秩(Rank)

矩阵的秩&#xff08;Rank&#xff09;是线性代数中的核心概念&#xff0c;表示矩阵中线性无关的行&#xff08;或列&#xff09;的最大数量&#xff0c;反映了矩阵所包含的“独立信息”的多少。以下是其核心要点&#xff1a; 1. 秩的定义 行秩&#xff1a;矩阵中线性无关的行…

麒麟系统编译osg —— 扩展篇

一、背景 前文讲到麒麟系统编译osg&#xff0c;通常情况下会提示&#xff1a; 意思是无法生成插件osgdb_jpeg&#xff0c;需要配置“JPEG_LIBRARY”和“JPEG_INCLUDE_DIR”。 经查&#xff0c;本机不存在jpeglib.h和libjpeg.so&#xff0c;需要另外安装。 二、编译jpeg库 …