AI创想

标题: Dify 工作流中 MCP 插件的高效集成与应用 [打印本页]

作者: l吾王张起灵l    时间: 2 小时前
标题: Dify 工作流中 MCP 插件的高效集成与应用
作者:CSDN博客
1. 为什么说 MCP 是 Dify 工作流的“超能力”插件?

如果你用过 Dify 一段时间,可能会发现它的工作流虽然强大,但有时候总觉得缺了点什么。比如,你想让 AI 帮你查一下公司内部数据库的订单状态,或者调用一个只有你们团队才懂的内部 API 来处理数据,又或者控制一下办公室的智能设备。这些“个性化”的需求,用 Dify 自带的工具或者简单的 HTTP 请求节点,要么实现起来很麻烦,要么根本做不到。
这就是 MCP 插件登场的时候了。你可以把它理解成给 Dify 工作流安装的“外挂”或者“扩展坞”。MCP,全称 Model Context Protocol,最初是由 Anthropic 提出的一套标准协议。它的核心目标很简单:让大语言模型(LLM)能够安全、规范地去调用外部世界的能力,无论是你写的一段 Python 代码,还是一个远程的 HTTP 服务。
在 Dify 的最新版本里,官方已经原生集成了对 MCP 协议的支持。这意味着什么?意味着你不再需要写复杂的中间层代码去“桥接” Dify 和你的内部服务。你只需要按照 MCP 的规矩,把你的业务逻辑包装成一个标准的 MCP 服务(我们称之为 MCP Server),然后在 Dify 后台像添加一个普通插件一样,填上地址,点一下保存。接下来,你就可以在工作流的画布里,像拖拽一个“发送邮件”节点一样,轻松拖拽使用你自己的业务工具了。
这种集成方式带来的优势是巨大的。首先是标准化,无论你的后端是 Python、Go 还是 Node.js,只要遵循 MCP 协议,Dify 都能认。其次是安全性,MCP 协议本身设计了权限和上下文隔离机制,比你直接暴露一个 API 接口要安全得多。最后也是最重要的,是可扩展性。你的业务能力从此和 Dify 的 AI 能力无缝融合了。AI 负责理解和决策,你的 MCP 插件负责执行具体的动作,两者通过工作流可视化编排,一个高度定制化的智能自动化流程就诞生了。
2. 手把手开发你的第一个 MCP 插件

理论说得再多,不如动手写一行代码。开发 MCP 插件,目前最省事的方法就是使用官方推荐的 fastmcp 库。听名字就知道,它主打一个“快”。咱们不用管底层复杂的协议细节,fastmcp 都帮我们封装好了。
首先,你得准备好 Python 环境。我建议用 Python 3.8 或以上版本,创建一个干净的虚拟环境,避免包冲突。然后,安装核心依赖:
  1. pip install fastmcp
复制代码
就这么简单,主要的库就这一个。接下来,我们创建一个名为 my_first_mcp_server.py 的文件。我要写一个既简单又有点实用价值的插件:一个天气查询工具和一个待办事项管理工具。当然,天气数据我们先模拟,重点是展示如何构建工具。
  1. from mcp.server.fastmcp import FastMCP
  2. from typing import List, Dict
  3. import json
  4. # 初始化一个 MCP 服务器实例,给它起个名字叫 "PersonalAssistant"
  5. # host 设为 "0.0.0.0" 意味着接受来自任何网络接口的连接,方便后续 Dify 访问
  6. # port 可以自定义,比如 8000
  7. # stateless_http=True 是官方推荐的设置,兼容性更好
  8. mcp = FastMCP("PersonalAssistant", host="0.0.0.0", port=8000, stateless_http=True)
  9. # 模拟一个天气数据库
  10. weather_db = {
  11.     "北京": {"temperature": "22°C", "condition": "晴朗", "humidity": "40%"},
  12.     "上海": {"temperature": "25°C", "condition": "多云", "humidity": "65%"},
  13.     "深圳": {"temperature": "28°C", "condition": "阵雨", "humidity": "80%"},
  14. }
  15. # 工具一:查询天气
  16. @mcp.tool()
  17. def get_weather(city: str) -> str:
  18.     """
  19.     根据城市名称查询模拟的天气信息。
  20.     Args:
  21.         city (str): 要查询天气的城市名,例如“北京”、“上海”。
  22.     Returns:
  23.         str: 返回该城市的天气情况描述字符串。
  24.     """
  25.     if city in weather_db:
  26.         info = weather_db[city]
  27.         return f"{city}的天气:温度{info['temperature']},{info['condition']},湿度{info['humidity']}。"
  28.     else:
  29.         return f"抱歉,未找到{city}的天气信息。目前支持查询:{', '.join(weather_db.keys())}"
  30. # 工具二:管理简易待办列表(为了演示,我们用一个内存列表,实际应用请连接数据库)
  31. todo_list = []
  32. @mcp.tool()
  33. def add_todo_item(task: str) -> str:
  34.     """
  35.     向待办列表中添加一个新项目。
  36.     Args:
  37.         task (str): 待办事项的描述。
  38.     Returns:
  39.         str: 操作确认信息。
  40.     """
  41.     todo_list.append({"task": task, "done": False})
  42.     return f'已添加待办事项:“{task}”。当前共有 {len(todo_list)} 项待办。'
  43. @mcp.tool()
  44. def list_todo_items() -> List[Dict]:
  45.     """
  46.     列出当前所有的待办事项。
  47.     Returns:
  48.         List[Di
复制代码
原文地址:https://blog.csdn.net/a1b2c/article/details/155326616




欢迎光临 AI创想 (http://llms-ai.com/) Powered by Discuz! X3.4