在 LangChain 中使用 MCP (Model Context Protocol) 是目前连接外部数据源(如 GitHub、Google Drive、Slack 或本地文件系统)最标准、最便捷的方式。
MCP 的核心思想是:"一次编写工具,处处可以使用"。只要一个服务实现了 MCP 协议,LangChain 就可以通过一个统一的接口直接调用它的所有功能。
以下是在 LangChain 中集成 MCP 的详细指南。
一、 核心概念
在 LangChain 中集成 MCP 主要涉及两个概念:
- MCP 服务器 (Server):提供工具或数据的独立进程(如一个连接 SQLite 的 Node.js 程序)。
- MCP 客户端 (Client/Toolkit) :LangChain 侧的连接器,负责与服务器握手并将服务器的功能转化为 LangChain 的
BaseTool对象。
二、 环境准备
你需要安装 LangChain 的 MCP 官方集成包:
bash
pip install -U langchain-mcp langchain-openai
三、 快速上手:连接 MCP 服务器并使用工具
MCP 服务器通常通过 Stdio(标准输入输出,适合本地工具)进行通信。
1. 定义服务器连接参数
你需要告诉 LangChain 如何启动 MCP 服务器。例如,使用 npx 启动一个官方提供的示例服务器:
python
from langchain_mcp import McpToolkit
from langchain_mcp.client import StdioServerParameters
# 配置 MCP 服务器(这里以官方的 "everything" 服务器为例,它包含了各种测试工具)
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-everything"],
env=None # 如果需要 API Key,可以在这里传入环境变量字典
)
2. 初始化 Toolkit 并获取工具
由于 MCP 通信是基于异步 JSON-RPC 的,建议在异步环境中使用:
python
import asyncio
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
async def run_mcp_agent():
# 1. 创建支持工具调用的模型
llm = ChatOpenAI(model="gpt-4o")
# 2. 初始化 MCP Toolkit
# Toolkit 会连接服务器并自动扫描出所有可用的工具
async with McpToolkit(server_parameters=server_params) as toolkit:
# 获取转换为 LangChain 格式的工具列表
tools = toolkit.get_tools()
# 3. 创建 Agent
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个拥有强大外部能力的助手。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 4. 执行任务(假设服务器提供了一个叫 echo 的工具)
await agent_executor.ainvoke({"input": "使用 MCP 服务器的 echo 工具,输出内容为 'Hello LangChain!'"})
if __name__ == "__main__":
asyncio.run(run_mcp_agent())
四、 进阶用法:处理资源 (Resources)
MCP 除了支持"动作"(Tools),还支持"资源"(Resources)。资源就像是只读的文件或数据流。
LangChain 的 McpToolkit 也可以列出服务器提供的资源:
python
async with McpToolkit(server_parameters=server_params) as toolkit:
# 获取资源列表
resources = await toolkit.get_resources()
for resource in resources:
print(f"资源名称: {resource.name}, 路径: {resource.uri}")
# 读取某个资源内容
# content = await toolkit.read_resource("resource_uri_here")
五、 为什么在 LangChain 中使用 MCP?
- 极速扩展能力 :你可以直接从 MCP Servers 社区仓库 下载现成的服务器(如 Postgres, Docker, Git),几分钟内就能让你的 LangChain Agent 具备操作数据库或 Git 的能力。
- 解耦工具逻辑:工具可以用 Node.js 或 Go 编写在 MCP 服务器里,而你的业务逻辑在 Python 的 LangChain 里。
- 多 Agent 共享:一个 MCP 服务器可以同时为 LangChain、Claude Desktop 或其他支持 MCP 的客户端提供服务,无需重复开发。
六、 常见 MCP 服务器示例
你可以将 StdioServerParameters 中的 args 替换为以下任意一个:
- 本地文件操作 :
args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allow"] - Google Search :
args=["-y", "@modelcontextprotocol/server-google-search"](需设置环境变量GOOGLE_API_KEY) - GitHub 操作 :
args=["-y", "@modelcontextprotocol/server-github"](需设置GITHUB_PERSONAL_ACCESS_TOKEN)
总结
在 LangChain 中使用 MCP,本质上是把 McpToolkit 作为一个工具转换器 。它扫描 MCP 服务器,把远程的协议接口"翻译"成 LangChain Agent 听得懂的 tools 列表,从而实现极其强大的插件化能力。