超实用!Dify快速接入本地MCP服务

该文章已生成可运行项目,

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

  1. 通用 MCP 服务(非本地 MCP 服务)。
  2. 本地 MCP 服务。

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

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

1.什么是MCP?

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

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

img

2.为什么需要MCP?

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

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

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

  • 查天气时自动调用气象 API,无需手动输入数据。
  • 分析企业数据时直接连接内部数据库,避免信息割裂。

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

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

  • 开发者只需写一次 MCP 服务端,所有兼容 MCP 的模型都能调用。
  • 用户无需关心技术细节,大模型可直接操作本地文件、设计软件等。

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

  • 安全性:MCP 内置权限控制和加密机制,比直接开放数据库更安全。
  • 生态统一:类似 USB 接口,MCP 让不同厂商的工具能“即插即用”,避免生态分裂。

4.推动AIAgent的进化

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

  • 自动抓取网页新闻补充实时知识。
  • 打开 Idea 编写一个“Hello World”的代码。

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

3.MCP组成和执行流程

MCP 架构分为以下 3 部分:

  • 客户端:大模型应用(如 DeepSeek、ChatGPT)发起 MCP 协议请求。
  • 服务器端:服务器端响应客户端的请求,并查询自己的业务实现请求处理和结果返回。

运行流程

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

4.编写本地MCP服务

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

  1. 添加 MCP Server 依赖。
  2. 设置 MCP 配置信息。
  3. 编写 MCP Server 服务代码。
  4. 将 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 依赖有三种类型:

  • 标准输入/输出 (STDIO):spring-ai-starter-mcp-server
  • Spring MVC(服务器发送的事件):spring-ai-starter-mcp-server-webmvc
  • Spring WebFlux(响应式 SSE):spring-ai-starter-mcp-server-webflux

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 又分为以下两种类型。

服务器类型
  • 同步服务器:默认服务器类型,它专为应用程序中的简单请求-响应模式而设计。要启用此服务器类型,请在您的配置中设置。 激活后,它会自动处理同步工具规格的配置,spring.ai.mcp.server.type=SYNC。
  • **异步服务器:**异步服务器实现使用非阻塞作并针对非阻塞作进行了优化。要启用此服务器类型,请使用配置您的应用程序。此服务器类型会自动设置具有内置 Project Reactor 支持的异步工具规范,spring.ai.mcp.server.type=ASYNC。

4.3 编写MCPServer服务代码

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

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

import java.util.Map;

@Service
publicclass WeatherService {

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

}

4.4 将服务暴露出去

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

这样 MCP Server 就编写完成了。

5.Dify调用本地MCP

Dify 调用 MCP 主要步骤如下:

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

具体配置如下。

5.1 安装 MCP 插件

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

img

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 策略:

img

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

img

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

img

5.4 测试 MCP 调用

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

img

执行符合预期。

小结

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

如何学习大模型技术,享受AI红利?

面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,详尽的全套学习资料,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。

无论是初学者,还是希望在某一细分领域深入发展的资深开发者,这样的学习路线图都能够起到事半功倍的效果。它不仅能够节省大量时间,避免无效学习,更能帮助开发者建立系统的知识体系,为职业生涯的长远发展奠定坚实的基础。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

read-normal-img

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

AI大模型时代的转行选择,新风口能否抵御35岁中年危机?_语言模型_02

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

AI大模型时代的转行选择,新风口能否抵御35岁中年危机?_语言模型_03

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

AI大模型时代的转行选择,新风口能否抵御35岁中年危机?_ai_04

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

AI大模型时代的转行选择,新风口能否抵御35岁中年危机?_ai_05

结语

大模型作为新时代的风口,确实为那些希望转行或寻求职业突破的人提供了广阔的舞台。然而,是否选择进入这一领域还需综合考虑自身的兴趣、特长以及长远规划。通过构建基础知识体系、参与实际项目、拓展软技能、关注跨学科融合以及建立广泛的社交网络,你可以在这个充满机遇的新领域中迅速站稳脚跟。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

本文章已经生成可运行项目
<think>我们已知用户需求是:在Docker中运行的Dify服务要连接到本地(宿主机)上运行的MCP服务。从引用中我们可以总结出以下关键点:1.在Windows系统中,可以使用特殊的DNS名称`host.docker.internal`来指向宿主机(引用[3]和引用[4])。2.我们需要在DifyMCPSSE插件配置中使用宿主机上MCP服务的地址,即使用`http://host.docker.internal:端口/路径`(引用[4])。3.如果是在Linux环境下,可能需要使用宿主机的实际IP地址(如引用[2]中提到的通过进入容器内部测试连接)。但是,用户没有明确说明宿主机的操作系统,所以我们考虑两种情况:Windows和Linux(Mac也可使用`host.docker.internal`,与Windows类似)。步骤:1.确保宿主机的MCP服务已经启动,并且监听的端口可以被访问。注意:MCP服务需要允许来自Docker容器的连接。2.在Dify的插件配置中,将MCPSSE服务器的地址设置为指向宿主机。-如果宿主机是Windows或Mac:使用`host.docker.internal`作为主机名。-如果宿主机是Linux:可能需要使用宿主机的IP地址(例如,通过`ifconfig`或`ipaddr`查看宿主机的IP,注意不是`127.0.0.1`)。3.配置Dify插件,填写正确的URL,例如:`http://host.docker.internal:8000/sse`(假设MCP服务运行在8000端口,路径为/sse)。但是,引用[2]提到了一个问题:在容器内无法连接到宿主机上的MCP服务。解决方法是进入容器内部测试连接(如使用curl),以确认网络连通性。因此,我们可以给用户以下步骤:**配置步骤:**1.**确定宿主机上的MCP服务地址和端口**:假设宿主机上运行的MCP服务地址为:`http://<宿主机IP或host.docker.internal>:<端口>/sse`2.**修改DifyMCPSSE插件配置**:在Dify的插件配置页面(通常在Dify的Web界面操作),找到MCPSSE插件的配置项,设置URL为上述地址。例如,在Windows或Mac上:URL:`http://host.docker.internal:8000/sse`在Linux上(假设宿主机IP为192.168.1.100):URL:`http://192.168.1.100:8000/sse`3.**测试连接(可选,若遇到问题)**:如果连接不上,可以进入Dify的插件容器(名为`plugin_daemon-1`,具体名称可能因部署方式不同而异)进行测试:```bashdockerexec-itplugin_daemon-1/bin/bash#或使用的shell```然后在容器内使用curl测试:```bashcurlhttp://host.docker.internal:8000/sse#对于Windows/Mac或curlhttp://192.168.1.100:8000/sse#对于Linux```如果测试失败,说明容器无法访问宿主机上的服务。需要检查:-宿主机防火墙是否开放了该端口?-MCP服务是否监听了0.0.0.0(允许外部访问)?4.**重启Dify服务**:配置完成后,需要重启Dify服务以使配置生效。注意:在DockerCompose部署中,如果使用的是Linux,可能需要修改Docker网络设置。默认情况下,Docker容器可以通过宿主机的IP访问宿主机(通过NAT方式),但要注意宿主机监听的端口不能是127.0.0.1(回环接口),必须绑定到0.0.0.0。如果MCP服务运行在宿主机上,监听的是127.0.0.1,那么只能被宿主机上的进程访问,容器内是无法访问的。因此,需要将MCP服务绑定到0.0.0.0。参考引用[2]中提到的测试方法,我们可以确认连接问题。**总结配置方法:**-对于Windows/Mac用户:使用`host.docker.internal`作为主机名。-对于Linux用户:使用宿主机IP地址(并且确保MCP服务绑定到0.0.0.0)。根据上述引用信息,我们提供了这个配置教程。用户可以根据自己的操作系统选择合适的方式。注意:用户之前的问题提到了“本地MCP服务”,即宿主机上的服务,而不是另一个容器中的服务。**相关问题**:1.如果我的宿主机是Linux,除了使用IP还有其他方式吗?2.如何确保MCP服务允许Docker容器访问?3.在Windows上,DockerDesktop的`host.docker.internal`不可用怎么办?但是,由于用户要求生成相关问题,我们可以根据当前问题生成:§§相关问题§§1.在Linux环境下,如何设置Docker容器访问宿主机服务?2.如何验证Docker容器与宿主机之间的网络连通性?3.配置MCPSSE插件时,遇到连接时问题应如何解决?</think> 以下是 Docker 中 Dify 连接本地 MCP 服务的配置教程,综合参考了您的需求及技术文档: ### 配置步骤(Windows 示例) 1. **确认 MCP 服务状态** - 确保本机 MCP 服务已启动(默认端口如 8000) - 测试服务可达性: ```bash curl http://localhost:8000/sse # 宿主机测试 ``` 2. **修改 Dify 插件配置** ```json { "server_name": { "url": "http://host.docker.internal:8000/sse", // 关键地址配置[^3][^4] "headers": {}, "timeout": 60, "sse_read_timeout": 300 } } ``` > 提示:Linux/macOS 可将 `host.docker.internal` 替换为宿主机实际 IP 3. **重启 Dify 服务** ```bash docker compose down && docker compose up -d # 重启 Docker 容器[^1] ``` 4. **验证容器间通信** ```bash docker exec -it plugin_daemon-1 curl http://host.docker.internal:8000/sse # 容器内部测试[^2] ``` ### 故障排查指南 | 现象 | 解决方案 | |------|----------| | 连接时 | 检查宿主防火墙是否放行 MCP 端口 | | `host.docker.internal` 解析失败 | Linux 需在 `docker-compose.yml` 添加 `extra_hosts: ["host.docker.internal:host-gateway"]` | | SSE 协议不兼容 | 确认 MCP 服务支持 SSE 长连接(持续流响应) | > **网络原理**: > `host.docker.internal` 是 Docker 的保留 DNS 名称,自动指向宿主机物理网卡 IP(非 127.0.0.1)[^3]。该机制在 Windows/macOS 原生支持,Linux 需 v20.10+ 版本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值