MCP (Model Context Protocol) 是由 Anthropic 推出的新标准,旨在统一大模型与外部数据、工具之间的连接方式。在 LangChain 中集成 MCP 工具,可以让你轻松调用成百上千个现成的 MCP 服务(如本地文件操作、Google Search、SQLite 查询等)。
要在 LangChain Agent 中添加 MCP 工具,主要分为三步:连接 MCP 服务器 、转换工具格式 、注入 Agent。
一、 环境准备
你需要安装 langchain-mcp 库(这是 LangChain 专门为 MCP 开发的集成包):
bash
pip install langchain-mcp langchain-openai
二、 核心步骤与代码示例
假设我们要连接一个现成的 MCP 服务器(例如一个提供本地文件系统操作或简单数学运算的服务)。
1. 配置 MCP 服务器连接
MCP 通常通过 Stdio (标准输入输出,常用于本地可执行文件)或 SSE(服务器发送事件,常用于远程服务)进行通信。
python
from langchain_mcp import McpToolkit
from langchain_mcp.client import StdioServerParameters
# 定义如何启动 MCP 服务器
# 这里以一个名为 "my-mcp-server" 的本地命令为例
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-everything"], # 这是一个官方示例服务器
env=None
)
2. 获取并转换 MCP 工具
使用 McpToolkit 连接服务器并将其提供的工具转换为 LangChain 可识别的 BaseTool 格式。
python
# 初始化 Toolkit
# 注意:这通常需要在异步环境下运行或使用 context manager
async def get_tools():
toolkit = McpToolkit(server_parameters=server_params)
# 初始化连接并获取工具列表
await toolkit.initialize()
return toolkit.get_tools()
3. 将工具交给 Agent
一旦拿到了 tools 列表,后续步骤与常规 LangChain Agent 开发完全一致。
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 main():
# 1. 初始化模型(需支持 Tool Calling)
llm = ChatOpenAI(model="gpt-4o")
# 2. 获取 MCP 工具
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-everything"]
)
toolkit = McpToolkit(server_parameters=server_params)
await toolkit.initialize()
tools = toolkit.get_tools()
# 3. 创建 Prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个拥有外部插件能力的助手。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
# 4. 构建 Agent
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 5. 执行任务
# 假设该 MCP 服务器提供了一个 echo 工具
result = await agent_executor.ainvoke({"input": "请使用 echo 工具对我说 '你好,MCP!'"})
print(result["output"])
# 运行异步主函数
if __name__ == "__main__":
asyncio.run(main())
三、 为什么使用 MCP 协议的工具?
- 即插即用 :你可以直接使用社区维护的 MCP 服务器列表(如 Postgres, Slack, GitHub, Docker 等),无需自己编写工具的 Python 函数。
- 跨语言:MCP 服务器可以用 TypeScript, Go, Python 等任何语言编写,而你的 LangChain 应用依然可以无缝调用。
- 标准化:工具的定义(Name, Description, Schema)完全遵循协议,减少了 LLM 解析出错的概率。
四、 常见注意事项
- 异步运行 :MCP 的底层通信通常是异步的,因此建议在异步(
async/await)环境中使用langchain-mcp。 - 资源释放 :在生产环境中,记得在应用关闭时通过
await toolkit.close()断开与 MCP 服务器的连接,防止僵尸进程。 - 多服务器连接 :你可以定义多个
StdioServerParameters,将来自不同服务器的工具汇总到一个tools列表中交给 Agent,实现多功能组合。
总结 :通过 McpToolkit,LangChain 将 MCP 服务器变成了一个"超级工具包",极大地扩展了 Agent 的能力边界。