Dify接入MCP服务实战

木偶AI正在绞尽脑汁想思路ING···
木偶のAI摘要
DeepSeek-Chat

一、MCP

1. 什么是MCP?

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年底推出的一种开放协议,被誉为 AI 领域的“USB 接口”。

它标准化了人工智能模型(LLM)与外部数据源、工具、开发环境(如本地文件、数据库、GitHub)的连接方式,旨在解决碎片化集成痛点,让 AI Agent 能像人类一样通过“手脚”访问和操作数据。

核心概览:

  • 定义: 一种开放通信协议,旨在统一 AI 大模型与外部环境的对接标准。
  • 类比:
    • USB接口: 一种通用的“插口”,让 LLM 轻松连接不同的软件和数据源。
    • AI 的手脚: 将 LLM 仅作为“说话的机器”提升为可以操作外界的 Agent。
  • 应用场景:
    • 读取私有数据: 安全访问个人或企业的本地文档、数据库。
    • 工具调用: 执行编写代码、预订航班、更新 CRM 等具体动作。
    • 上下文增强: 使模型获得最新的实时数据或深入的背景信息。
  • 优势: 相比碎片化的集成,MCP 更安全(数据可保留在本地)、标准统一、减少适配成本。

MCP 的关键优势在于它提供了一种安全且标准化的一对多解决方案,连接起 Claude、GPT 等大模型与数百个外部服务

2. MCP底层原理

1
2
3
4
5
6
7
8
9
用户提问 → agent节点

LLM 分析意图(ReAct 推理)

判断是否需要调用工具 → 是 → 调用 MCP 工具 → 返回结果
↓ 否
直接回答用户

再次推理 → 判断是否需要更多工具 → 循环直到完成回答

ReAct = Reasoning + Acting(推理 + 行动),是 LLM 在面对复杂任务时的一种思维模式,能够在回答过程中不断分析和执行工具调用。

3. 案例

1. 安装 mcp 库

1
pip install mcp[cli]

2. 实例化一个mcp服务

mcp = FastMCP(host=”172.24.112.1”, port=8001, name=”天气查询服务”)

3. 添加装饰器,将某个函数变成MCP工具

函数中的描述非常重要, 大模型会根据 描述 查找MCP工具

1
2
3
4
5
@mcp.tool(name="weather_server")
def query_weather(city: str) -> str:
"""获取指定地点的天气信息。参数为地点名称,例如:北京、上海"""
# 这里可以调用第三方天气API获取天气信息
return f"{city}的天气是晴朗,温度25度。"

4. 以 SSE 格式启动MCP服务

1
mcp.run(transport="sse")

5. 在 Dify 中接入 MCP 服务

安装 MCP SSE / StreamableHTTP 工具, 配置 MCP 服务地址, 即可在 Dify 中调用 MCP 工具

  • URL 为我们开发的 天气查询 MCP 工具
  • 如果有多个 MCP 工具, 可以在 Dify 中添加多个 MCP 工具, 每个工具配置不同的 URL
1
2
3
4
5
6
7
8
9
{
"weather_server": {
"transport": "sse",
"url": "http://192.168.1.4:8001/sse",
"headers": {},
"timeout": 150,
"sse_read_timeout": 150
}
}

6. 服务源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import httpx
from loguru import logger
from mcp.server.fastmcp import FastMCP

QWEATHER_KEY = "07a3e395dxxxxxxxxxxxxxx8f1568656"

_BASE_GEO = "https://geoapi.qweather.com/v2/city/lookup"
_BASE_NOW = "https://devapi.qweather.com/v7/weather/now"

mcp = FastMCP(host="192.168.1.4", port=8001, name="天气查询服务")


def _http_get(url: str, params: dict) -> dict | None:
try:
response = httpx.get(url, params=params, timeout=10)
response.raise_for_status()
return response.json()
except httpx.TimeoutException:
logger.error(f"请求超时:{url}")
except httpx.HTTPStatusError as e:
logger.error(f"HTTP 错误 {e.response.status_code}{url}")
except httpx.RequestError as e:
logger.error(f"网络异常:{e}")
except Exception as e:
logger.error(f"响应解析失败:{e}")
return None


@mcp.tool(name="weather_server")
def get_weather(location: str) -> str:
"""获取指定地点的天气信息。参数为地点名称,例如:北京、上海"""
location = location.strip()
if not location:
return "地点不能为空"

logger.info(f"查询天气:{location}")

# 第一步:地点名称转换为 location_id
geo_data = _http_get(_BASE_GEO, {"location": location, "key": QWEATHER_KEY})
if geo_data is None:
return "请求失败,请稍后重试"
if geo_data.get("code") != "200" or not geo_data.get("location"):
logger.warning(f"未找到地点:{location},code={geo_data.get('code')}")
return "没找到该位置的信息"

loc = geo_data["location"][0]
location_id = loc["id"]
location_name = loc["name"]
logger.debug(f"匹配到地点:{location_name},id={location_id}")

# 第二步:根据 location_id 获取实时天气
weather_data = _http_get(_BASE_NOW, {"location": location_id, "key": QWEATHER_KEY})
if weather_data is None:
return "请求失败,请稍后重试"
if weather_data.get("code") != "200":
logger.warning(f"天气接口错误码:{weather_data.get('code')}")
return "天气服务返回数据异常"

now = weather_data["now"]
logger.info(f"成功获取 {location_name} 天气数据")
return (
f"{location_name} 当前天气:{now['text']},"
f"气温 {now['temp']}°C,体感 {now['feelsLike']}°C,"
f"湿度 {now['humidity']}%,风向 {now['windDir']} {now['windScale']} 级,"
f"能见度 {now['vis']} km"
)


if __name__ == "__main__":
mcp.run(transport="sse")

二、 MCP 与 SKILL 的区别

MCP(Model Context Protocol)与 Skill 的核心区别在于 定位与职责。

  • MCP 是 AI 的“手”,负责连接外部世界;
  • Skill 是 AI 的“技能书”,告诉 AI 怎么处理业务
  • 两者在 AI Agent 架构中是互补的,MCP 提供“触达”能力,Skill 提供“理解和执行”能力。

1. 本质定位

  • MCP (模型上下文协议): 是一种通信协议和标准。它解决的是“如何连接”的问题,让 AI 能以统一的方式触达数据库、本地文件或远程 API。
  • Skill (技能): 是一种高级 Prompt 或业务逻辑封装。它解决的是“如何思考/执行”的问题,是教模型在特定场景下按什么步骤去完成任务。

2. 核心差异对比

维度 MCP (模型上下文协议) Skill (智能体技能)
主要功能 连接外部工具与数据:提供访问权限、标准化接口 封装业务流程:教模型逻辑思维和任务拆解
存在形式 通常需要运行一个 MCP 服务器进程 通常是 Prompt 集合或代码文件 的打包
比喻 AI 的“感官”和“手”,让它能看见并操作外部数据 AI 的“大脑认知”和“工作手册”,提升专业性
部署难度 较高,涉及服务器、安全策略和协议对接 较低,通常通过文件分发或配置导入即可使用

3. 二者的协同关系

在实际应用中,MCP 和 Skill 通常是 互补关系 而非替代关系 :

  • Skill 调用 MCP:一个处理财务报表的 Skill(技能),会调用 MCP 协议去读取你的本地 Excel 文件(连接)。
  • 分工合作:MCP 负责“触达”数据,Skill 负责“理解”数据并输出结果 。