dify调用Streamable HTTP MCP应用

一、概述

上一篇文章,介绍了使用python开发Streamable HTTP MCP应用,链接:https://www.cnblogs.com/xiao987334176/p/18872195

接下来介绍dify如何调用MCP

二、插件

安装插件

需要安装2个插件,分别是:Agent 策略(支持 MCP 工具),MCP SSE

Agent 策略(支持 MCP 工具)

Agent 策略集合(支持 MCP SSE 发现和调用工具)

github地址:https://github.com/junjiem/dify-plugin-agent-mcp_sse

MCP SSE / StreamableHTTP

通过 HTTP with SSE 或 Streamable HTTP 传输方式使用 MCP 协议来发现和调用工具。

github地址:https://github.com/junjiem/dify-plugin-tools-mcp_sse

注意:请确保插件是最新版本,因为新版本增加了Streamable HTTP

目前最新版本如下:

 请确保dify版本不要太低,最好是1.3以上

插件配置

点击插件MCP SSE,设置授权

 输入mcp服务配置

完整内容如下:

{
    "mysql8-mcp-server": {
        "transport": "streamable_http",
        "url": "http://172.16.3.121:9000/mcp/",
        "headers": {},
        "timeout": 60
    }
}

参数说明:

mysql8-mcp-server:mcp名字,名字可以随便写。

transport:mcp运行模式,streamable_http表示Streamable HTTP

url:mcp访问地址

注意:如果是使用fastmcp开发的,末尾必须带有斜杠,否则添加会报错

PluginInvokeError: {"args":{},"error_type":"Exception","message":"mysql8-mcp-server - Unsupported Content-Type: None"}

headers:请求头设置,如果没有特殊要求,这里设置为空。

timeout:超时时间,这里设置为60秒

注意:上面只是举例了一个mcp应用,如果有多个,在里面添加即可,比如:

三、dify工作流设置

创建工作流

类型:Chatflow

名称:test-mcp-mysql8

 删除LLM节点,添加一个agnet,效果如下:

agent设置

agent策略

 重点看agent配置

AGENT策略必须选择ReAct (Support MCP Tools)

为什么一定要选ReAct,因为我发现FunctionCalling有问题

模型

模型随便选一个即可,这里选的是qwen3-32b

 工具列表

注意:工具列表,这里一定要留空。

为什么?因为这里提供的方法,只支持SSE模式,并不支持Streamable HTTP,所以千万不要选。

agent插件,已经支持Streamable HTTP 工具列表自动发现,所以不需要选。

MCP服务配置

 mcp服务配置,完整内容如下:

{
    "mysql8-mcp-server": {
        "transport": "streamable_http",
        "url": "http://172.16.3.121:9000/mcp/",
        "timeout": 60
    }
}

注意:这里的url末尾要带斜杠,因为是fastmcp开发的,所有要带。

如果是java或者nodejs开发的mcp,我就不确定了,需要自行尝试。

指令

指令就是我们熟悉的提示词

  提示词和以前一样

使用中文回复。

当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:

# 学生管理系统数据库表结构说明

## 1. 教师表 (teachers)

| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 教师ID | 主键 | "T001" |
| name | varchar | 教师姓名 | 必填 | "张建国" |
| gender | enum | 性别 | "男"或"女" | "男" |
| subject | varchar | 教授科目 | 必填 | "数学" |
| title | varchar | 职称 | 必填 | "教授" |
| phone | varchar | 联系电话 | 必填 | "13812345678" |
| office | varchar | 办公室位置 | 必填 | "博学楼301" |
| wechat | varchar | 微信(可选) | 可选 | "lily_teacher" |
| isHeadTeacher | enum | 是否为班主任,"true"或"false" | 可选 | true |

## 2. 班级表 (classes)

| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 班级ID | 主键 | "202301" |
| className | varchar | 班级名称 | 必填 | "2023级计算机1班" |
| grade | int | 年级 | 必填 | 2023 |
| headTeacherId | varchar | 班主任ID | 外键(teachers.id) | "T003" |
| classroom | varchar | 教室位置 | 必填 | "1号楼302" |
| studentCount | int | 学生人数 | 必填 | 35 |
| remark | varchar | 备注信息 | 可选 | "市级优秀班集体" |

## 3. 课程表 (courses)

| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 课程ID | 主键 | "C001" |
| courseName | varchar | 课程名称 | 必填 | "高等数学" |
| credit | int | 学分 | 必填 | 4 |
| teacherId | varchar | 授课教师ID | 外键(teachers.id) | "T001" |
| semester | varchar | 学期 | 格式"YYYY-N" | "2023-1" |
| type | enum | 课程类型 | "必修"或"选修" | "必修" |
| prerequisite | varchar | 先修课程ID | 可选,外键(courses.id) | "C003" |

## 4. 学生表 (students)

| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 学号 | 主键 | "S20230101" |
| name | varchar | 学生姓名 | 必填 | "王强" |
| gender | enum | 性别 | "男"或"女" | "男" |
| birthDate | date | 出生日期 | 必填 | date("2005-01-15") |
| enrollmentDate | date | 入学日期 | 必填 | date("2023-8-1") |
| classId | varchar | 班级ID | 外键(classes.id) | "202301" |
| phone | varchar | 联系电话 | 必填 | "13812345678" |
| email | varchar | 电子邮箱 | 必填 | "20230101@school.edu.cn" |
| emergencyContact | varchar | 紧急联系人电话 | 必填 | "13876543210" |
| address | varchar | 家庭住址 | 必填 | "北京市海淀区中关村大街1栋101室" |
| height | int | 身高(cm) | 必填 | 175 |
| weight | int | 体重(kg) | 必填 | 65 |
| healthStatus | enum | 健康状况 | 必填,"良好"或"一般‌"或"较差" | "良好" |

## 5. 成绩表 (scores)

| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 成绩记录ID | 主键 | "S20230101C001" |
| studentId | varchar | 学生ID | 外键(students.id) | "S20230101" |
| courseId | varchar | 课程ID | 外键(courses.id) | "C001" |
| score | int | 综合成绩 | 0-100 | 85 |
| examDate | date | 考试日期 | 必填 | date("2024-5-20") |
| usualScore | int | 平时成绩 | 0-100 | 90 |
| finalScore | int | 期末成绩 | 0-100 | 80 |

### 补考成绩记录说明
补考记录在_id后添加"_M"后缀,如"S20230101C001_M"

## 表关系说明

1. **一对多关系**:
   - 一个班级(classes)对应多个学生(students)
   - 一个教师(teachers)可以教授多门课程(courses)
   - 一个学生(students)有多条成绩记录(scores)

2. **外键约束**:
   - students.classId → classes.id
   - courses.teacherId → teachers.id
   - scores.studentId → students.id
   - scores.courseId → courses.id
   - classes.headTeacherId → teachers.id
View Code

mysql表结构,参考文章:https://www.cnblogs.com/xiao987334176/p/18826422

查询

这里选择变量query,也就是开始步骤中的输入变量

最大迭代次数

最大迭代次数是一个重要的参数,用于控制工具调用的深度和复杂性。它主要用于防止无限循环或过度调用工具,从而避免资源浪费或系统性能问题。

 默认是3,也必须要设置一下,否则无法保存

最后连接直接回复

选择变量Agent.text

点击发布预览

四、dify测试

学生里面,男生多还是女生多?

 哪个老师带的学生最多?

 总成绩最好的是哪个班级?

<think>好的,用户的问题是如何在Dify工作流中集成和调用其他MCP服务。首先,我需要回顾一下用户提供的引用内容,特别是引用[1]和引用[3],因为它们提到了Dify工作流和MCP服务的关系。 根据引用[1],用户开发了一个MCP Server应用,目的是让VS Code客户端的MCP Client能够调用Dify中的指定工作流,而Dify的配置文件在config.yaml中。这说明Dify工作流可能需要通过某种接口或配置来与MCP服务通信。引用[3]提到虽然有很多生成式AI框架,但缺乏调试工具,但用户的问题是关于集成方法,可能需要配置服务调用或API端点。 接下来,我需要确定Dify工作流如何调用外部服务。通常,工作流系统会提供HTTP请求节点或自定义代码节点来连接外部服务。查看引用[2],其中提到使用Prompt模板和LLMs结合CoT思维链来执行步骤,最后通过Action: Finish结束。这可能意味着在Dify中可以通过自定义动作(Action)来触发外部服务调用。 因此,可能的步骤是:1. 在Dify中配置MCP服务的API端点;2. 使用HTTP请求节点或自定义代码节点调用MCP服务;3. 处理响应并继续工作流。需要检查Dify的文档是否有相关节点支持,或者是否允许编写自定义代码。 用户可能需要示例,比如在config.yaml中定义MCP服务的配置,然后在工作流中添加HTTP请求节点,指向MCP的API,并处理返回的数据。另外,引用[1]中的Python代码示例可能提示用户熟悉Python,所以用Python编写自定义函数来调用MCP服务也是一个方法。 需要确保回答中提到配置文件的修改、API调用方式、以及可能的认证机制,如API密钥。同时,要提醒用户注意错误处理和超时设置,确保工作流的稳定性,如引用[3]提到的质量不佳问题,可能需要调试和优化这些调用。</think>### 如何在Dify工作流中集成和调用其他MCP服务 #### 1. 服务注册与配置 首先需要在Dify的配置文件(如`config.yaml`)中定义目标MCP服务的连接信息。例如: ```yaml mcp_services: search_service: endpoint: "http://mcp-search-service/api/v1" auth_key: "YOUR_API_KEY" data_processing: endpoint: "http://mcp-data-processor/api" timeout: 10 ``` 通过配置文件声明服务地址、认证方式等元数据,为后续调用提供基础[^1]。 #### 2. 工作流节点设计 在Dify工作流编辑器中添加自定义动作节点,支持通过HTTP请求或gRPC调用MCP服务: ```python # 示例:通过Python自定义节点调用MCP服务 import requests def call_mcp_service(service_name, params): config = load_config() # 读取config.yaml配置 endpoint = config['mcp_services'][service_name]['endpoint'] response = requests.post( endpoint, json=params, headers={"Authorization": config['mcp_services'][service_name]['auth_key']} ) return response.json() ``` 此代码演示了如何通过配置动态加载服务地址并实现API调用[^1][^2]。 #### 3. 逻辑编排 结合思维链(CoT)模式编排工作流: 1. **输入解析节点**:接收用户原始请求 2. **意图识别节点**:判断是否需要调用MCP服务 3. **服务调用节点**:通过前述方法调用MCP服务 4. **结果处理节点**:处理返回数据 5. **输出生成节点**:返回最终响应 例如在Prompt模板中定义: ``` Thought: 用户需要查询{{topic}}信息 ===> Action: Search[mcp_search_service] {{search_results}} ===> Action: Finish ``` 这种模式可实现自动化服务调用[^2]。 #### 4. 调试与优化 建议通过以下方式保证服务质量: - 添加服务调用超时机制 - 实现重试策略(指数退避) - 记录服务调用日志 - 设置熔断阈值(如错误率超过30%暂停调用) 这些措施可缓解引用[3]中提到的质量不稳定问题。 #### 5. 安全认证 推荐采用以下认证方式: ```python # JWT认证示例 import jwt def generate_auth_token(service_name): payload = { "service": service_name, "exp": datetime.utcnow() + timedelta(minutes=5) } return jwt.encode(payload, SECRET_KEY, algorithm="HS256") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值