AI AinoCode AI 工具与基础设施
AI教程 8 分钟

MCP 协议落地半年后,Dify vs LangChain vs LlamaIndex 谁的工具生态最完整?

MCP 已成为 Agent 工具调用的事实标准。本文深度对比 Dify、LangChain、LlamaIndex 三大平台对 MCP 协议的支持程度、预置工具数量、自定义工具开发门槛,以数据库加外部 API 加文件处理完整场景实测。

KazK

MCP 协议三大平台工具生态对比

MCP(Model Context Protocol)从 Anthropic 提出到成为 Agent 工具调用的事实标准,只用了不到一年。

GitHub 上标了 mcp 标签的仓库已经超过 8000 个。Claude Desktop、Cursor、Windsurf、Hermes Agent、OpenClaw——几乎所有主流 AI 工具都原生支持 MCP。

但问题来了:当你要在企业级平台上构建 MCP 驱动的 Agent 时,Dify、LangChain、LlamaIndex 这三条路线,哪条走得更远?

这不是”谁更好”的问题,而是”你的团队更适合哪种开发范式”的问题。

本文从四个维度做深度对比,并在”对接数据库 + 调用外部 API + 文件处理”的完整场景下实测,最后给出一份选型决策指南。


一、三条路线的设计哲学差异

Dify:低代码优先,“拖拽即 MCP”

Dify 的策略是把 MCP Server 封装成可视化组件。用户不需要写代码,在界面上添加一个 MCP 节点,配置连接参数,就能用。

这意味着:

  • ✅ 非技术人员也能搭建 MCP 驱动的 Agent
  • ❌ 复杂的自定义工具开发受限
  • ❌ 版本控制和 CI/CD 流程不友好(配置存在数据库里)

LangChain:代码优先,“一切皆 Python”

LangChain 的策略是用代码定义一切。MCP 工具通过 Python SDK 集成,开发者写代码定义工具、组装链条、部署服务。

这意味着:

  • ✅ 灵活性极高,任何逻辑都能实现
  • ✅ 版本控制、单元测试、CI/CD 天然支持
  • ❌ 学习曲线陡峭,非开发者无法使用
  • ❌ 同样的功能比 Dify 需要写 3-5 倍的代码

LlamaIndex:RAG 专精,“知识优先”

LlamaIndex 的策略是以知识检索为核心,MCP 作为补充工具。它的强项是向量检索、文档处理、知识图谱,MCP 工具是 RAG pipeline 的扩展点。

这意味着:

  • ✅ RAG 场景下的工具编排最强
  • ✅ 知识检索 + 工具调用的混合 pipeline 最成熟
  • ❌ 纯工具调用场景(不涉及检索)不是它的强项
  • ❌ 文档处理外的 MCP 集成深度不如 LangChain

二、MCP 协议支持度对比

2.1 MCP Server 集成方式

维度DifyLangChainLlamaIndex
MCP Server 发现手动输入 endpoint代码注册 (MCPClientTool.from_server())代码注册 (MCPToolSpec)
多 Server 管理可视化列表工具注册表工具包(ToolBundle)
自动工具描述✅ 自动读取 MCP tool schema✅ 自动解析 JSON Schema✅ 自动解析
流式工具调用❌ 不支持✅ 支持(streaming tool call)❌ 不支持
MCP Resource 支持✅ 部分支持
MCP Prompt 支持

2.2 内置/预置工具数量

这是最直观的指标——开箱即用,不需要自己写 MCP Server,平台自带多少可用工具?

类别DifyLangChainLlamaIndex
搜索类(Google/Bing/维基百科)✅ 3 个✅ 5 个✅ 2 个
数据库类(PostgreSQL/MySQL/MongoDB)✅ 3 个✅ 4 个✅ 1 个
文件处理(PDF/Word/Excel 解析)✅ 4 个✅ 3 个✅ 6 个(核心优势)
Web 操作(浏览器自动化)✅ 2 个✅ 3 个
代码执行✅ 1 个(Python 沙箱)✅ 2 个
API 调用(通用 HTTP)✅ 1 个✅ 2 个(含 OpenAPI Schema 解析)✅ 1 个
知识库/RAG✅ 2 个✅ 3 个✅ 8 个(核心优势)
自定义 MCP Server 接入✅ 支持✅ 支持✅ 支持
总计~16~22~18

注意:这里的”预置工具”指的是平台内置、无需额外编码即可使用的工具。LangChain 的数量最多,部分原因是它的社区贡献工具生态最活跃(LangChain Hub 有 2000+ 社区工具模板)。

2.3 自定义 MCP 工具开发门槛

Dify

# 在 Dify 中添加自定义 MCP 工具
# 1. 在"工具"页面点击"添加 MCP Server"
# 2. 填写 Server URL: http://localhost:8080/mcp
# 3. 点击"发现工具"→ 自动读取工具列表
# 4. 在 Agent 工作流中拖拽使用
  • 开发一个 MCP Server 需要写 Python 代码(这是不可避免的)
  • 但在 Dify 中使用它只需要 4 步 GUI 操作
  • 开发门槛:中(需要写 MCP Server),使用门槛:极低

LangChain

from langchain_mcp import MCPClientTool
from langchain.agents import create_tool_calling_agent

# 连接 MCP Server 并注册工具
tools = MCPClientTool.from_server(
    url="http://localhost:8080/mcp",
    transport="stdio"  # 或 "http"
)

# 在 Agent 中使用
agent = create_tool_calling_agent(llm, tools, prompt)
  • 开发和使用都需要写代码
  • 但代码量不大,集成度高
  • 开发门槛:中,使用门槛:中

LlamaIndex

from llama_index.tools.mcp import BasicMCPClient

# 创建 MCP 客户端
client = BasicMCPClient(command="python", args=["my_mcp_server.py"])

# 转换为 LlamaIndex 工具
from llama_index.core.tools import FunctionTool
mcp_tools = client.to_tool_list()

# 集成到 Agent
from llama_index.agent.openai import OpenAIAgent
agent = OpenAIAgent.from_tools(mcp_tools, llm=llm)
  • 开发和使用都需要写代码
  • 代码量和 LangChain 类似
  • 开发门槛:中,使用门槛:中

三、完整场景实测:数据库 + 外部 API + 文件处理

3.1 测试场景

搭建一个”数据分析师 Agent”,需要:

  1. 连接 PostgreSQL 查询销售数据
  2. 调用天气 API 获取门店所在城市的天气信息
  3. 读取本地 CSV 文件做数据合并
  4. 生成分析报告并保存为 PDF

这是一个典型的”跨数据源整合”场景,需要同时用到数据库、外部 API 和文件处理。

3.2 Dify 实现

搭建时间:约 25 分钟

步骤:

  1. 创建 Agent 应用 → 选择”Assistant”类型
  2. 添加工具节点:PostgreSQL(内置)→ 配置连接信息
  3. 添加工具节点:HTTP Request(内置)→ 配置天气 API endpoint
  4. 添加工具节点:File Reader(内置)→ 指定 CSV 路径
  5. 添加 MCP Server:pdf-generator(自定义 MCP Server)→ 填入 endpoint
  6. 在对话流中编排:查询数据库 → 调用 API → 读取文件 → 合并分析 → 生成 PDF
  7. 发布

优点:全程无需写代码,GUI 可视化编排。工具调用流程一目了然。

缺点

  • 数据处理逻辑(合并数据库结果 + API 结果 + CSV 数据)无法在 Dify 中用可视化方式实现,需要通过”代码节点”写 Python。但 Dify 的代码节点功能有限——不能 pip install,只能用预装库
  • PDF 生成的 MCP Server 需要自己部署,Dify 只负责连接
  • 无法做复杂的错误处理(如数据库连接失败时的重试逻辑)

实测结果:基本流程跑通,但数据合并环节需要写 40 行 Python 代码在 Dify 的”代码执行”节点中。整体可用,但灵活性受限。

3.3 LangChain 实现

搭建时间:约 45 分钟

# 1. 定义工具
from langchain_community.tools import SQLDatabaseTool
from langchain_mcp import MCPClientTool
from langchain_core.tools import tool

db_tool = SQLDatabaseTool.from_uri("postgresql://user:pass@localhost/sales")
weather_tool = MCPClientTool.from_server(
    url="http://localhost:8081/weather-mcp",
    transport="http"
)
csv_tool = tool("read_csv")(lambda path: pd.read_csv(path).to_dict())

# 2. 定义数据处理逻辑
@tool
def merge_and_analyze(db_result: dict, weather: dict, csv_data: list) -> str:
    """合并多源数据并生成分析结论"""
    df_db = pd.DataFrame(db_result)
    df_csv = pd.DataFrame(csv_data)
    merged = pd.merge(df_db, df_csv, on="store_id", how="left")
    # 加入天气数据做相关性分析
    merged["weather"] = merged["city"].map(weather)
    correlation = merged["sales"].corr(merged["temperature"])
    return f"销售额与温度相关系数: {correlation:.3f}"

# 3. 创建 Agent
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [db_tool, weather_tool, csv_tool, merge_and_analyze]
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 4. 添加错误处理和重试
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2))
def execute_with_retry(query):
    return executor.invoke({"input": query})

优点

  • 完全可控——数据处理逻辑、错误处理、重试机制都能用标准 Python 实现
  • 可以 pip install 任何库,不受预装库限制
  • 可以写单元测试

缺点

  • 代码量是 Dify 的 5 倍以上
  • 需要自己管理部署(FastAPI + Gunicorn 或类似方案)
  • 非开发者无法参与搭建

实测结果:功能完整,错误处理到位。但开发时间和代码量明显高于 Dify。

3.4 LlamaIndex 实现

搭建时间:约 50 分钟

# 1. 设置数据源
from llama_index.core import VectorStoreIndex, Document
from llama_index.readers.database import DatabaseReader
from llama_index.tools.mcp import BasicMCPClient

# 数据库
db_reader = DatabaseReader(
    scheme="postgresql",
    host="localhost",
    user="user",
    password="pass",
    database="sales"
)
db_docs = db_reader.load_data(query="SELECT * FROM sales_data")
db_index = VectorStoreIndex.from_documents(db_docs)

# 2. CSV 文件处理(LlamaIndex 的强项)
from llama_index.readers.file import CSVReader
csv_reader = CSVReader()
csv_docs = csv_reader.load_data("sales_data.csv")
csv_index = VectorStoreIndex.from_documents(csv_docs)

# 3. MCP 工具(天气 API)
weather_client = BasicMCPClient(
    command="python",
    args=["weather_mcp_server.py"]
)
weather_tools = weather_client.to_tool_list()

# 4. 创建查询引擎
from llama_index.core.query_engine import RetrieverQueryEngine
db_query = RetrieverQueryEngine.from_args(db_index.as_retriever())
csv_query = RetrieverQueryEngine.from_args(csv_index.as_retriever())

# 5. 组装 Agent
from llama_index.agent.openai import OpenAIAgent
agent = OpenAIAgent.from_tools(
    tools=[
        db_query.as_tool(name="db_query", description="查询销售数据库"),
        csv_query.as_tool(name="csv_query", description="查询 CSV 文件"),
        *weather_tools
    ],
    llm=ChatOpenAI(model="gpt-4o")
)

优点

  • RAG pipeline 集成度最高——数据库查询和 CSV 文件都可以自动转为向量索引
  • 知识检索 + 工具调用的混合模式最成熟
  • 文件处理工具最丰富(支持 PDF、Word、Excel、CSV、Markdown、HTML 等 20+ 格式)

缺点

  • 非 RAG 场景的工具编排不如 LangChain 灵活
  • 数据合并分析需要额外写逻辑(LlamaIndex 擅长检索,不擅长计算)
  • 错误处理需要自己实现(没有 LangChain 那样的内置 retry 机制)

实测结果:如果核心需求是”检索 + 分析”,LlamaIndex 是最优解。但如果核心需求是”多步骤工具调用 + 数据处理 pipeline”,它的表现不如 LangChain。


四、对比总结

4.1 四维评分

维度DifyLangChainLlamaIndex
MCP 集成深度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
预置工具丰富度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
开发效率⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
生产可靠性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习门槛极低
团队协作友好度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

4.2 场景推荐

选 Dify 的场景:

  • 团队中有非技术人员(产品经理、运营)需要搭建 Agent
  • 需求相对标准化(FAQ 客服、数据查询、内容生成)
  • 需要快速上线,不想在基础设施上花时间
  • 内部工具,对极致灵活性和性能要求不高

选 LangChain 的场景:

  • 团队全员是开发者
  • 需要复杂的工具编排、错误处理、重试逻辑
  • 需要版本控制、单元测试、CI/CD
  • 生产级应用,对稳定性和可观测性有高要求
  • 需要对接非标准系统(如企业内部的老系统)

选 LlamaIndex 的场景:

  • 核心需求是 RAG(知识检索 + 问答)
  • 需要处理多种格式的文档(PDF、Word、Excel、扫描件等)
  • 需要在检索结果基础上调用工具做进一步分析
  • 知识库问答 + 工具调用的混合场景

4.3 MCP 协议的未来走向

一个值得注意的趋势是:三大平台都在向 MCP 靠拢,但方式不同。

  • Dify 把 MCP 当”插件标准”——任何符合 MCP 协议的工具都能即插即用
  • LangChain 把 MCP 当”工具层抽象”——MCP 是 LangChain 工具生态的一种接入方式
  • LlamaIndex 把 MCP 当”外部能力扩展”——MCP 工具是 RAG pipeline 的补充

从长期来看,MCP 可能会成为 Agent 工具层的”USB 标准”——不管底层是 Dify、LangChain 还是其他平台,只要支持 MCP 协议,工具就能跨平台使用。

但这还需要时间。当前的 MCP 生态还处于”早期扩张”阶段——工具数量增长很快,但工具质量参差不齐,标准化程度不够。


五、选型决策树

你的团队有非技术人员需要搭建 Agent 吗?

    ├── 是 → 选 Dify
    │         │
    │         └── 需要复杂的自定义工具?
    │              ├── 是 → Dify + 自定义 MCP Server(自己部署)
    │              └── 否 → Dify 内置工具即可

    └── 否 → 全员是开发者

              ├── 核心需求是 RAG / 知识检索?
              │    ├── 是 → 选 LlamaIndex
              │    └── 否 → 选 LangChain

              └── 需要跨平台工具复用?
                   ├── 是 → 优先用 MCP 协议编写工具,三个平台都能用
                   └── 否 → 各平台内置工具即可

六、实战建议:MCP Server 开发的最佳实践

不管你选哪个平台,如果你的 Agent 需要自定义工具,都需要自己写 MCP Server。以下是我们踩坑后总结的最佳实践:

6.1 用 FastMCP 起步

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("data-analyst")

@mcp.tool()
def query_sales_db(store_id: int, start_date: str, end_date: str) -> str:
    """查询指定门店在指定时间段的销售数据"""
    # 你的业务逻辑
    ...

@mcp.resource("config://database")
def db_config() -> str:
    """返回数据库连接配置"""
    return "postgresql://..."

mcp.run()

FastMCP 是官方 SDK 中的高层抽象,5 行代码就能创建一个 MCP Server。比底层的 Server API 简单很多。

6.2 工具描述要写好

LLM 是通过工具描述(description)来决定调用哪个工具的。描述写不好,工具再多也没用。

差的描述:

@mcp.tool()
def query(start_date: str, end_date: str) -> str:
    """查询数据"""  # ❌ 太模糊,LLM 不知道这是什么数据

好的描述:

@mcp.tool()
def query_sales_db(store_id: int, start_date: str, end_date: str) -> str:
    """
    查询指定门店在指定日期范围内的销售数据。
    返回格式:JSON 数组,包含日期、销售额、订单数。
    适用场景:销售趋势分析、门店业绩对比。
    """

6.3 错误信息要结构化

MCP 工具调用失败时,错误信息会返回给 LLM。如果错误信息不清晰,LLM 无法自主修正。

@mcp.tool()
def query_sales_db(store_id: int, start_date: str, end_date: str) -> str:
    try:
        result = db.query(store_id, start_date, end_date)
        return json.dumps(result)
    except ConnectionError as e:
        return json.dumps({
            "error": "DATABASE_CONNECTION_FAILED",
            "message": str(e),
            "suggestion": "检查数据库连接配置,或尝试使用缓存数据"
        })

结构化的错误信息让 LLM 能自主决定重试、换数据源、还是报告给用户。


本文基于 2026 年 5 月的实际测试。各平台的 MCP 集成度在快速迭代中,建议以官方最新文档为准。