langchain-mcp-adapters 库来使用 MCP 服务器上定义的工具。
快速入门
安装langchain-mcp-adapters 库:
langchain-mcp-adapters 使代理能够使用一个或多个 MCP 服务器上定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建一个新的 MCP
ClientSession,执行工具操作后清理会话。详情请参阅
有状态会话 部分。自定义服务器
要创建一个自定义 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
且未显式管理会话,每次工具调用仍会创建一个新会话。要管理持久连接, 请参阅
stateful sessions。有状态会话
默认情况下,MultiServerMCPClient 是无状态的——每次工具调用都会创建一个新的 MCP 会话,执行完成后即清理。
如果您需要控制 MCP 会话的生命周期(例如与跨多次工具调用保持上下文的有状态服务器协作),可以通过 client.session() 创建持久化的 ClientSession。
Using MCP ClientSession for stateful tool usage
核心功能
工具
工具允许 MCP 服务器暴露可执行函数,供 LLM 调用以执行动作——例如查询数据库、调用 API 或与外部系统交互。LangChain 会将 MCP 工具转换为 LangChain tools,使其可直接用于任何 LangChain 代理或工作流。加载工具
使用client.get_tools() 从 MCP 服务器检索工具,并将其传递给您的代理:
结构化内容
MCP 工具可以在可读文本响应之外返回结构化内容。当工具除了提供给模型显示的文本外,还需要返回机器可解析的数据(如 JSON)时,这一特性非常有用。 当 MCP 工具返回structuredContent 时,适配器会将其封装为 MCPToolArtifact,并作为工具的 artifact 返回。您可以通过 ToolMessage 上的 artifact 字段访问它。您还可以使用 interceptors 自动处理或转换结构化内容。
从 artifact 提取结构化内容
调用代理后,您可以从响应中的工具消息中访问结构化内容:
多模态工具内容
MCP 工具可以在响应中返回多模态内容(图像、文本等)。当 MCP 服务器返回包含多个部分的内容(例如文本与图像)时,适配器会将其转换为 LangChain 的标准内容块。您可以通过ToolMessage 的 content_blocks 属性访问标准化后的表示:
资源
资源允许 MCP 服务器暴露可供客户端读取的数据——例如文件、数据库记录或 API 响应。LangChain 会将 MCP 资源转换为 Blob 对象,为文本与二进制内容提供统一的处理接口。加载资源
使用client.get_resources() 从 MCP 服务器加载资源:
load_mcp_resources 以获得更细粒度的控制:
提示模板
提示模板允许 MCP 服务器暴露可复用的提示模板,客户端可检索后直接使用。LangChain 会将 MCP 提示转换为 messages,便于集成到基于聊天的工作流中。加载提示模板
使用client.get_prompt() 从 MCP 服务器加载提示模板:
load_mcp_prompt 以获得更多控制:
高级功能
工具拦截器
MCP 服务器以独立进程运行——它们无法直接访问 LangGraph 运行时信息,例如 store、context 或代理状态。Interceptors 正是为了解决这道鸿沟:它们允许您在 MCP 工具执行期间访问运行时上下文。 Interceptors 还提供类似中间件的工具调用控制能力:您可以修改请求、实现重试、动态添加请求头,甚至直接短路执行。访问运行时上下文
当 MCP 工具在 LangChain 代理(通过create_agent)中使用时,interceptors 可以访问 ToolRuntime 上下文。这样您就能访问工具调用 ID、状态、配置和存储,从而实现读取用户数据、持久化信息和控制代理行为等高级模式。
- 运行时上下文
- 存储
- 状态
- 工具调用 ID
访问调用时传入的用户配置,例如用户 ID、API 密钥或权限信息:
将用户上下文注入 MCP 工具调用
状态更新与命令
Interceptors 可以返回Command 对象来更新代理状态或控制图执行流。这对于跟踪任务进度、在代理之间切换,或提前结束执行非常有用。
标记任务完成并切换代理
Command 并设置 goto="__end__" 可以提前结束执行:
完成后结束代理运行
自定义拦截器
拦截器是包裹工具执行过程的异步函数,可用于请求/响应改写、重试逻辑和其他横切关注点。它们遵循“洋葱模型”:列表中的第一个拦截器位于最外层。 基础模式 拦截器是一个接收请求和处理器(handler)的异步函数。您可以在调用 handler 前修改请求、在调用后修改响应,或完全跳过 handler。基础拦截器模式
request.override() 创建修改后的请求。这种方式遵循不可变模式,不会改动原始请求。
修改工具参数
动态修改请求头
组合多个拦截器
出错重试
带兜底的错误处理
进度通知
为长时间运行的工具执行订阅进度更新:进度回调
CallbackContext 提供:
server_name:MCP 服务器名称tool_name:正在执行的工具名称(在工具调用期间可用)
日志
MCP 协议支持服务器发送 logging 通知。可通过Callbacks 类订阅这些事件。
日志回调
Elicitation(交互补充)
Elicitation 允许 MCP 服务器在工具执行过程中向用户请求额外输入。与一次性提供所有输入不同,服务器可以按需进行交互式提问。服务器端设置
定义一个工具,使用ctx.elicit() 按 schema 请求用户输入:
带 elicitation 的 MCP 服务器
客户端设置
通过为MultiServerMCPClient 提供回调函数来处理 elicitation 请求:
处理 elicitation 请求
响应动作
elicitation 回调可以返回以下三种动作之一:| 动作 | 说明 |
|---|---|
accept | 用户提供了有效输入。请在 content 字段中附带数据。 |
decline | 用户选择不提供所请求的信息。 |
cancel | 用户完全取消本次操作。 |
响应动作示例
更多资源
将这些文档 通过 MCP 连接到 Claude、VSCode 等工具,
获取实时答案。

