主题
模型上下文协议 (Model Context Protocol, MCP) 是一个开放协议,它标准化了应用程序如何向大语言模型 (LLMs) 提供工具和上下文。LangChain 智能体可以使用 langchain-mcp-adapters 库来使用 MCP 服务器上定义的工具。
快速开始
安装 langchain-mcp-adapters 库:
bash
pip install langchain-mcp-adaptersbash
uv add langchain-mcp-adapterslangchain-mcp-adapters 使智能体能够使用一个或多个 MCP 服务器上定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建一个新的 MCP ClientSession,执行工具,然后进行清理。更多详情请参阅有状态会话部分。
python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio", # 本地子进程通信
"command": "python",
# 你的 math_server.py 文件的绝对路径
"args": ["/path/to/math_server.py"],
},
"weather": {
"transport": "http", # 基于 HTTP 的远程服务器
# 确保你的天气服务器在 8000 端口启动
"url": "http://localhost:8000/mcp",
}
}
)
tools = await client.get_tools()
agent = create_agent(
"claude-sonnet-4-5-20250929",
tools
)
math_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's (3 + 5) x 12?"}]}
)
weather_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what is the weather in nyc?"}]}
)自定义服务器
要创建自定义 MCP 服务器,请使用 FastMCP 库:
bash
pip install fastmcpbash
uv add fastmcp要使用 MCP 工具服务器测试你的智能体,请使用以下示例:
python
from fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio")python
from fastmcp import FastMCP
mcp = FastMCP("Weather")
@mcp.tool()
async def get_weather(location: str) -> str:
"""Get weather for location."""
return "It's always sunny in New York"
if __name__ == "__main__":
mcp.run(transport="streamable-http")传输方式
MCP 支持不同的传输机制用于客户端-服务器通信。
HTTP
http 传输(也称为 streamable-http)使用 HTTP 请求进行客户端-服务器通信。更多详情请参阅 MCP HTTP 传输规范。
python
client = MultiServerMCPClient(
{
"weather": {
"transport": "http",
"url": "http://localhost:8000/mcp",
}
}
)传递请求头
通过 HTTP 连接到 MCP 服务器时,你可以使用连接配置中的 headers 字段包含自定义请求头(例如用于身份验证或追踪)。这适用于 sse(MCP 规范已弃用)和 streamable_http 传输。
python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient(
{
"weather": {
"transport": "http",
"url": "http://localhost:8000/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN",
"X-Custom-Header": "custom-value"
},
}
}
)
tools = await client.get_tools()
agent = create_agent("openai:gpt-4.1", tools)
response = await agent.ainvoke({"messages": "what is the weather in nyc?"})身份验证
langchain-mcp-adapters 库底层使用了官方的 MCP SDK,它允许你通过实现 httpx.Auth 接口来提供自定义的身份验证机制。
python
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"weather": {
"transport": "http",
"url": "http://localhost:8000/mcp",
"auth": auth,
}
}
)stdio
客户端将服务器作为子进程启动,并通过标准输入/输出进行通信。适用于本地工具和简单设置。
与 HTTP 传输不同,stdio 连接本质上是有状态的——子进程在客户端连接的整个生命周期内持续存在。然而,当使用没有显式会话管理的 MultiServerMCPClient 时,每次工具调用仍然会创建一个新会话。有关管理持久连接的信息,请参阅有状态会话。
python
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio",
"command": "python",
"args": ["/path/to/math_server.py"],
}
}
)有状态会话
默认情况下,MultiServerMCPClient 是无状态的——每次工具调用都会创建一个新的 MCP 会话,执行工具,然后进行清理。
如果你需要控制 MCP 会话的生命周期(例如,当使用一个有状态的服务器,该服务器在多个工具调用之间维护上下文时),你可以使用 client.session() 创建一个持久的 ClientSession。
python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_mcp_adapters.tools import load_mcp_tools
from langchain.agents import create_agent
client = MultiServerMCPClient({...})
# 显式创建一个会话
async with client.session("server_name") as session:
# 将会话传递给加载工具、资源或提示
tools = await load_mcp_tools(session)
agent = create_agent(
"anthropic:claude-3-7-sonnet-latest",
tools
)核心功能
工具
工具允许 MCP 服务器公开可执行的函数,LLMs 可以调用这些函数来执行操作——例如查询数据库、调用 API 或与外部系统交互。LangChain 将 MCP 工具转换为 LangChain 工具,使它们可以直接在任何 LangChain 智能体或工作流中使用。
加载工具
使用 client.get_tools() 从 MCP 服务器检索工具,并将它们传递给你的智能体:
python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient({...})
tools = await client.get_tools()
agent = create_agent("claude-sonnet-4-5-20250929", tools):::python
结构化内容
MCP 工具除了人类可读的文本响应外,还可以返回结构化内容。当工具除了需要显示给模型的文本外,还需要返回机器可解析的数据(如 JSON)时,这很有用。
当 MCP 工具返回 structuredContent 时,适配器会将其包装在 MCPToolArtifact 中,并将其作为工具的工件返回。你可以通过 ToolMessage 上的 artifact 字段访问它。你也可以使用拦截器来自动处理或转换结构化内容。
从工件中提取结构化内容
调用智能体后,你可以从响应中的工具消息访问结构化内容:
python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from langchain.messages import ToolMessage
client = MultiServerMCP