掘金 人工智能 06月03日 12:23
超实用!Dify快速接入本地MCP服务
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了Dify如何通过插件调用MCP服务,特别是本地MCP服务的实现方法。文章首先介绍了MCP的概念、作用以及它在大模型时代解决的关键问题。随后,详细阐述了本地MCP服务的编写步骤,包括依赖添加、配置设置、服务代码编写和服务暴露。最后,文章演示了Dify调用本地MCP服务的具体流程,并强调了其与调用通用MCP服务的共通性,为读者提供了清晰的实践指南。

💡MCP(Model Context Protocol)是由Anthropic提出的开放协议,用于大模型连接外部数据源。它类似于Java的Spring Cloud Openfeign,但MCP应用于大模型通讯,解决数据孤岛、开发低效和生态碎片化等问题。

🛠️编写本地MCP服务涉及添加MCP Server依赖、设置MCP配置信息、编写MCP Server服务代码和将服务暴露。Spring AI提供了便捷的实现方式,例如使用`spring-ai-starter-mcp-server-webflux`依赖。

⚙️Dify调用MCP服务需安装MCP插件、配置MCP服务HTTP地址和Agent。配置Agent时,需要设置Agent策略、选择LLM,并配置MCP工具和HTTP地址。测试结果显示,Dify成功调用了本地MCP服务,与调用通用MCP服务的方式一致。

Dify 可以通过插件实现 MCP 服务调用,而被调用的 MCP 服务基本可以分为以下两类:

    通用 MCP 服务(非本地 MCP 服务)。本地 MCP 服务。

本地 MCP 服务指的是本地通过 Java 或其他语言实现的 MCP 服务器端。

当你会用 Dify 调用本地 MCP 服务,也就意味着你会使用 Dify 调用通用 MCP 服务了,因为实现步骤和原理基本都是一样。

1.什么是MCP?

MCP 是 Model Context Protocol,模型上下文协议,它是由 Anthropic(Claude 大模型母公司)提出的开放协议,用于大模型连接外部“数据源”的一种协议。

它可以通俗的理解为 Java 界的 Spring Cloud Openfeign,只不过 Openfeign 是用于微服务通讯的,而 MCP 用于大模型通讯的,但它们都是为了通讯获取某项数据的一种机制,如下图所示:

2.为什么需要MCP?

MCP 存在的意义是它解决了大模型时代最关键的三个问题:数据孤岛**、开发低效和生态****碎片化**等问题。

1.打破数据孤岛,让AI“连接万物”

大模型本身无法直接访问实时数据或本地资源(如数据库、文件系统),传统方式需要手动复制粘贴或定制接口。MCP 通过标准化协议,让大模型像“插USB”一样直接调用外部工具和数据源,例如:

2.降低开发成本,一次适配所有场景

在之前每个大模型(如 DeepSeek、ChatGPT)需要为每个工具单独开发接口(Function Calling),导致重复劳动,MCP 通过统一协议:

3.提升安全性与互操作性

4.推动AIAgent的进化

MCP 让大模型从“被动应答”变为“主动调用工具”,例如:

MCP 的诞生,相当于为AI世界建立了“通用语言”,让模型、数据和工具能高效协作,最终释放大模型的全部潜力。

3.MCP组成和执行流程

MCP 架构分为以下 3 部分:

运行流程

    用户提问 LLM。LLM 查询 MCP 服务列表。找到需要调用 MCP 服务,调用 MCP 服务器端。MCP 服务器接收到指令。调用对应工具(如数据库)执行。返回结果给 LLM。

4.编写本地MCP服务

接下来,我们使用 Spring AI 来实现本地 MCP 服务器端,它的主要实现步骤如下:

    添加 MCP Server 依赖。设置 MCP 配置信息。编写 MCP Server 服务代码。将 MCP Server 进行暴露设置。

关键实现代码如下。

4.1 添加 MCP Server 依赖

<dependencies>  <dependency>    <groupId>org.springframework.ai</groupId>    <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>  </dependency></dependencies><repositories>  <repository>    <name>Central Portal Snapshots</name>    <id>central-portal-snapshots</id>    <url>https://central.sonatype.com/repository/maven-snapshots/</url>    <releases>      <enabled>false</enabled>    </releases>    <snapshots>      <enabled>true</enabled>    </snapshots>  </repository>  <repository>    <id>spring-milestones</id>    <name>Spring Milestones</name>    <url>https://repo.spring.io/milestone</url>    <snapshots>      <enabled>false</enabled>    </snapshots>  </repository>  <repository>    <id>spring-snapshots</id>    <name>Spring Snapshots</name>    <url>https://repo.spring.io/snapshot</url>    <releases>      <enabled>false</enabled>    </releases>  </repository></repositories>

MCP Server 依赖有三种类型:

4.2 设置 MCP 配置信息

MCP Server 包含以下配置信息:

配置项描述默认值
enabled启用/禁用 MCP 服务器TRUE
stdio启用/禁用 stdio 传输FALSE
name用于标识的服务器名称mcp-server
version服务器版本1.0.0
type服务器类型 (SYNC/ASYNC)SYNC
resource-change-notification启用资源更改通知TRUE
prompt-change-notification启用提示更改通知TRUE
tool-change-notification启用工具更改通知TRUE
tool-response-mime-type(可选)每个工具名称的响应 MIME 类型。例如,将 mime 类型与工具名称相关联spring.ai.mcp.server.tool-response-mime-type.generateImage=image/pngimage/pnggenerateImage()-
sse-message-endpointWeb 传输的 SSE 终端节点路径/mcp/message

其中 MCP Server 又分为以下两种类型。

服务器类型

4.3 编写MCPServer服务代码

编写天气预报查询伪代码:

import org.springframework.ai.tool.annotation.Tool;import org.springframework.stereotype.Service;import java.util.Map;@Servicepublic class WeatherService {    @Tool(description = "根据城市名称获取天气预报")    public String getWeatherByCity(String city) {        Map<String, String> mockData = Map.of(            "西安", "晴天",            "北京", "小雨",            "上海", "大雨"        );        return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");    }}

4.4 将服务暴露出去

@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}

这样 MCP Server 就编写完成了。

5.Dify调用本地MCP

Dify 调用 MCP 主要步骤如下:

    安装 MCP 插件。配置 MCP 服务 HTTP 地址。配置 Agent 相关信息。运行测试。

具体配置如下。

5.1 安装 MCP 插件

安装 Agent 策略(支持 MCP 工具)如下图所示:

MCP SSE 选装,非必须,可以为后续 Agent 提供 MCP 工具列表,方便 LLM 正确理解和调用工具。

5.2 配置 MCP 服务地址

Dify 只支持 HTTP 协议的 MCP 服务调用,它的配置格式如下:

{  "server_name1": {    "transport": "sse",    "url": "http://127.0.0.1:8000/sse",    "headers": {},    "timeout": 50,    "sse_read_timeout": 50  },  "server_name2": {    "transport": "sse",    "url": "http://127.0.0.1:8001/sse"  },  "server_name3": {    "transport": "streamable_http",    "url": "http://127.0.0.1:8002/mcp",    "headers": {},    "timeout": 50  },  "server_name4": {    "transport": "streamable_http",    "url": "http://127.0.0.1:8003/mcp"  }}

支持配置多个 MCP 服务,或者是以下 JSON 格式也支持:

{  "mcpServers": {      "server_name1": {        "transport": "sse",        "url": "http://127.0.0.1:8000/sse",        "headers": {},        "timeout": 50,        "sse_read_timeout": 50      },      "server_name2": {        "transport": "sse",        "url": "http://127.0.0.1:8001/sse"      },      "server_name3": {        "transport": "streamable_http",        "url": "http://127.0.0.1:8002/mcp",        "headers": {},        "timeout": 50      },      "server_name4": {        "transport": "streamable_http",        "url": "http://127.0.0.1:8003/mcp"      }    }}

5.3 配置 Agent

Agent 需要配置的项目比较多,首先是 Agent 策略:

然后是 LLM,选择合适的大模型即可,之后配置 MCP 工具和 HTTP 地址,如下图所示:

之后配置指令和查询问题:

5.4 测试 MCP 调用

我们创建的是一个 ChatFlow,执行效果如下:

执行符合预期。

小结

Dify 调用 MCP 服务主要依靠的是 HTTP 地址和 MCP 协议,对于用户来说他面向的是大模型,对于程序来说是大模型调用了 MCP 服务,所以大模型端也就是 MCP 的客户端。我们会调用本地 MCP 服务了,那么问题来了,如何调用通用的 MCP 服务呢?

本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、LangChain4j、Dify、AI Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Dify MCP AI Agent Spring AI
相关文章