news 2025/12/14 8:23:15

【干货】LangChain与MCP完美结合:4种模式解锁AI Agent新能力,小白必学收藏!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【干货】LangChain与MCP完美结合:4种模式解锁AI Agent新能力,小白必学收藏!

简介

本文详细介绍了如何将MCP技术与LangChain框架集成,通过4个实战示例展示了两种MCP通信模式(SSE和Stdio)与两种LangChain Agent创建方式(经典方式和1.0版本的create_agent函数)的组合应用。文章提供了完整的代码实现和部署指南,帮助开发者利用丰富的MCP服务扩展AI Agent功能,构建更强大、更灵活的应用程序。


MCP 技术毋须多言了,上半年火的一塌糊涂,现在进入冷静期了。

langchain 本身就很方便的集成进程内的工具,但是加上 MCP 的功能,就如虎添翼,可以充分利用网上上万的 MCP 的服务。

langchain 自从上个月融资了 1.25 亿美元之后,资金充足,也更加有动力推进产品的演化,相继发布了 langchain/langgraph 1.0 的版本。 langchain 1.0 中统一了 agent 的创建,使用create_agent代替之前的create_tool_calling_agentcreate_react_agentcreate_json_agentcreate_xml_agent等。

这篇文章介绍 2(MCP 的两种模式 sse、stdio) x 2 (经典的 langchain agent 和 1.0 最新版 create_agent 两个模式)一共 4 个例子,介绍了 langchain 如何使用 MCP 工具丰富其功能。

先决条件

在运行这些示例之前,请确保您已安装必要的库。您通常可以使用 pip 进行安装:

pip install langchain langchain-openai langchain-classic langchain-mcp-adapters mcp

此外,请确保您的环境中已安装python3

共同组件

这两个示例都共享几个核心组件和一个共同目标:使用 LangChain Agent 通过 MCP 服务器提供的工具来回答一个简单的数学问题。

  • LLM 配置:两个示例都使用ChatOpenAI,配置为deepseek-v3模型,温度为0。 这是我使用百度云上提供的 deepseek 服务,你要是使用 deepseek 官方的服务,需要修改模型为deepseek-chat。 我已经把 KEY 和调用地址配置在环境变量中了,所以在代码中不用显示指定:
export OPENAI_API_KEY=bce-v3/abcsfsfdskgergerthntjrweeuidfu8324refbif3export OPENAI_API_BASE=https://qianfan.baidubce.com/v2

创建模型对象:

llm = ChatOpenAI(model="deepseek-v3", temperature=0)
  • Agent 提示ChatPromptTemplate用于定义 Agent 的角色并构建对话。它包括一个系统消息、可选的聊天历史记录、人类输入以及 Agent 暂存区(用于规划其行动)的占位符。```plaintext
    prompt = ChatPromptTemplate.from_messages( [ (“system”, “你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்.”), MessagesPlaceholder(“chat_history”, optional=True), (“human”, “{input}”), MessagesPlaceholder(“agent_scratchpad”), ])
  • Agent 创建和执行create_tool_calling_agent函数用于构建能够使用工具的 Agent ,AgentExecutor用于运行 Agent 。```plaintext
    agent = create_tool_calling_agent(llm, tools, prompt)agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # SSE 示例中 verbose=False
  • 任务: Agent 被调用,输入为“123 + 456 等于多少?”。

MCP 服务

Stdio 服务

import asynciofrom mcp.server import FastMCP# 创建一个服务器实例server = FastMCP(name="math_server", log_level="ERROR")# 定义并注册 add 工具@server.tool()def add(a: int, b: int) -> int: """将两个整数相加。""" return a + basync def main(): await server.run_stdio_async()if __name__ == "__main__": asyncio.run(main())

sse 服务

import asynciofrom typing import Annotatedfrom mcp.server import FastMCP# 创建一个服务器实例server = FastMCP(name="math_server", instructions="一个可以做加法的简单数学服务器。", log_level="ERROR")# 定义并注册 add 工具@server.tool()def add( a: Annotated[int, "第一个整数"], b: Annotated[int, "第二个整数"]) -> int: """将两个整数相加。""" return a + basync def main(): await server.run_sse_async()if __name__ == "__main__": asyncio.run(main())

示例 1:example_1_mcp_tool_stdio.py(标准 I/O 通信)

此示例演示了如何设置一个 MCP 服务器,该服务器通过标准输入和输出流与客户端通信。这适用于本地、单进程交互,其中服务器可以作为子进程生成。

目的

example_1_mcp_tool_stdio.py脚本展示了如何:

  1. 定义一个通过 stdio 暴露工具的 MCP 服务器。
  2. 创建一个stdio_client来连接到此服务器。
  3. 将服务器提供的工具加载到 LangChain Agent 中。
  4. 使用 Agent 解决需要加载工具的问题。

关键组件和代码

import asyncioimport osfrom pathlib import Pathfrom langchain_openai import ChatOpenAIfrom langchain_classic.agents import AgentExecutor, create_tool_calling_agentfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_mcp_adapters.tools import load_mcp_toolsfrom mcp.client.stdio import stdio_clientfrom mcp import ClientSession, StdioServerParametersasync def run_mcp_tool_example(): # ... (LLM 和提示设置,如共同组件中所述) ... # 1. 定义 MCP 数学服务器的路径 # 此行构建了 stdio 数学服务器脚本的绝对路径。 # `Path(__file__).parent` 获取当前脚本的目录。 mcp_server_path = Path(__file__).parent / "mcp_math_server_stdio.py" # 2. 为 MCP 服务器设置 stdio 客户端参数 # StdioServerParameters 指定如何运行 MCP 服务器。 # `command="python3"` 指示解释器。 # `args=[str(mcp_server_path)]` 提供要作为参数执行的脚本。 server_params = StdioServerParameters( command="python3", args=[str(mcp_server_path)], ) # 3. 建立 stdio 客户端会话 # `stdio_client(server_params)` 创建一个异步上下文管理器, # 它生成服务器进程并提供用于通信的读/写流。 async with stdio_client(server_params) as (read, write): # 4. 创建 MCP 客户端会话 # `ClientSession` 通过提供的读/写流管理 MCP 协议。 async with ClientSession(read, write) as session: # 5. 初始化连接 # 此步骤对于客户端和服务器建立 MCP 连接至关重要。 await session.initialize() # 6. 从 MCP 服务器获取工具 # `load_mcp_tools(session)` 从 MCP 服务器获取工具定义 # 并将它们转换为 LangChain 兼容的工具对象。 tools = await load_mcp_tools(session) # ... ( Agent 创建和执行,如共同组件中所述) ... print("正在调用 agent 回答一个数学问题...") response = await agent_executor.ainvoke( {"input": "123 + 456 等于多少?", "chat_history": []} ) print(f"Agent 回答: {response['output']}")if __name__ == "__main__": asyncio.run(run_mcp_tool_example())

如何运行

要运行此示例,只需执行 Python 脚本:

python3 example_1_mcp_tool_stdio.py

您将看到 Agent 的思考过程和最终答案打印到控制台。

示例 2:example_1_mcp_tool_sse.py(服务器发送事件通信)

此示例演示了如何集成一个 MCP 服务器,该服务器通过 HTTP 上的服务器发送事件(SSE)暴露其工具。此方法更适用于工具服务器可能是独立网络服务的情况。

目的

example_1_mcp_tool_sse.py脚本展示了如何:

  1. 将 MCP SSE 服务器作为单独的进程启动。
  2. 创建一个MultiServerMCPClient来连接到此基于 HTTP 的服务器。
  3. 将服务器提供的工具加载到 LangChain Agent 中。
  4. 使用 Agent 解决需要加载工具的问题。

关键组件和代码演练

import asyncioimport osfrom pathlib import Pathimport sysfrom langchain_openai import ChatOpenAIfrom langchain_classic.agents import AgentExecutor, create_tool_calling_agentfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_mcp_adapters.client import MultiServerMCPClientasync def run_mcp_tool_example(): # ... (LLM 和提示设置,如共同组件中所述) ... # 1. 启动 MCP 数学服务器作为子进程 # 这将 `mcp_math_server_sse.py` 脚本作为单独的 Python 进程启动。 # `sys.executable` 确保使用正确的 Python 解释器。 # `stdout=asyncio.subprocess.PIPE` 和 `stderr=asyncio.subprocess.PIPE` # 捕获子进程的输出,尽管此处未明确读取。 mcp_server_path = Path(__file__).parent / "mcp_math_server_sse.py" server_process = await asyncio.create_subprocess_exec( sys.executable, str(mcp_server_path), stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) # 2. 等待服务器启动 # 添加一个小的延迟,以使 SSE 服务器有时间初始化并开始监听。 await asyncio.sleep(5) # 3. 为 MCP 服务器设置客户端 # `MultiServerMCPClient` 用于基于 HTTP 的 MCP 服务器。 # 它接受一个字典,其中键是服务器名称(例如,“math”),值 # 指定传输类型(“sse”)和 SSE 端点的 URL。 client = MultiServerMCPClient( { "math": { "transport": "sse", "url": "http://localhost:8000/sse", }, } ) # 4. 从 MCP 服务器获取工具 # `client.get_tools()` 连接到指定的 SSE 端点, # 检索工具定义,并将其作为 LangChain 工具提供。 tools = await client.get_tools() # ... ( Agent 创建和执行,如共同组件中所述) ... print("正在调用 agent 回答一个数学问题...") response = await agent_executor.ainvoke( {"input": "123 + 456 等于多少?", "chat_history": []} ) print(f"Agent 回答: {response['output']}") # 5. 终止服务器进程 # 通过终止已启动的子进程进行清理非常重要。 server_process.terminate() await server_process.wait()if __name__ == "__main__": asyncio.run(run_mcp_tool_example())

如何运行

要运行此示例,只需执行 Python 脚本:

python3 example_1_mcp_tool_sse.py

您将看到 Agent 的思考过程和最终答案打印到控制台。请注意,在此示例中,AgentExecutorverbose标志设置为False,以避免 SSE 服务器子进程产生过多的输出。

比较:Stdio 与 SSE

  • Stdio(标准 I/O)
  • 简单性:更易于设置本地、单机通信。
  • 执行:MCP 服务器通常作为客户端应用程序的子进程生成。
  • 用例:适用于紧密耦合的组件,或者当您希望将工具服务器直接与应用程序捆绑时。
  • SSE(服务器发送事件)
  • 灵活性:允许 MCP 服务器作为独立的网络服务运行,可能在不同的机器上。
  • 可伸缩性:可以成为更大微服务架构的一部分。
  • 执行:客户端连接到正在运行的 HTTP 端点。服务器需要单独启动(如示例中通过asyncio.create_subprocess_exec所示)。
  • 用例:适用于分布式系统、基于 Web 的应用程序,或者当工具服务器需要被多个客户端访问时。

这两种方法都有效地允许 LangChain Agent 发现和利用使用多客户端协议定义的工具,从而为这些工具的部署和访问提供了灵活性。

这两个示例都是 langchain 经典的 Agent 开发模型,他们演示了 langchain 将 MCP 工具与 LangChain Agent 集成的强大功能和灵活性。无论它们是通过 stdio 还是 SSE 暴露。这使得健壮且可伸缩的 Agent 应用程序成为可能。

接下来我介绍如何使用 Langchain 1.0 中新的create_agent函数来构建 Agent ,并将其与 MCP 工具集成。与之前的示例不同,create_agent提供了一种更简洁的方式来定义 Agent ,直接接受 LLM 模型、工具列表和系统提示,并返回一个可流式传输的图(graph)对象。

示例 3:使用 Langchain 1.0 create_agent 的 MCP SSE 工具集成

此示例展示了如何将 MCP SSE 服务器提供的工具与 Langchain 1.0 的create_agent函数结合使用。它演示了如何启动 SSE 服务器、获取工具,然后使用新的 Agent 创建和调用模式来解决数学问题。

import asyncioimport osfrom pathlib import Pathimport sysfrom langchain_openai import ChatOpenAIfrom langchain.agents import create_agentfrom langchain_mcp_adapters.client import MultiServerMCPClientasync def run_mcp_sse_new_agent_example(): server_process = None try: # 启动 MCP 数学服务器作为子进程 mcp_server_path = Path(__file__).parent / "mcp_math_server_sse.py" server_process = await asyncio.create_subprocess_exec( sys.executable, str(mcp_server_path), stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) # 等待服务器启动 await asyncio.sleep(5) # 为 MCP 服务器设置客户端 client = MultiServerMCPClient( { "math": { "transport": "sse", "url": "http://localhost:8000/sse", }, } ) # 从 MCP 服务器获取工具 tools = await client.get_tools() # 使用用户偏好配置 LLM llm = ChatOpenAI(model="deepseek-v3", temperature=0) # 创建一个 agent graph = create_agent( model=llm, tools=tools, system_prompt="你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்.", ) print("正在调用 agent 回答一个数学问题...") inputs = {"messages": [{"role": "user", "content": "123 + 456 等于多少?"}]} async for chunk in graph.astream(inputs, stream_mode="updates"): print(chunk) finally: if server_process and server_process.returncode is None: print("\nTerminating server process...") server_process.terminate() await server_process.wait() elif server_process and server_process.returncode is not None: print(f"\nServer process exited with code: {server_process.returncode}") if server_process and server_process.stderr: stderr_output = await server_process.stderr.read() if stderr_output: print("\nServer stderr output:") print(stderr_output.decode())if __name__ == "__main__": asyncio.run(run_mcp_sse_new_agent_example())

示例 4:使用 Langchain 1.0 create_agent 的 MCP Stdio 工具集成

此示例演示了如何将 MCP Stdio 服务器提供的工具与 Langchain 1.0 的create_agent函数结合使用。它展示了如何通过 stdio 客户端连接到服务器、获取工具,然后使用新的 Agent 创建和调用模式来解决数学问题。

import asyncioimport osfrom pathlib import Pathfrom langchain_openai import ChatOpenAIfrom langchain.agents import create_agentfrom langchain_mcp_adapters.tools import load_mcp_toolsfrom mcp.client.stdio import stdio_clientfrom mcp import ClientSession, StdioServerParametersasync def run_mcp_stdio_new_agent_example(): # 定义 MCP 数学服务器的路径 mcp_server_path = Path(__file__).parent / "mcp_math_server_stdio.py" # 为 MCP 服务器设置 stdio 客户端 server_params = StdioServerParameters( command="python3", args=[str(mcp_server_path)], ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: # 初始化连接 await session.initialize() # 从 MCP 服务器获取工具 tools = await load_mcp_tools(session) # 使用用户偏好配置 LLM llm = ChatOpenAI(model="deepseek-v3", temperature=0) # 创建一个 agent graph = create_agent( model=llm, tools=tools, system_prompt="你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்.", ) print("正在调用 agent 回答一个数学问题...") inputs = {"messages": [{"role": "user", "content": "123 + 456 等于多少?"}]} async for chunk in graph.astream(inputs, stream_mode="updates"): print(chunk)if __name__ == "__main__": asyncio.run(run_mcp_stdio_new_agent_example())

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段:从大模型系统设计入手,讲解大模型的主要方法;

第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求:大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能,学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力:大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/12 16:54:44

NotchDrop:让MacBook刘海变身智能文件中转站

NotchDrop:让MacBook刘海变身智能文件中转站 【免费下载链接】NotchDrop Use your MacBooks notch like Dynamic Island for temporary storing files and AirDrop 项目地址: https://gitcode.com/gh_mirrors/no/NotchDrop 你是否曾想过,那个占据…

作者头像 李华
网站建设 2025/12/12 16:54:34

5亿参数改写边缘智能规则:腾讯Hunyuan-0.5B-Instruct轻量化模型深度解析

5亿参数改写边缘智能规则:腾讯Hunyuan-0.5B-Instruct轻量化模型深度解析 【免费下载链接】Hunyuan-0.5B-Instruct 腾讯开源高效大语言模型Hunyuan-0.5B-Instruct,专为指令优化而生。它支持256K超长上下文理解与双模式推理,兼具高效推理与强大…

作者头像 李华
网站建设 2025/12/12 16:54:14

如何快速解决Nacos数据库升级冲突:5个实用技巧

如何快速解决Nacos数据库升级冲突:5个实用技巧 【免费下载链接】nacos Nacos是由阿里巴巴开源的服务治理中间件,集成了动态服务发现、配置管理和服务元数据管理功能,广泛应用于微服务架构中,简化服务治理过程。 项目地址: https…

作者头像 李华
网站建设 2025/12/12 16:53:11

高密度互连板层压创新:从任意层互连到微孔填充技术

高密度互连板的层压技术已超越传统的粘合功能,演进为实现微米级互连的关键赋能者。随着5G毫米波天线与人工智能处理器对布线密度的需求突破每平方厘米万线级别,层压工艺需同步解决介厚均匀性、微孔对准及材料兼容性三重挑战。现代HDI板层压的核心&#x…

作者头像 李华
网站建设 2025/12/12 16:53:10

高频PCB层压材料进化:介电性能博弈

高频PCB层压材料的选择是一场介电性能、热稳定性与工艺适应性的多维博弈。当信号频率进入毫米波波段,基材的介电常数稳定性与损耗因子成为决定信号衰减的主导因素。传统FR-4材料在10GHz时损耗因子高达0.02,而新一代高频材料如液晶聚合物将其降至0.002&am…

作者头像 李华