langchain-mcp-adapters 库在 MCP 服务器上定义的工具。
快速开始
安装langchain-mcp-adapters 库:
langchain-mcp-adapters 使代理能够使用在一个或多个 MCP 服务器上定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建一个新的 MCP ClientSession,执行工具,然后清理干净。有关更多详细信息,请参阅有状态会话部分。Accessing multiple MCP servers
自定义服务器
要创建自定义 MCP 服务器,请使用 FastMCP 库:传输
MCP 支持不同的传输机制用于客户端-服务器通信。HTTP
http 传输(也称为 streamable-http)使用 HTTP 请求进行客户端-服务器通信。有关更多详细信息,请参阅 MCP HTTP 传输规范。
传递请求头
通过 HTTP 连接到 MCP 服务器时,您可以使用连接配置中的headers 字段包含自定义请求头(例如,用于身份验证或跟踪)。这支持 sse(已被 MCP 规范弃用)和 streamable_http 传输。
Passing headers with MultiServerMCPClient
身份验证
langchain-mcp-adapters 库在底层使用官方的 MCP SDK,它允许您通过实现 httpx.Auth 接口来提供自定义身份验证机制。
stdio
客户端将服务器作为子进程启动,并通过标准输入/输出进行通信。非常适合本地工具和简单设置。与 HTTP 传输不同,
stdio 连接本质上是有状态的:子进程在客户端连接的生命周期内持续存在。但是,当使用 MultiServerMCPClient 而没有显式会话管理时,每次工具调用仍然会创建一个新会话。请参阅有状态会话以管理持久连接。有状态会话
默认情况下,MultiServerMCPClient 是无状态的:每次工具调用都会创建一个新的 MCP 会话,执行工具,然后清理干净。
如果您需要控制 MCP 会话的生命周期(例如,当使用跨工具调用维护上下文的有状态服务器时),您可以使用 client.session() 创建一个持久的 ClientSession。
Using MCP ClientSession for stateful tool usage
核心功能
工具
工具 允许 MCP 服务器公开 LLM 可调用的可执行函数,以执行操作——如查询数据库、调用 API 或与外部系统交互。LangChain 将 MCP 工具转换为 LangChain 工具,使它们可以直接在任何 LangChain 代理或工作流程中使用。加载工具
使用client.get_tools() 从 MCP 服务器检索工具并将其传递给您的代理:
结构化内容
MCP 工具可以返回结构化内容以及人类可读的文本响应。当工具需要返回机器可解析的数据(如 JSON)以及显示给模型的文本时,这非常有用。 当 MCP 工具返回structuredContent 时,适配器将其包装在 MCPToolArtifact 中并将其作为工具的产物返回。您可以使用 ToolMessage 上的 artifact 字段访问它。您还可以使用拦截器来自动处理或转换结构化内容。
从产物中提取结构化内容
调用代理后,您可以从响应中的工具消息访问结构化内容:
多模态工具内容
MCP 工具可以在其响应中返回多模态内容(图像、文本等)。当 MCP 服务器返回包含多个部分的内容(如文本和图像)时,适配器会将它们转换为 LangChain 的标准内容块。您可以通过ToolMessage 上的 content_blocks 属性访问标准化表示:
资源
资源 允许 MCP 服务器公开可供客户端读取的数据——如文件、数据库记录或 API 响应。LangChain 将 MCP 资源转换为 Blob 对象,这些对象提供了用于处理文本和二进制内容的统一接口。加载资源
使用client.get_resources() 从 MCP 服务器加载资源:
load_mcp_resources 与会话一起以获得更多控制:
提示
提示 允许 MCP 服务器公开可供客户端检索和使用的可重用提示模板。LangChain 将 MCP 提示转换为消息,使它们易于集成到基于聊天的工作流程中。加载提示
使用client.get_prompt() 从 MCP 服务器加载提示:
load_mcp_prompt 与会话一起以获得更多控制:
高级功能
工具拦截器
MCP 服务器作为独立进程运行——它们无法访问 LangGraph 运行时信息,如存储、上下文或代理状态。拦截器通过在 MCP 工具执行期间为您提供对此运行时上下文的访问来弥合这一差距。 拦截器还提供类似中间件的工具调用控制:您可以修改请求、实现重试、动态添加请求头,或完全短路执行。访问运行时上下文
当 MCP 工具在 LangChain 代理中使用时(通过create_agent),拦截器接收对 ToolRuntime 上下文的访问。这提供了对工具调用 ID、状态、配置和存储的访问——支持访问用户数据、持久化信息和控制代理行为的强大模式。
- 运行时上下文
- 存储
- 状态
- 工具调用 ID
访问特定于用户的配置,如用户 ID、API 密钥或权限,这些在调用时传递:
Inject user context into MCP tool calls
状态更新和命令
拦截器可以返回Command 对象来更新代理状态或控制图形执行流程。这对于跟踪任务进度、在代理之间切换或提前结束执行非常有用。
Mark task complete and switch agents
Command 与 goto="__end__" 提前结束执行:
End agent run on completion
自定义拦截器
拦截器是包装工具执行的异步函数,支持请求/响应修改、重试逻辑和其他横切关注点。它们遵循”洋葱”模式,其中列表中的第一个拦截器是最外层。 基本模式 拦截器是一个接收请求和处理程序的异步函数。您可以在调用处理程序之前修改请求,在调用之后修改响应,或完全跳过处理程序。Basic interceptor pattern
request.override() 创建修改后的请求。这遵循不可变模式,保持原始请求不变。
Modifying tool arguments
Dynamic header modification
Composing multiple interceptors
Retry on error
Error handling with fallback
进度通知
订阅长时间运行的工具执行的进度更新:Progress callback
CallbackContext 提供:
server_name:MCP 服务器的名称tool_name:正在执行的工具的名称(工具调用期间可用)
日志记录
MCP 协议支持来自服务器的日志通知。使用Callbacks 类订阅这些事件。
Logging callback
征求意见
征求意见允许 MCP 服务器在工具执行期间向用户请求额外输入。服务器可以交互式地按需询问信息,而不是要求所有输入都是预先准备好的。服务器设置
定义一个使用ctx.elicit() 请求带有模式的用户输入的工具:
MCP server with elicitation
客户端设置
通过向MultiServerMCPClient 提供回调来处理征求意见请求:
Handling elicitation requests
响应操作
征求意见回调可以返回三种操作之一:| 操作 | 描述 |
|---|---|
accept | 用户提供了有效输入。在 content 字段中包含数据。 |
decline | 用户选择不提供请求的信息。 |
cancel | 用户完全取消了操作。 |
Response action examples
其他资源
通过 MCP 将这些文档连接到 Claude、VSCode 等,获取实时答案。

