服务器大本营

 找回密码
 我要入营

QQ登录

只需一步,快速开始

查看: 56|回复: 0

MCP服务器部署 Java+Dify 实现AI业务数据查询

[复制链接]

6万

敬重

753

主题

207

精华

管理员

积分
8489

启航之章进阶之印里程之碑突破之证飞跃之星蜕变之勋卓越之路龙年行大运

QQ
发表于 前天 15:47 | 显示全部楼层 |阅读模式

我要入营,结交更多好友,开启更多功能,轻松玩转服务器大本营!

您需要 登录 才可以下载或查看,没有账号?我要入营

x
MCP协议是什么?
最近 MCP 协议颇为热门,那么什么是MCP呢?

MCP的全称是模型上下文协议(Model Context Protocol),是由Anthropic推出的一种开放标准协议。其设计目的在于让大型语言模型(LLMs)能够与外部的数据源和工具实现无缝交互。MCP就像是为AI提供了一个“通用插头”,使得这些智能模型可以像我们使用USB接口一样,轻松连接到各种不同的设备和服务上。

MCP官网链接:https://modelcontextprotocol.io/introduction

MCP的定义如下:
MCP 是一个开放协议,用于标准化应用程序向大语言模型提供上下文的方式。可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化方式。

简单来说,MCP就是一个AI调用服务的协议,它就像一个“连接器”,让AI模型能够方便地连接到各种数据源和工具。

就像我们熟知的 USB-C 接口,它能让电脑轻松连接到如鼠标、键盘、音响或者硬盘等各种设备。MCP的作用类似,它为AI模型提供了一个标准化的连接方式,让模型能够方便地接入不同的数据源和工具,就像 USB-C 让设备之间能够无缝连接一样。

MCP允许AI模型通过标准化的方式连接到外部数据源或服务(比如天气API、数据库查询等)。

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


接下来我们就用Java来搭建个MCP服务。

Spring MCP Server
说起Java,就绕不开Spring,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
• Spring WebFlux (Reactive SSE) - spring-ai-starter-mcp-server-webflux

这三种模式有什么不同?

我借鉴一下 Kimi 的答案:

在 Spring AI 中,Standard MCP Server、WebMVC Server Transport 和 WebFlux Server Transport 是三种不同的服务器实现方式,主要用于支持模型上下文协议(MCP)的通信。

以下是它们的区别:

1、Standard MCP Server
• 核心功能:Standard MCP Server 是基于标准输入/输出(STDIO)的服务器实现。它主要用于进程内通信,适合在同一个进程中运行客户端和服务器端,通过标准输入输出流进行数据交互。
• 适用场景:适用于简单的本地开发环境或单进程应用,不涉及复杂的网络通信。
特点:实现简单,但不具备网络通信能力,无法支持分布式或多进程环境。

2、WebMVC Server Transport
• 核心功能:WebMVC Server Transport 是基于 Spring MVC 的服务器实现。它通过 Servlet 提供服务器发送事件(SSE)支持,允许服务器主动向客户端推送数据。
• 适用场景:适合传统的基于 Servlet 的 Web 应用程序,能够与现有的 Spring MVC 项目无缝集成。
• 特点
      • 基于 Servlet API,支持阻塞式 I/O 操作。
      • 提供标准化的 SSE 端点(如 /mcp/sse),客户端可以通过 text/event-stream 协议与服务器通信。
      • 支持同步模式,适合传统的请求-响应模式。

3、WebFlux Server Transport
• 核心功能:WebFlux Server Transport 是基于 Spring WebFlux 的服务器实现。它提供了响应式 SSE 支持,能够处理高并发的异步流式数据。
• 适用场景:适合需要高性能、非阻塞 I/O 的现代响应式应用,特别是在处理大量并发连接时表现出色。
• 特点
      • 基于响应式编程模型,支持非阻塞操作。
      • 提供响应式的 SSE 端点,客户端可以通过 text/event-stream 协议与服务器进行流式交互。
      • 支持异步模式,适合需要高并发和低延迟的应用。

总结
• Standard MCP Server 适合简单的本地开发和单进程通信。
• WebMVC Server Transport 适合传统的基于 Servlet 的 Web 应用,支持同步模式。
• WebFlux Server Transport 适合高性能、高并发的响应式应用,支持异步模式。


好了,我决定用 WebMVC Server Transport 试试。

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

下载代码:https://github.com/spring-projects/spring-ai-examples

找到starter-webmvc-server项目:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


然后运行测试文件 ClientSse.java ,可以看到终端返回了天气信息。

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询



MCP服务运行成功。

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

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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

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

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


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


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


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


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

代码如下:
  1. package org.springframework.ai.mcp.sample.server;

  2. import org.springframework.ai.tool.annotation.Tool;
  3. import org.springframework.stereotype.Service;

  4. @Service
  5. public class BIService {

  6.     @Tool(description = "根据客户名称查询项目信息,输入参数是客户名称:customerName")
  7.     public String getProjectInfoByCustomerName(String customerName) {
  8.         // 在实际应用中,根据客户名称连接业务系统数据库,查询项目信息
  9.         // 这里只是一个示例,返回一个固定的项目信息
  10.         return "系统查询客户:" + customerName + "项目信息";
  11.     }

  12.     @Tool(description = "根据合同号查询项目信息,输入参数是合同编号:contractNum")
  13.     public String getProjectInfoByContractNum(String contractNum) {
  14.         // 在实际应用中,根据合同编号连接业务系统数据库,查询项目信息
  15.         // 这里只是一个示例,返回一个固定的项目信息
  16.         return "系统查询合同编号:" + contractNum + "项目信息";
  17.     }
  18. }
复制代码

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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


  1. @Bean
  2. public ToolCallbackProvider biTools(BIService biService) {
  3.     return MethodToolCallbackProvider.builder().toolObjects(biService).build();
  4. }
复制代码

这样,我们的MCP服务就写好了。

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

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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


安装好插件之后,我们新增一个Chatflow应用:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


添加Agent节点:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


在AGENT策略里选择“支持MCP工具的Agent”,然后选择“ReAct”:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

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

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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


在这里填写MCP服务配置信息,记得先启动MCP服务哦。

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


先打开浏览器,输入MCP服务器的地址试一下(别忘了URL最后要加 /sse):

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


测试没问题之后,在MCP服务配置中填入以下信息:
  1. {  "bi-mcp-server": {    "url": "http://...:8080/sse",    "headers": {}, "timeout": 60,    "sse_read_timeout": 300  }}
复制代码

继续填写MCP服务配置:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


  1. {
  2.     "bi-mcp-server": {
  3.         "url": "http://...:8080/sse"
  4.     }
  5. }
复制代码

配置重点
接下来是配置的重点了。

首先把“Agent”节点连接到“开始节点”和“直接回复节点”中间:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


在指令栏中填写:
  1. 分析{{#sys.query#}}的内容:

  2. 1、如果用户输入的内容中包含客户名称,提取客户名称,调用工具“getProjectInfoByCustomerName”,把客户名称做为参数"customerName"的值。
  3. 2、如果用户输入的内容中包含合同编号(例如:250318051004,20240318007),提取合同编号,调用工具“getProjectInfoByContractNum”,把合同编号做为参数"contractNum"的值。
  4. 3、如果用户输入其他内容,直接回答用户的问题

  5. 优化输出格式,如果输出数据中有多个值,用表格的方式输出。
复制代码

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

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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


查询栏中填写sys.query就行了:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


最大迭代次数是指大模型调用工具的最多次数,经过我的测试,这里不能填1,填2就能正常工作了:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


最后,在直接回复节点中回复Agent的text内容:

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


我输入公司名称和合同号,成功调用了对用MCP服务,测试成功!

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


点击发布按钮,更新发布就可以发布我们的AI应用啦!

MCP服务器部署 Java+Dify 实现AI业务数据查询

MCP服务器部署 Java+Dify 实现AI业务数据查询


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

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

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

感谢您的阅读,服务器大本营-技术文章内容集合站,助您成为更专业的服务器管理员!


一入IDC深似海,从此你我是良人!
您需要登录后才可以回帖 登录 | 我要入营

本版积分规则

点击直接加入[服务器大本营QQ频道]
滴!摸鱼时间到~
Loading...

QQ|Archiver|手机版|网站地图|服务器大本营 ( 赣ICP备2021009089号 )

GMT+8, 2025-5-9 20:35 , Processed in 0.063135 second(s), 30 queries , Gzip On.

Powered by 服务器大本营

© 2021-2023 联系飞飞

快速回复 返回顶部 返回列表