langchain-mcp-adapters 库调用 MCP 服务器上定义的工具。
快速开始
安装langchain-mcp-adapters 库:
langchain-mcp-adapters 使代理能够使用一个或多个 MCP 服务器中定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建新的 MCP ClientSession,执行工具,然后清理资源。更多详情请参阅 stateful sessions 部分。访问多个 MCP 服务器
自定义服务器
如需创建自定义 MCP 服务器,请使用 FastMCP 库:传输方式
MCP 支持用于客户端和服务器通信的不同传输机制。HTTP
http 传输方式(也称为 streamable-http)使用 HTTP 请求进行客户端和服务器通信。更多详情请参阅 MCP HTTP transport specification。
传递 headers
通过 HTTP 连接到 MCP 服务器时,可以在连接配置中使用headers 字段包含自定义 headers,例如用于认证或追踪。sse(已被 MCP 规范弃用)和 streamable_http 传输都支持此能力。
使用 MultiServerMCPClient 传递 headers
认证
langchain-mcp-adapters 库底层使用官方 MCP SDK,因此你可以通过实现 httpx.Auth 接口来提供自定义认证机制。
stdio
客户端将服务器作为子进程启动,并通过标准输入/输出通信。该方式最适合本地工具和简单设置。与 HTTP 传输不同,
stdio 连接本质上是有状态的:子进程会在客户端连接生命周期内持续存在。但是,如果使用 MultiServerMCPClient 且没有显式会话管理,每次工具调用仍会创建新会话。如需管理持久连接,请参阅 stateful sessions。有状态会话
默认情况下,MultiServerMCPClient 是无状态的:每次工具调用都会创建新的 MCP 会话,执行工具,然后清理资源。
如果需要控制 MCP 会话的 lifecycle,例如使用会在工具调用之间维护上下文的有状态服务器,可以使用 client.session() 创建持久 ClientSession。
使用 MCP ClientSession 进行有状态工具调用
核心功能
Tools
Tools 允许 MCP 服务器暴露可执行函数,LLM 可以调用这些函数来执行操作,例如查询数据库、调用 API 或与外部系统交互。LangChain 会将 MCP tools 转换为 LangChain tools,使其可直接用于任何 LangChain 代理或工作流。加载 tools
使用client.get_tools() 从 MCP 服务器获取 tools,并将其传给代理:
结构化内容
MCP tools 可以在面向人类可读的文本响应之外返回 structured content。当工具需要返回机器可解析数据(例如 JSON),并同时向模型展示文本时,这很有用。 当 MCP tool 返回structuredContent 时,adapter 会将其包装为 MCPToolArtifact,并作为工具的 artifact 返回。你可以通过 ToolMessage 上的 artifact 字段访问它。也可以使用 interceptors 自动处理或转换结构化内容。
从 artifact 中提取结构化内容
调用代理后,可以从响应中的工具消息访问结构化内容:
多模态工具内容
MCP tools 可以在响应中返回 multimodal content,例如图像和文本。当 MCP 服务器返回包含多个部分的内容(例如文本和图像)时,adapter 会将其转换为 LangChain 的 standard content blocks。你可以通过ToolMessage 上的 content_blocks 属性访问标准化表示:
Resources
Resources 允许 MCP 服务器暴露客户端可读取的数据,例如文件、数据库记录或 API 响应。LangChain 会将 MCP resources 转换为 Blob 对象,该对象为处理文本和二进制内容提供统一接口。加载 resources
使用client.get_resources() 从 MCP 服务器加载 resources:
load_mcp_resources,以获得更多控制:
Prompts
Prompts 允许 MCP 服务器暴露可由客户端获取和使用的可复用 prompt 模板。LangChain 会将 MCP prompts 转换为 messages,便于集成到基于聊天的工作流中。加载 prompts
使用client.get_prompt() 从 MCP 服务器加载 prompt:
load_mcp_prompt,以获得更多控制:
高级功能
Tool interceptors
MCP 服务器作为独立进程运行,无法访问 LangGraph runtime 信息,例如 store、context 或代理状态。Interceptors 会弥合这一差距,让你在 MCP 工具执行期间访问这些 runtime context。 Interceptors 还提供类似 middleware 的工具调用控制能力:可以修改请求、实现重试、动态添加 headers,或完全短路执行。| Section | Description |
|---|---|
| Accessing runtime context | 读取用户 ID、API keys、store 数据和代理状态 |
| State updates and commands | 使用 Command 更新代理状态或控制图流 |
| Writing interceptors | 修改请求、组合 interceptors 和错误处理的模式 |
访问 runtime context
在 LangChain 代理中(通过create_agent)使用 MCP tools 时,interceptors 可以访问 ToolRuntime context。这会提供 tool call ID、state、config 和 store 访问能力,从而支持访问用户数据、持久化信息和控制代理行为等强大模式。
- Runtime context
- Store
- State
- Tool call ID
访问调用时传入的用户专属配置,例如用户 ID、API keys 或权限:
Inject user context into MCP tool calls
状态更新和 commands
Interceptors 可以返回Command 对象来更新代理状态或控制图执行流。这对于追踪任务进度、在代理之间切换或提前结束执行很有用。
将任务标记为完成并切换代理
goto="__end__" 的 Command 可以提前结束执行:
完成后结束代理运行
自定义 interceptors
Interceptors 是包装工具执行的异步函数,可用于修改请求/响应、实现重试逻辑,以及处理其他横切关注点。它们遵循“洋葱”模式,列表中的第一个 interceptor 是最外层。 基础模式 Interceptor 是一个接收 request 和 handler 的异步函数。你可以在调用 handler 前修改请求,在调用后修改响应,或完全跳过 handler。基础 interceptor 模式
request.override() 创建修改后的请求。这遵循不可变模式,不会改变原始请求。
修改工具参数
动态修改 header
组合多个 interceptors
出错时重试
使用 fallback 处理错误
进度通知
订阅长时间运行工具执行的进度更新:进度 callback
CallbackContext 提供:
server_name:MCP 服务器名称tool_name:正在执行的工具名称(在工具调用期间可用)
Logging
MCP 协议支持来自服务器的 logging 通知。使用Callbacks 类订阅这些事件。
Logging callback
Elicitation
Elicitation 允许 MCP 服务器在工具执行期间向用户请求额外输入。服务器不必预先要求所有输入,而是可以按需交互式请求信息。服务器设置
定义一个使用ctx.elicit() 按 schema 请求用户输入的工具:
带 elicitation 的 MCP 服务器
客户端设置
通过向MultiServerMCPClient 提供 callback 来处理 elicitation 请求:
处理 elicitation 请求
响应动作
Elicitation callback 可以返回三种动作之一:| Action | Description |
|---|---|
accept | 用户提供了有效输入。请在 content 字段中包含数据。 |
decline | 用户选择不提供所请求的信息。 |
cancel | 用户完全取消了操作。 |
响应动作示例
其他资源
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

