当前位置: 首页 > news >正文

构建可扩展的 AI 应用:LangChain 与 MCP 服务的集成模式

为什么需要MCP?

在构建复杂的AI智能体(Agent)时,一个核心的挑战是如何让大语言模型(LLM)与外部世界安全、高效地交互。传统上,我们需要为每一个工具(如数据库、API、文件系统)编写大量的适配代码,这个过程繁琐且难以标准化。

Model Context Protocol(MCP)的出现正是为了解决这一痛点。MCP是一个开放的协议,它定义了LLM应用程序(如LangChain)与工具、数据源(统称为“服务器”)之间通信的标准方式。这意味着:

  1. 标准化:工具提供商可以编写一个标准的MCP服务器,任何支持MCP的客户端(如LangChain、OpenAI GPTs)都能立即使用。

  2. 安全性:MCP提供了明确的权限控制,客户端可以控制智能体能访问哪些工具和数据,避免了潜在的安全风险。

  3. 开发效率:开发者无需再为每个工具重复编写集成代码,只需专注于业务逻辑。可以直接利用社区丰富的MCP服务器资源。

LangChain作为最流行的AI应用开发框架之一,自然提供了对MCP的一流支持。本文将深入浅出地带你完成在LangChain中接入MCP服务器的完整流程。

一、准备工作与环境配置

在开始编码之前,你需要确保已经安装了必要的库,并准备好一个MCP服务器。

1. 安装LangChain

首先,确保你安装了最新版本的langchainlangchain-core。MCP相关功能通常包含在核心库中。

pip install -U langchain langchain-core

2. 获取或创建一个MCP服务器

MCP服务器的本质是一个独立的进程,可以通过标准输入输出(stdio)或套接字(socket)与LangChain通信。

  • 选项A:使用现有服务器:社区已经提供了大量实用的MCP服务器。

    • 克隆仓库:git clone https://github.com/modelcontextprotocol/servers

    • 进入目录:cd servers/python/filesystem

    • 安装依赖:pip install -e .

    • 现在,你就有了一个可用的 filesystem 服务器命令。

    • 示例:文件系统服务器:一个官方示例服务器,允许LLM读写文件。

  • 选项B:查找更多服务器:在MCP官方组织的Servers仓库中可以找到由社区维护的服务器列表,包括GitHub、SQLite、Jira等。

本文将以filesystem服务器为例进行演示。

二、核心实现流程与代码解析

在LangChain中接入MCP的核心步骤如下:

1. 导入关键模块

from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 最重要的:导入MCP工具相关的模块
from langchain.tools.mcp import create_mcp_tool, MCPClientSession, MCPServerParameters

2. 创建MCP客户端会话并配置服务器

这一步是告诉LangChain如何启动和连接到你选择的MCP服务器。

# 定义服务器参数,指定如何启动服务器进程
server_params = MCPServerParameters(# 命令名,即你在步骤一中安装的 filesystem 服务器命令command="filesystem",# 可选:传递给服务器的参数,例如指定当前工作目录args=["--directory", "/tmp/mcp-demo"]
)# 创建一个MCP客户端会话,管理客户端与服务器的连接和通信
session = MCPClientSession(server_params=server_params)

3. 从会话中创建LangChain工具

这是最关键的一步。create_mcp_tool函数会与MCP服务器握手,获取服务器提供的所有工具列表,并将它们动态地转换为LangChain智能体可以直接调用的Tool对象。

# 获取所有工具
tools = create_mcp_tool(session, name="mcp-filesystem-tools")
# 注意:`tools` 通常是一个工具列表(List[Tool]),因为一个服务器可能提供多个工具。

你可以打印一下tools来看看这个服务器具体提供了什么:

for tool in tools:print(f"工具名: {tool.name}")print(f"描述: {tool.description}")print("---")

对于filesystem服务器,你可能会看到read_filewrite_filelist_directory等工具。

4. 构建智能体(Agent)并执行

现在,这些MCP工具已经和普通的LangChain Tool没有任何区别了。我们可以像使用任何其他工具一样,将它们组装进智能体。

# 1. 初始化LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)# 2. 创建Prompt模板,指引智能体使用工具
prompt = ChatPromptTemplate.from_messages([("system", "你是一个有帮助的助手,可以读写文件。请根据用户要求调用相应的工具。"),("placeholder", "{chat_history}"),("human", "{input}"),("placeholder", "{agent_scratchpad}"),
])# 3. 构建智能体
agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)# 4. 创建智能体执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 5. 执行一个任务!
asyncdef main():asyncwith session: # 确保使用异步上下文管理器来管理MCP会话result = await agent_executor.ainvoke({"input": "请在 /tmp/mcp-demo 目录下创建一个名为 'hello.txt' 的文件,并写入内容 'Hello, MCP World!'"})print(result["output"])# 运行异步主函数
import asyncio
asyncio.run(main())

三、流程解析与幕后发生了什么

当你运行上述代码时,LangChain和MCP服务器之间会发生以下交互:

  1. 启动服务器:LangChain根据MCPServerParameters的配置,作为一个父进程启动filesystem服务器子进程。

  2. 初始化握手:LangChain(客户端)与服务器通过stdio交换初始化信息,客户端获取服务器提供的工具列表和其模式(Schema)(包括名称、描述、参数等)。

  3. 工具调用

    • 用户输入提问。

    • LLM根据Prompt和工具描述,决定调用write_file工具,并生成符合该工具模式的参数JSON。

    • AgentExecutor捕获到这个调用请求。

    • LangChain将调用请求通过MCP协议发送给服务器进程。

    • filesystem服务器收到请求,在其内部执行真正的“写文件”操作。

    • 服务器将操作结果(成功或失败信息)通过M协议返回给LangChain。

    • LangChain将结果返回给LLM。

    • LLM根据结果生成最终回答,返回给用户。

整个过程中,LangChain并不需要知道write_file这个工具内部是如何实现的,它只负责按照MCP协议进行转发。这种关注点分离的设计极大地提升了系统的可维护性和扩展性。

四、总结与展望

通过MCP协议,LangChain智能体获得了一种标准化、模块化的方式来扩展其能力。开发者不再被束缚于有限的内置工具,可以自由地“即插即用”任何遵循MCP协议的工具服务器,从操作本地文件到管理云上资源,几乎无所不能。

下一步尝试:

  • 探索更多的MCP服务器,如sqlite(操作数据库)、github(管理PR、Issue)。

  • 尝试使用Socket模式连接服务器,而不是Stdio模式,这更适合于生产环境中将服务器作为独立服务部署的场景。

  • 关注MCP协议的快速发展,它正在成为连接LLM与外部工具生态的重要桥梁。

通过本文的实践步骤,相信你已经掌握了如何将 MCP 服务的能力集成到 LangChain 框架中。下一步,不妨尝试将其应用到真实的业务场景中,让 AI 系统真正具备调用后端服务、执行复杂逻辑的能力。


精选文章
让 AI 更聪明:不可错过的 7 大开源 MCP 项目
主流自动化测试框架:技术解析与实战手册
国产模型Qwen3-32B本地化实战:LangChain + vLLM 构建企业智能引擎
2025大模型平台选择指南:从个人助手到企业智能体,解读五大场景
深入解析Agent实现“听懂→规划→执行”全流程的奥秘
2025大语言模型部署实战指南:从个人开发到企业落地全栈解决方案
企业AI转型之战:Coze、Dify与FastGPT的巅峰对决
Coze开源版本地部署指南

Playwright系列

Playwright实战指南:飞速编写UI自动化脚本
Playwright-MCP浏览器会话复用全解析
Playwright 极速入门:1小时搞定环境搭建与首个测试脚本
Playwright系列课(2) |元素定位四大法宝:CSS/文本/XPath/语义化定位实战指南
Playwright自动化测试系列课(3) | 第二阶段:核心技能与调试 ​​交互操作大全
Playwright自动化测试系列课(4) | 异步加载克星:自动等待 vs 智能等待策略深度解析​
Playwright自动化测试系列课(5) | ​​调试神器实战:Trace Viewer 录屏分析 + AI 辅助定位修复​
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式

http://www.xdnf.cn/news/1435465.html

相关文章:

  • C++算法学习:位运算
  • ECMWF数据批量下载(Windows版本)
  • Ngene:实验设计的尖端利器
  • 洛谷P3811 【模板】模意义下的乘法逆元
  • Linux操作系统(6)
  • java-设计模式-3-创建型模式-原型
  • 一文读懂 Python 【循环语句】:从基础到实战,效率提升指南
  • 【机器学习学习笔记】Matplotlib 基本操作
  • Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)
  • 如何将大疆无人机拍摄到的图像回传到应急指挥中心大屏?5G单兵图传轻松解决图传问题|伟博视讯
  • Ansible角色:高效开发与管理的秘密
  • Ukey介绍
  • HTML第二课:块级元素
  • 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
  • Ascend上开发自定义算子接入PyTorch有几种实现方式?
  • Higress云原生API网关详解 与 Linux版本安装指南
  • 企业数字安全守护神:IT运维管理系统全面解析,构建坚不可摧的防护体系
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享3(重点)
  • 数据结构:闭散列 (Closed Hashing)-开放定址法 (Open Addressing)
  • react用useImages读取图片,方便backgroundImage
  • hikvision海康威视sdk调用失败,code为29解决办法
  • 集采与反腐双重压力下,医药销售的破局之道:从资源依赖到价值重构
  • 从结构化到多模态:RAG文档解析工具选型全指南
  • Portainer:Docker可视化管理神器部署与使用攻略
  • 不只是一台玩具车:开源燃料电池机器人HydroBot全揭秘
  • 怎么用redis lua脚本实现各分布式锁?Redisson各分布式锁怎么实现的?
  • Unity通过Object学习原型模式
  • ES6和CommonJS模块区别
  • GNU Make | C/C++项目自动构建入门
  • DevOps运维与开发一体化及Kubernetes运维核心详解