作者:ShenLiang2025
Dify调用外部MCP服务
安装UV
- powershell -ExecutionPolicy ByPass -c "$env:UV_INSTALL_DIR = 'D:\Program\Work\uv';irm https://astral.sh/uv/install.ps1 | iex"
复制代码 设置环境变量
- setx UV_HOME "D:\Program\Work\uv" # 替换为安装时选择的目录
- setx UV_CACHE_DIR "%UV_HOME%\cache"
- setx UV_CONFIG_FILE "%UV_HOME%\uv.toml"
- setx UV_INSTALL_DIR "%UV_HOME%\bin"
- setx UV_PYTHON_BIN_DIR "%UV_HOME%\bin"
- setx UV_PYTHON_CACHE_DIR "%UV_HOME%\cache"
- setx UV_PYTHON_INSTALL_DIR "%UV_HOME%\python"
- setx UV_TOOL_BIN_DIR "%UV_HOME%\bin"
- setx UV_TOOL_DIR "%UV_HOME%\tools"
复制代码 更改源
- 打开目录D:\Program\Work\uv
- 新建uv.toml,设置如下内容:
- [[index]]
- name = "tsinghua" # 清华源
- url = "https://pypi.tuna.tsinghua.edu.cn/simple"
- default = true
- [[index]]
- name = "aliyun" # 阿里云源
- url = "https://mirrors.aliyun.com/pypi/simple"
复制代码 创建项目
- uv init pythonprac# 项目初始化
- uv python install 3.13 # 安装指定版本
- uv python pin 3.13 # 固定python版本
复制代码 创建虚拟环境
- uv venv # 创建虚拟环境,默认生成.venv虚拟环境
复制代码 切换虚拟环境
安装fastmcp
编写MCP服务
- 编写MCP服务python代码,该文件名为server.py。该服务的主要功能为统计knowledge库所有md文件数量、查看knowledge库内所有md文件的内容、按照文件名及内容生成md文件。
- import os
- import glob
- from mcp.server.fastmcp import FastMCP
- mcp = FastMCP("mcp_server_1", "mcp server example",port=8095)
- # 从环境变量中获取 Obsidian 根目录路径,默认为当前目录
- KNOWLEDGE_ROOT = os.environ.get("_PATH", ".")
- @mcp.tool()
- def count_markdown_files():
- """获取 knowledge库中所有 Markdown 文件的数量"""
- md_files = glob.glob(os.path.join(KNOWLEDGE_ROOT, "**/*.md"), recursive=True)
- return len(md_files)
- @mcp.tool()
- def get_all_markdown_contents():
- """获取 knowledge库中所有 Markdown 文件的内容"""
- md_files = glob.glob(os.path.join(KNOWLEDGE_ROOT, "**/*.md"), recursive=True)
- result = []
- for file_path in md_files:
- try:
- with open(file_path, 'r', encoding='utf-8') as f:
- content = f.read()
- # 获取相对路径作为文件标识符
- relative_path = os.path.relpath(file_path, KNOWLEDGE_ROOT)
- result.append({
- "file": relative_path,
- "content": content
- })
- except Exception as e:
- result.append({
- "file": os.path.relpath(file_path, KNOWLEDGE_ROOT),
- "error": str(e)
- })
- return result
- @mcp.tool()
- def create_markdown_file(filename, content=""):
- """在 knowledge库中创建一个新的 Markdown 文件
- Args:
- filename: Markdown 文件名 (不需要 .md 后缀,会自动添加)
- content: 文件的初始内容 (可选)
- """
- # 确保有 .md 后缀
- if not filename.endswith('.md'):
- filename += '.md'
- # 创建完整路径
- file_path = os.path.join(KNOWLEDGE_ROOT, filename)
- # 检查文件是否已存在
- if os.path.exists(file_path):
- return {"success": False, "error": f"文件 {filename} 已存在"}
- try:
- # 确保目录存在
- os.makedirs(os.path.dirname(file_path), exist_ok=True)
- # 创建文件
- with open(file_path, 'w', encoding='utf-8') as f:
- f.write(content)
- return {"success": True, "path": os.path.relpath(file_path, KNOWLEDGE_ROOT)}
- except Exception as e:
- return {"success": False, "error": str(e)}
- if __name__ == "__main__":
- print(f"knowledge MCP 服务已启动,使用路径: {KNOWLEDGE_ROOT}")
- mcp.run(transport="sse")
复制代码 运行MCP服务
安装MCP插件
在dify的插件市场找到 Agent策略(支持MCP工具)插件并安装。
编写Dify聊天工作流
- 新建聊天应用。
- 拖动开始,拖动Agent策略插件。
- 配置相关内容:
- 1、模型选择在 模型列表里的预先配置的,当前是 qwen3:8B
- 2、MCP服务配置见下:
- {
- "mcp_server_1": {
- "url": "http://host.docker.internal:8095/sse", #当前Dify是本地宿主机内。
- "headers": {},
- "timeout": 60,
- "sse_read_timeout": 300
- }
- }
- 3、指令:
- 你是一个工具助手,支持通过 MCP 协议获取可用工具,并执行工具调用。根据用户的问题,选择合适的工具调用,请根据用户的问题和工具执行的结果回复用户。
- 4、查询:
- 用户查询语句。
复制代码 效果验证
1、现在knowledge库里Markdown文件有多少?
2、在knowledge库中创建一个新的Markdown文件,内容是:你好,md文件管理库,20250909。
3、显示knowledge库中所有Markdown文件的内容。
Dify调用自身MCP服务
安装Agent策略支持
安装支持Angent策略支持MCP工具插件。
发布MCP服务
在Dify主页工具栏,点击“添加MCP服务(HTTP)”
定义Agent策略
配置MCP服务信息,详见图中json。指定指令和查询相关信息。
注:其中Dify发布为MCP服务的地址,可从左上角应用设置里找到。
完整工作流
原文地址:https://blog.csdn.net/shenliang1985/article/details/156829362 |