langchain-mcp-adapters 库来调用 MCP 服务器上定义的工具。
快速入门
安装langchain-mcp-adapters 库:
langchain-mcp-adapters 使智能体能够使用一个或多个 MCP 服务器上定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建一个新的 MCP ClientSession,执行工具,然后清理。有关更多详细信息,请参阅有状态会话部分。访问多个 MCP 服务器
自定义服务器
要创建自定义 MCP 服务器,请使用 FastMCP 库:传输机制
MCP 支持不同的客户端-服务器通信传输机制。HTTP
http 传输(也称为 streamable-http)使用 HTTP 请求进行客户端-服务器通信。更多详细信息,请参阅 MCP HTTP 传输规范。
对于你自己运行的服务器,请使用本地 URL;对于托管服务器,可以使用类似 LangChain 文档 MCP 服务器(https://docs.langchain.com/mcp)这样的公开 URL,该服务器无需 API 密钥。
传递请求头
通过 HTTP 连接到 MCP 服务器时,你可以使用连接配置中的headers 字段包含自定义请求头(例如,用于认证或追踪)。这支持 sse(已被 MCP 规范弃用)和 streamable_http 传输。
使用 MultiServerMCPClient 传递请求头
认证
langchain-mcp-adapters 库底层使用了官方 MCP SDK,它允许你通过实现 httpx.Auth 接口来提供自定义认证机制。
stdio
客户端作为子进程启动服务器,并通过标准输入/输出进行通信。最适合本地工具和简单配置。与 HTTP 传输不同,
stdio 连接本质上是有状态的:子进程会在客户端连接的整个生命周期内持续存在。但是,在未显式管理会话的情况下使用 MultiServerMCPClient 时,每次工具调用仍然会创建一个新会话。有关管理持久连接的信息,请参阅有状态会话。有状态会话
默认情况下,MultiServerMCPClient 是无状态的:每次工具调用都会创建一个新的 MCP 会话,执行工具,然后清理。
如果你需要控制 MCP 会话的生命周期(例如,在与跨工具调用维护上下文的有状态服务器交互时),你可以使用 client.session() 创建一个持久的 ClientSession。
使用 MCP ClientSession 进行有状态工具调用
核心功能
工具
工具允许 MCP 服务器暴露可执行函数,LLM 可以调用这些函数来执行操作——例如查询数据库、调用 API 或与外部系统交互。LangChain 将 MCP 工具转换为 LangChain 工具,使其可以直接在任何 LangChain 智能体或工作流中使用。加载工具
使用client.get_tools() 从 MCP 服务器检索工具并将其传递给你的智能体:
status="error" 的工具消息返回给模型,而不是引发异常。这使得智能体可以读取错误并重试。要改为引发异常,请在 MultiServerMCPClient 或 load_mcp_tools 上设置 handle_tool_errors=False。
这仅适用于工具执行错误 (CallToolResult(isError=True))。传输、会话和内容转换失败总是会引发异常。
将 MCP 工具错误作为失败的工具消息返回需要
langchain-mcp-adapters>=0.3.0。较早的版本会引发 ToolException。结构化内容
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 工具执行期间能够访问此运行时上下文。 拦截器还提供了类似中间件的对工具调用的控制:你可以修改请求、实现重试、动态添加请求头,或者完全短路执行。访问运行时上下文
当在 LangChain 智能体内(通过create_agent)使用 MCP 工具时,拦截器会接收到 ToolRuntime 上下文的访问权限。这提供了对工具调用 ID、状态、配置和存储的访问权限——从而实现了访问用户数据、持久化信息和控制智能体行为的强大模式。
- 运行时上下文
- 存储
- 状态
- 工具调用 ID
访问在调用时传递的用户特定配置,例如用户 ID、API 密钥或权限:
将用户上下文注入 MCP 工具调用
状态更新和命令
拦截器可以返回Command 对象来更新智能体状态或控制图执行流程。这对于跟踪任务进度、在智能体之间切换或提前结束执行非常有用。
标记任务完成并切换智能体
Command 并设置 goto="__end__" 来提前结束执行:
完成时结束智能体运行
自定义拦截器
拦截器是包装工具执行的异步函数,可以实现请求/响应修改、重试逻辑和其他横切关注点。它们遵循“洋葱”模式,列表中的第一个拦截器是最外层。 基本模式 拦截器是一个接收请求和处理程序的异步函数。你可以在调用处理程序之前修改请求,之后修改响应,或者完全跳过处理程序。基本拦截器模式
request.override() 创建一个修改后的请求。这遵循不可变模式,原始请求保持不变。
修改工具参数
动态修改请求头
组合多个拦截器
CallToolResult(isError=True)) 默认不会引发异常,因此捕获异常的拦截器永远不会被触发。要将它们作为异常捕获,请设置 handle_tool_errors=False。
出错时重试
带回退的错误处理
进度通知
订阅长时间运行的工具执行的进度更新:进度回调
CallbackContext 提供:
server_name:MCP 服务器的名称tool_name:正在执行的工具的名称(在工具调用期间可用)
日志记录
MCP 协议支持来自服务器的日志记录通知。使用Callbacks 类来订阅这些事件。
日志记录回调
引导
引导允许 MCP 服务器在工具执行期间向用户请求额外的输入。服务器无需预先要求所有输入,可以在需要时交互式地请求信息。服务器设置
定义一个使用ctx.elicit() 来根据架构请求用户输入的工具:
带引导的 MCP 服务器
客户端设置
通过为MultiServerMCPClient 提供回调来处理引导请求:
处理引导请求
响应操作
引导回调可以返回三种操作之一:响应操作示例
其他资源
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

