马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
搭复杂 AI 智能体(Agent)时,一个绕不开的难题是怎么让大语言模型(LLM)和外部世界安全、高效地打交道。过去每接一个工具(数据库、API、文件系统)就得写一堆适配代码,繁琐还不好标准化。Model Context Protocol(MCP)就是冲着这个痛点来的:它规定了 LLM 应用(比如 LangChain)与工具、数据源(统称"服务器")之间的通信标准。下面用 LangChain 接 MCP 服务器走一遍完整流程,从装库、起进程到工具调用逐段拆。
一、为什么需要 MCP
MCP 是个开放协议,带来三件事:
- 标准化:工具方写一个标准 MCP 服务器,任何支持 MCP 的客户端(如 LangChain、OpenAI GPTs)都能直接用上。
- 安全性:权限控制是明确的,客户端能决定智能体访问哪些工具和数据,把潜在风险挡在外面。
- 开发效率:开发者不用给每个工具重复写集成代码,专心做业务逻辑就行,社区里现成的 MCP 服务器资源可以直接拿。
LangChain 是最主流的 AI 应用开发框架之一,天生对 MCP 有一流支持。
二、准备工作与环境设置
测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的连续交付https://ceshiren.com/t/topic/34328
1. 安装 LangChain
确保装了最新版本的 langchain 和 langchain-core,MCP 相关功能通常包含在核心库里:
- pip install -U langchain langchain-core
复制代码
2. 获取或创建一个 MCP 服务器
MCP 服务器的本质是一个独立进程,可以通过标准输入输出(stdio)或套接字(socket)跟 LangChain 通信。
- 选项 A:直接用现成的服务器:
- 克隆仓库:git clone https://github.com/modelcontextprotocol/servers
- 进入目录:cd servers/python/filesystem
- 安装依赖:pip install -e .
- 现在,你就有一个可用的 filesystem 服务器命令。
- 示例:文件系统服务器:官方示例服务器,允许 LLM 读写文件。
- 选项 B:找更多服务器:在 MCP 官方组织的 Servers 仓库里能看到社区维护的服务器清单,包括 GitHub、SQLite、Jira 等。
本文以 filesystem 服务器为例演示。
三、核心实现流程与代码分析
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_file、write_file、list_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 服务器之间会走这样一轮交互:
- 启动服务器:LangChain 按 MCPServerParameters 的设置,作为父进程启动 filesystem 服务器子进程。
- 初始化握手:客户端与服务器通过 stdio 交换初始化信息,客户端拿到服务器提供的工具列表和它的模式(Schema)(名称、描述、参数等)。
- 工具调用:
- 用户输入提问
- LLM 根据 Prompt 和工具描述决定调用 write_file,并生成符合该工具模式的参数 JSON
- AgentExecutor 捕获到这个调用请求
- LangChain 通过 MCP 协议把请求发给服务器进程
- filesystem 服务器收到请求,在执行层完成真正的"写文件"
- 服务器把结果(成功或失败信息)通过 MCP 协议返回给 LangChain
- LangChain 把结果回给 LLM
- LLM 根据结果生成最终回答返回给用户
整个过程中 LangChain 并不需要知道 write_file 内部是怎么实现的,它只负责按 MCP 协议转发。这种关注点分离的设计把可维护性和扩展性都拉高了。
五、总结与下一步
借 MCP 协议,LangChain 智能体拿到了一种标准化、模块化的方式扩展能力:开发者不再被有限的内置工具绑住,可以"即插即用"任何遵循 MCP 的工具服务器,从操作本地文件到管云上资源,几乎都能覆盖。
下一步可以试试:
- 多逛几个 MCP 服务器,比如 sqlite(操作数据库)、github(管理 PR、Issue)。
- 试着用Socket模式连接服务器而不是 Stdio 模式,后者更适合生产环境把服务器当独立服务部署的场景。
- 盯一下 MCP 协议的迭代速度,它正在成为连接 LLM 和外部工具生态的重要桥梁。
通过上面这套流程,希望你已经掌握了把 MCP 能力接进 LangChain 智能体的路子,可以动手去做更顺手的 AI 应用了。
测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的连续交付
编辑提示:本地先跑通 stdio 模式再换 Socket,注意 demo 目录 /tmp/mcp-demo 要给进程读写的权限,否则 write_file 会在第一次调用就失败。
|