找回密码
 立即注册
首页 业界区 业界 dify+MCP多应用,构建灵活的AI应用生态系统 ...

dify+MCP多应用,构建灵活的AI应用生态系统

丝甲坞 2025-6-3 00:01:55
一、概述

前面几篇文章写很多MCP应用,基本上一个dify工作流使用一个MCP应用。
那么一个dify工作流,同时使用多个MCP应用,是否可以呢?答案是可以的。
 
先来看一下效果图
1.png

说明:
这里使用了问题分类器,用来判断用户的问题,应该调用哪个MCP应用
AGENT1~4,分别对应一个MCP应用,例如:public-ip-mcp-server,mysql8-mcp-server,desensitization-mcp-server,searxng-mcp-server
针对mysql查询输出的内容,会进行脱敏处理。
二、问题分类器

定义

通过定义分类描述,问题分类器能够根据用户输入,使用 LLM 推理与之相匹配的分类并输出分类结果,向下游节点提供更加精确的信息。
场景

常见的使用情景包括客服对话意图分类、产品评价分类、邮件批量分类等。
在一个典型的产品客服问答场景中,问题分类器可以作为知识库检索的前置步骤,对用户输入问题意图进行分类处理,分类后导向下游不同的知识库查询相关的内容,以精确回复用户的问题。
设置

对于比较精确的条件,一般使用条件分支。但是对于我这种场景,条件比较模糊,所以需要使用问题分类器
 
这里定义了3个分类:
  1. 公网ip相关问题
  2. mysql 数据库相关查询,涉及学生、教师、成绩、班级、课程等
  3. 其他问题
复制代码
效果如下:
2.png

 说明:
公网ip相关问题,会直接调用MCP应用public-ip-mcp-server
mysql相关问题,会调用MCP应用mysql8-mcp-server
其他问题,会调用MCP应用searxng-mcp-server,这个是一个联网搜索引擎,你可以理解为百度,想搜什么都可以。
三、环境说明

dify版本

这里使用的是最新版本1.4.0,如果你的版本没有这么高,1.3.0以上版本也可以。
mcp插件

确保已经安装了以下插件:
  1. Agent 策略(支持 MCP 工具)
  2. MCP SSE / StreamableHTTP
复制代码
确保插件版本,已经升级到最新版本
mcp应用

这里的所有MCP应用,统一使用Streamable HTTP模式,全部部署在k8s里面。
当然,使用docker运行也是可以的。
mcp插件设置

点击插件MCP SSE / StreamableHTTP,输入MCP 服务配置
3.png

 完整内容如下:
  1. {
  2.     "mysql8-mcp-server": {
  3.         "transport": "streamable_http",
  4.         "url": "http://mysql8-mcp-server-svc.mcp:9000/mcp/",
  5.         "headers": {},
  6.         "timeout": 60
  7.     },
  8.     "desensitization-mcp-server": {
  9.         "transport": "streamable_http",
  10.         "url": "http://desensitization-mcp-server-svc.mcp:9000/mcp/",
  11.         "headers": {},
  12.         "timeout": 60
  13.     },
  14.     "public-ip-mcp-server": {
  15.         "transport": "streamable_http",
  16.         "url": "http://public-ip-mcp-server-svc.mcp:9000/mcp/",
  17.         "headers": {},
  18.         "timeout": 60
  19.     },
  20.     "searxng-mcp-server": {
  21.         "transport": "streamable_http",
  22.         "url": "http://searxng-mcp-server-svc.mcp:9000/mcp/",
  23.         "headers": {},
  24.         "timeout": 60
  25.     }
  26. }
复制代码
注意:这里的url使用的是k8s内部地址,如果使用的是docker方式运行,请根据实际情况修改。
四、public-ip-mcp-server设置

public-ip-mcp-server核心代码如下:
server.py
4.gif
5.gif
  1. from fastmcp import FastMCP
  2. import json
  3. import requests
  4. mcp = FastMCP("public-ip-address")
  5. @mcp.tool()
  6. def get_public_ip_address() -> str:
  7.     """
  8.     获取公网ip地址
  9.     返回:
  10.         str: 当前网络的公网ip地址
  11.     """
  12.     response = requests.get("http://ip-api.com/json")
  13.     content = json.loads(response.text)
  14.     return content["query"]
  15. if __name__ == "__main__":
  16.     mcp.run(transport="streamable-http", host="0.0.0.0", port=9000, path="/mcp")
复制代码
View CodeAgent配置

Agent 1详细配置如下:
6.png

 MCP服务配置
  1. {
  2.   "public-ip-mcp-server": {
  3.         "transport": "streamable_http",
  4.         "url": "http://public-ip-mcp-server-svc.mcp:9000/mcp/",
  5.         "headers": {},
  6.         "timeout": 60
  7.     }
  8. }
复制代码
指令
  1. 使用MCP工具,获取服务器公网ip
复制代码
 
最后直接回复,注意选择变量Agent1 text
7.png

 
五、mysql8-mcp-server设置

核心代码

mysql8-mcp-server核心代码如下:
server.py
8.gif
9.gif
  1. from fastmcp import FastMCP
  2. from mysql.connector import connect, Error
  3. import os
  4. mcp = FastMCP("operateMysql")
  5. def get_db_config():
  6.     """从环境变量获取数据库配置信息
  7.     返回:
  8.         dict: 包含数据库连接所需的配置信息
  9.         - host: 数据库主机地址
  10.         - port: 数据库端口
  11.         - user: 数据库用户名
  12.         - password: 数据库密码
  13.         - database: 数据库名称
  14.     异常:
  15.         ValueError: 当必需的配置信息缺失时抛出
  16.     """
  17.     config = {
  18.         "host": os.getenv("MYSQL_HOST", "localhost"),
  19.         "port": int(os.getenv("MYSQL_PORT", "3306")),
  20.         "user": os.getenv("MYSQL_USER"),
  21.         "password": os.getenv("MYSQL_PASSWORD"),
  22.         "database": os.getenv("MYSQL_DATABASE"),
  23.     }
  24.     print(config)
  25.     if not all(
  26.         [
  27.             config["host"],
  28.             config["port"],
  29.             config["user"],
  30.             config["password"],
  31.             config["database"],
  32.         ]
  33.     ):
  34.         raise ValueError("缺少必需的数据库配置")
  35.     return config
  36. @mcp.tool()
  37. def execute_sql(query: str) -> list:
  38.     """执行SQL查询语句
  39.     参数:
  40.         query (str): 要执行的SQL语句,支持多条语句以分号分隔
  41.     返回:
  42.         list: 包含查询结果的TextContent列表
  43.         - 对于SELECT查询:返回CSV格式的结果,包含列名和数据
  44.         - 对于SHOW TABLES:返回数据库中的所有表名
  45.         - 对于其他查询:返回执行状态和影响行数
  46.         - 多条语句的结果以"---"分隔
  47.     异常:
  48.         Error: 当数据库连接或查询执行失败时抛出
  49.     """
  50.     config = get_db_config()
  51.     try:
  52.         with connect(**config) as conn:
  53.             with conn.cursor() as cursor:
  54.                 statements = [stmt.strip() for stmt in query.split(";") if stmt.strip()]
  55.                 results = []
  56.                 for statement in statements:
  57.                     try:
  58.                         cursor.execute(statement)
  59.                         # 检查语句是否返回了结果集 (SELECT, SHOW, EXPLAIN, etc.)
  60.                         if cursor.description:
  61.                             columns = [desc[0] for desc in cursor.description]
  62.                             rows = cursor.fetchall()
  63.                             # 将每一行的数据转换为字符串,特殊处理None值
  64.                             formatted_rows = []
  65.                             for row in rows:
  66.                                 formatted_row = [
  67.                                     "NULL" if value is None else str(value)
  68.                                     for value in row
  69.                                 ]
  70.                                 formatted_rows.append(",".join(formatted_row))
  71.                             # 将列名和数据合并为CSV格式
  72.                             results.append(
  73.                                 "\n".join([",".join(columns)] + formatted_rows)
  74.                             )
  75.                         # 如果语句没有返回结果集 (INSERT, UPDATE, DELETE, etc.)
  76.                         else:
  77.                             conn.commit()  # 只有在非查询语句时才提交
  78.                             results.append(f"查询执行成功。影响行数: {cursor.rowcount}")
  79.                     except Error as stmt_error:
  80.                         # 单条语句执行出错时,记录错误并继续执行
  81.                         results.append(
  82.                             f"执行语句 '{statement}' 出错: {str(stmt_error)}"
  83.                         )
  84.                         # 可以在这里选择是否继续执行后续语句,目前是继续
  85.                 return ["\n---\n".join(results)]
  86.     except Error as e:
  87.         print(f"执行SQL '{query}' 时出错: {e}")
  88.         return [f"执行查询时出错: {str(e)}"]
  89. @mcp.tool()
  90. def get_table_name(text: str) -> list:
  91.     """根据表的中文注释搜索数据库中的表名
  92.     参数:
  93.         text (str): 要搜索的表中文注释关键词
  94.     返回:
  95.         list: 包含查询结果的TextContent列表
  96.         - 返回匹配的表名、数据库名和表注释信息
  97.         - 结果以CSV格式返回,包含列名和数据
  98.     """
  99.     config = get_db_config()
  100.     sql = "SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT "
  101.     sql += f"FROM information_schema.TABLES WHERE TABLE_SCHEMA = '{config['database']}' AND TABLE_COMMENT LIKE '%{text}%';"
  102.     return execute_sql(sql)
  103. @mcp.tool()
  104. def get_table_desc(text: str) -> list:
  105.     """获取指定表的字段结构信息
  106.     参数:
  107.         text (str): 要查询的表名,多个表名以逗号分隔
  108.     返回:
  109.         list: 包含查询结果的列表
  110.         - 返回表的字段名、字段注释等信息
  111.         - 结果按表名和字段顺序排序
  112.         - 结果以CSV格式返回,包含列名和数据
  113.     """
  114.     config = get_db_config()
  115.     # 将输入的表名按逗号分割成列表
  116.     table_names = [name.strip() for name in text.split(",")]
  117.     # 构建IN条件
  118.     table_condition = "','".join(table_names)
  119.     sql = "SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT "
  120.     sql += (
  121.         f"FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '{config['database']}' "
  122.     )
  123.     sql += f"AND TABLE_NAME IN ('{table_condition}') ORDER BY TABLE_NAME, ORDINAL_POSITION;"
  124.     return execute_sql(sql)
  125. @mcp.tool()
  126. def get_lock_tables() -> list:
  127.     """
  128.     获取当前mysql服务器InnoDB 的行级锁
  129.     返回:
  130.         list: 包含查询结果的TextContent列表
  131.     """
  132.     sql = """SELECT
  133.     p2.`HOST` AS 被阻塞方host,
  134.     p2.`USER` AS 被阻塞方用户,
  135.     r.trx_id AS 被阻塞方事务id,
  136.     r.trx_mysql_thread_id AS 被阻塞方线程号,
  137.     TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS 等待时间,
  138.     r.trx_query AS 被阻塞的查询,
  139.     l.OBJECT_NAME AS 阻塞方锁住的表,
  140.     m.LOCK_MODE AS 被阻塞方的锁模式,
  141.     m.LOCK_TYPE AS '被阻塞方的锁类型(表锁还是行锁)',
  142.     m.INDEX_NAME AS 被阻塞方锁住的索引,
  143.     m.OBJECT_SCHEMA AS 被阻塞方锁对象的数据库名,
  144.     m.OBJECT_NAME AS 被阻塞方锁对象的表名,
  145.     m.LOCK_DATA AS 被阻塞方事务锁定记录的主键值,
  146.     p.`HOST` AS 阻塞方主机,
  147.     p.`USER` AS 阻塞方用户,
  148.     b.trx_id AS 阻塞方事务id,
  149.     b.trx_mysql_thread_id AS 阻塞方线程号,
  150.     b.trx_query AS 阻塞方查询,
  151.     l.LOCK_MODE AS 阻塞方的锁模式,
  152.     l.LOCK_TYPE AS '阻塞方的锁类型(表锁还是行锁)',
  153.     l.INDEX_NAME AS 阻塞方锁住的索引,
  154.     l.OBJECT_SCHEMA AS 阻塞方锁对象的数据库名,
  155.     l.OBJECT_NAME AS 阻塞方锁对象的表名,
  156.     l.LOCK_DATA AS 阻塞方事务锁定记录的主键值,
  157.     IF(p.COMMAND = 'Sleep', CONCAT(p.TIME, ' 秒'), 0) AS 阻塞方事务空闲的时间
  158.     FROM performance_schema.data_lock_waits w
  159.     INNER JOIN performance_schema.data_locks l ON w.BLOCKING_ENGINE_LOCK_ID = l.ENGINE_LOCK_ID
  160.     INNER JOIN performance_schema.data_locks m ON w.REQUESTING_ENGINE_LOCK_ID = m.ENGINE_LOCK_ID
  161.     INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.BLOCKING_ENGINE_TRANSACTION_ID
  162.     INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.REQUESTING_ENGINE_TRANSACTION_ID
  163.     INNER JOIN information_schema.PROCESSLIST p ON p.ID = b.trx_mysql_thread_id
  164.     INNER JOIN information_schema.PROCESSLIST p2 ON p2.ID = r.trx_mysql_thread_id
  165.     ORDER BY 等待时间 DESC;"""
  166.     return execute_sql(sql)
  167. if __name__ == "__main__":
  168.     mcp.run(transport="streamable-http", host="0.0.0.0", port=9000, path="/mcp")
复制代码
View CodeAgent配置

Agent 2详细配置如下:
10.png

 
11.png

 MCP服务配置
  1. {
  2.     "mysql8-mcp-server": {
  3.         "transport": "streamable_http",
  4.         "url": "http://mysql8-mcp-server-svc.mcp:9000/mcp/",
  5.         "timeout": 60
  6.     }
  7. }
复制代码
指令
12.gif
13.gif
  1. 使用中文回复。
  2. 当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:
  3. # 学生管理系统数据库表结构说明
  4. ## 1. 教师表 (teachers)
  5. | 字段名 | 类型 | 描述 | 约束 | 示例 |
  6. |--------|------|------|------|------|
  7. | id | varchar | 教师ID | 主键 | "T001" |
  8. | name | varchar | 教师姓名 | 必填 | "张建国" |
  9. | gender | enum | 性别 | "男"或"女" | "男" |
  10. | subject | varchar | 教授科目 | 必填 | "数学" |
  11. | title | varchar | 职称 | 必填 | "教授" |
  12. | phone | varchar | 联系电话 | 必填 | "13812345678" |
  13. | office | varchar | 办公室位置 | 必填 | "博学楼301" |
  14. | wechat | varchar | 微信(可选) | 可选 | "lily_teacher" |
  15. | isHeadTeacher | enum | 是否为班主任,"true"或"false" | 可选 | true |
  16. ## 2. 班级表 (classes)
  17. | 字段名 | 类型 | 描述 | 约束 | 示例 |
  18. |--------|------|------|------|------|
  19. | id | varchar | 班级ID | 主键 | "202301" |
  20. | className | varchar | 班级名称 | 必填 | "2023级计算机1班" |
  21. | grade | int | 年级 | 必填 | 2023 |
  22. | headTeacherId | varchar | 班主任ID | 外键(teachers.id) | "T003" |
  23. | classroom | varchar | 教室位置 | 必填 | "1号楼302" |
  24. | studentCount | int | 学生人数 | 必填 | 35 |
  25. | remark | varchar | 备注信息 | 可选 | "市级优秀班集体" |
  26. ## 3. 课程表 (courses)
  27. | 字段名 | 类型 | 描述 | 约束 | 示例 |
  28. |--------|------|------|------|------|
  29. | id | varchar | 课程ID | 主键 | "C001" |
  30. | courseName | varchar | 课程名称 | 必填 | "高等数学" |
  31. | credit | int | 学分 | 必填 | 4 |
  32. | teacherId | varchar | 授课教师ID | 外键(teachers.id) | "T001" |
  33. | semester | varchar | 学期 | 格式"YYYY-N" | "2023-1" |
  34. | type | enum | 课程类型 | "必修"或"选修" | "必修" |
  35. | prerequisite | varchar | 先修课程ID | 可选,外键(courses.id) | "C003" |
  36. ## 4. 学生表 (students)
  37. | 字段名 | 类型 | 描述 | 约束 | 示例 |
  38. |--------|------|------|------|------|
  39. | id | varchar | 学号 | 主键 | "S20230101" |
  40. | name | varchar | 学生姓名 | 必填 | "王强" |
  41. | gender | enum | 性别 | "男"或"女" | "男" |
  42. | birthDate | date | 出生日期 | 必填 | date("2005-01-15") |
  43. | enrollmentDate | date | 入学日期 | 必填 | date("2023-8-1") |
  44. | classId | varchar | 班级ID | 外键(classes.id) | "202301" |
  45. | phone | varchar | 联系电话 | 必填 | "13812345678" |
  46. | email | varchar | 电子邮箱 | 必填 | "20230101@school.edu.cn" |
  47. | emergencyContact | varchar | 紧急联系人电话 | 必填 | "13876543210" |
  48. | address | varchar | 家庭住址 | 必填 | "北京市海淀区中关村大街1栋101室" |
  49. | height | int | 身高(cm) | 必填 | 175 |
  50. | weight | int | 体重(kg) | 必填 | 65 |
  51. | healthStatus | enum | 健康状况 | 必填,"良好"或"一般‌"或"较差" | "良好" |
  52. ## 5. 成绩表 (scores)
  53. | 字段名 | 类型 | 描述 | 约束 | 示例 |
  54. |--------|------|------|------|------|
  55. | id | varchar | 成绩记录ID | 主键 | "S20230101C001" |
  56. | studentId | varchar | 学生ID | 外键(students.id) | "S20230101" |
  57. | courseId | varchar | 课程ID | 外键(courses.id) | "C001" |
  58. | score | int | 综合成绩 | 0-100 | 85 |
  59. | examDate | date | 考试日期 | 必填 | date("2024-5-20") |
  60. | usualScore | int | 平时成绩 | 0-100 | 90 |
  61. | finalScore | int | 期末成绩 | 0-100 | 80 |
  62. ### 补考成绩记录说明
  63. 补考记录在_id后添加"_M"后缀,如"S20230101C001_M"
  64. ## 表关系说明
  65. 1. **一对多关系**:
  66.    - 一个班级(classes)对应多个学生(students)
  67.    - 一个教师(teachers)可以教授多门课程(courses)
  68.    - 一个学生(students)有多条成绩记录(scores)
  69. 2. **外键约束**:
  70.    - students.classId → classes.id
  71.    - courses.teacherId → teachers.id
  72.    - scores.studentId → students.id
  73.    - scores.courseId → courses.id
  74.    - classes.headTeacherId → teachers.id
复制代码
View Code 
六、desensitization-mcp-server设置

核心代码

desensitization-mcp-server核心代码如下:
server.py
14.gif
15.gif
  1. from fastmcp import FastMCP
  2. import re
  3. mcp = FastMCP("desensitize-text")
  4. class DataMasker:
  5.     def __init__(self):
  6.         pass
  7.     def mask_phone_number(self, phone_number):
  8.         """
  9.         对手机号码进行脱敏处理,将中间四位替换为 *
  10.         """
  11.         if len(phone_number) == 11:
  12.             return phone_number[:3] + "****" + phone_number[7:]
  13.         return phone_number
  14.     def mask_email(self, email):
  15.         """
  16.         对邮箱地址进行脱敏处理,只显示邮箱名前两位和域名
  17.         """
  18.         if "@" in email:
  19.             username, domain = email.split("@")
  20.             return username[:2] + "****@" + domain
  21.         return email
  22.     def mask_id_card(self, id_card):
  23.         """
  24.         对身份证号码进行脱敏处理,只显示前四位和后四位
  25.         """
  26.         if len(id_card) == 18:
  27.             return id_card[:4] + "**********" + id_card[14:]
  28.         return id_card
  29.     def mask_address(self, address):
  30.         """
  31.         对地址进行脱敏处理,模糊化门牌号和房间号
  32.         例如,将 "1栋" 替换为 "**栋","101室" 替换为 "***室"
  33.         """
  34.         # 使用正则表达式
  35.         desensitized_address = re.sub(r"(\d+)栋", r"**栋", address)
  36.         desensitized_address = re.sub(r"(\d+)室", r"***室", desensitized_address)
  37.         return desensitized_address
  38. @mcp.tool()
  39. def desensitize_text(text: str) -> str:
  40.     """
  41.     脱敏文本信息
  42.     """
  43.     masker = DataMasker()
  44.     # 匹配手机号
  45.     phone_pattern = r"\d{11}"
  46.     phones = re.findall(phone_pattern, text)
  47.     for phone in phones:
  48.         masked_phone = masker.mask_phone_number(phone)
  49.         text = text.replace(phone, masked_phone)
  50.     # 匹配邮箱
  51.     email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
  52.     emails = re.findall(email_pattern, text)
  53.     for email in emails:
  54.         masked_email = masker.mask_email(email)
  55.         text = text.replace(email, masked_email)
  56.     # 匹配身份证号
  57.     id_card_pattern = r"\d{18}"
  58.     id_cards = re.findall(id_card_pattern, text)
  59.     for id_card in id_cards:
  60.         masked_id_card = masker.mask_id_card(id_card)
  61.         text = text.replace(id_card, masked_id_card)
  62.     # 匹配地址
  63.     address_pattern = r"([\u4e00-\u9fa5]+省)?([\u4e00-\u9fa5]+市)?([\u4e00-\u9fa5]+区)?([\u4e00-\u9fa5]+街道)?(\d+[\u4e00-\u9fa5]+)?(\d+[\u4e00-\u9fa5]+)?"
  64.     addresss = re.findall(address_pattern, text)
  65.     # 如果没有找到地址,返回原始文本
  66.     if not addresss:
  67.         return text
  68.     # 对每个匹配的地址进行脱敏处理
  69.     for address_parts in addresss:
  70.         # 将匹配的地址部分组合成完整的地址
  71.         address = "".join([part for part in address_parts if part])
  72.         if address:
  73.             # print("address",address)
  74.             masked_address = masker.mask_address(address)
  75.             text = text.replace(address, masked_address)
  76.     return text
  77. if __name__ == "__main__":
  78.     mcp.run(transport="streamable-http", host="0.0.0.0", port=9000, path="/mcp")
复制代码
View CodeAgent配置

Agent 4详细配置如下:
16.png

注意:查询要选择变量Agent 2 text
 
 MCP服务配置
  1. {
  2.   "desensitization-mcp-server": {
  3.         "transport": "streamable_http",
  4.         "url": "http://desensitization-mcp-server-svc.mcp:9000/mcp/",
  5.         "headers": {},
  6.         "timeout": 60
  7.     }
  8. }
复制代码
指令
  1. 使用MCP工具,对文本进行脱敏处理
复制代码
 
最后直接回复,注意选择变量Agent4 text
17.png

 
七、searxng-mcp-server设置

核心代码

searxng-mcp-server核心代码如下:
server.py
18.gif
19.gif
  1. from fastmcp import FastMCP
  2. import requests
  3. import os
  4. mcp = FastMCP("searxng")
  5. @mcp.tool()
  6. def search(query: str) -> str:
  7.     """
  8.     搜索关键字,调用searxng的API接口
  9.     参数:
  10.         query (str): 要搜索的关键词
  11.     返回:
  12.         str: 查询结果
  13.     """
  14.     api_server = os.getenv("API_SERVER", None)
  15.     if not api_server:
  16.         print("缺少必需的API_SERVER配置")
  17.         raise ValueError("缺少必需的API_SERVER配置")
  18.     # API URL
  19.     url = "%s/search?q=%s&format=json" % (api_server, query)
  20.     print(url)
  21.     try:
  22.         # 发送GET请求
  23.         response = requests.get(url)
  24.         # 检查请求是否成功
  25.         if response.status_code == 200:
  26.             # 将响应内容解析为JSON
  27.             data = response.json()
  28.             # print("JSON内容:")
  29.             # print(data,type(data))
  30.             result_list = []
  31.             for i in data["results"]:
  32.                 # print(i["content"])
  33.                 result_list.append(i["content"])
  34.             content = "\n".join(result_list)
  35.             # print(content)
  36.             return content
  37.         else:
  38.             print(f"请求失败,状态码: {response.status_code}")
  39.             return False
  40.     except requests.exceptions.RequestException as e:
  41.         print(f"请求过程中发生错误: {e}")
  42.         return False
  43. if __name__ == "__main__":
  44.     mcp.run(transport="streamable-http", host="0.0.0.0", port=9000, path="/mcp")
复制代码
View CodeAgent配置

Agent 3详细配置如下:
20.png

 MCP服务配置
  1. {
  2.   "searxng-mcp-server": {
  3.         "transport": "streamable_http",
  4.         "url": "http://searxng-mcp-server-svc.mcp:9000/mcp/",
  5.         "headers": {},
  6.         "timeout": 60
  7.     }
  8. }
复制代码
指令
  1. ## 技能
  2. ### 技能1:使用MCP工具进行联网搜索,获取到的相关内容进行总结分析
  3. ## 限制
  4. - 如果没有相关内容,再进行联网搜索
  5. - 你的回答应严格针对分析任务。使用结构化语言,逐步思考
  6. - 使用的语言应和用户提问的语言相同
  7. - 搜索的关键词必须和用户提问的内容一致
复制代码
 
最后直接回复,注意选择变量Agent3 text
21.png

八、dify测试

点击右上角的预览按钮
22.png

公网ip多少

23.png

注意:这里可以看到绿色的连接线条,可以清晰的看到工作流的走向,它确实是按照我预期的方向在走。
 
李华的老师,查询一下个人详细信息

24.png

可以看到通过问题分类器,分别走向AGENT 2,AGENT 4,最终得到的答案,是进行了脱敏处理。
上海今天天气如何

25.png

这里直接联网搜索答案了
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册