Skip to main content
模型上下文协议 (MCP) 是一个开放协议,它标准化了应用程序如何向大语言模型提供工具和上下文。LangChain 代理可以使用 langchain-mcp-adapters 库来使用在 MCP 服务器上定义的工具。

快速开始

安装 langchain-mcp-adapters 库:
langchain-mcp-adapters 使代理能够使用在一个或多个 MCP 服务器上定义的工具。
MultiServerMCPClient 默认是无状态的。每次工具调用都会创建一个新的 MCP ClientSession,执行工具,然后进行清理。有关更多详细信息,请参阅有状态会话部分。
访问多个 MCP 服务器

自定义服务器

要创建自定义 MCP 服务器,请使用 FastMCP 库:
要使用 MCP 工具服务器测试您的代理,请使用以下示例:

传输机制

MCP 支持不同的传输机制用于客户端-服务器通信。

HTTP

http 传输(也称为 streamable-http)使用 HTTP 请求进行客户端-服务器通信。有关更多详细信息,请参阅 MCP HTTP 传输规范

传递头部信息

通过 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 服务器暴露可执行函数,大语言模型可以调用这些函数来执行操作——例如查询数据库、调用 API 或与外部系统交互。LangChain 将 MCP 工具转换为 LangChain 工具,使它们可以直接在任何 LangChain 代理或工作流中使用。

加载工具

使用 client.get_tools() 从 MCP 服务器检索工具并将其传递给您的代理:

结构化内容

MCP 工具可以在人类可读的文本响应之外返回结构化内容。当工具需要返回机器可解析的数据(如 JSON)以及显示给模型的文本时,这非常有用。 当 MCP 工具返回 structuredContent 时,适配器会将其包装在 MCPToolArtifact 中,并将其作为工具的工件返回。您可以使用 ToolMessage 上的 artifact 字段访问此内容。您也可以使用拦截器来自动处理或转换结构化内容。 从工件中提取结构化内容 调用代理后,您可以从响应中的工具消息访问结构化内容:
通过拦截器附加结构化内容 如果您希望结构化内容在对话历史中可见(对模型可见),您可以使用拦截器自动将结构化内容附加到工具结果:

多模态工具内容

MCP 工具可以在其响应中返回多模态内容(图像、文本等)。当 MCP 服务器返回包含多个部分的内容(例如文本和图像)时,适配器会将它们转换为 LangChain 的标准内容块。您可以通过 ToolMessage 上的 content_blocks 属性访问标准化的表示:
这允许您以与提供者无关的方式处理多模态工具响应,无论底层 MCP 服务器如何格式化其内容。

资源

资源允许 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、API 密钥或权限:
将用户上下文注入 MCP 工具调用
有关更多上下文工程模式,请参阅上下文工程工具

状态更新和命令

拦截器可以返回 Command 对象来更新代理状态或控制图执行流程。这对于跟踪任务进度、在代理之间切换或提前结束执行非常有用。
标记任务完成并切换代理
使用 Commandgoto="__end__" 可以提前结束执行:
在完成时结束代理运行

自定义拦截器

拦截器是包装工具执行的异步函数,支持请求/响应修改、重试逻辑和其他横切关注点。它们遵循“洋葱”模式,其中列表中的第一个拦截器是最外层。 基本模式 拦截器是一个异步函数,接收一个请求和一个处理程序。您可以在调用处理程序之前修改请求,在之后修改响应,或者完全跳过处理程序。
基本拦截器模式
修改请求 使用 request.override() 创建修改后的请求。这遵循不可变模式,原始请求保持不变。
修改工具参数
在运行时修改头部 拦截器可以根据请求上下文动态修改 HTTP 头部:
动态头部修改
组合拦截器 多个拦截器按“洋葱”顺序组合——列表中的第一个拦截器是最外层:
组合多个拦截器
错误处理 使用拦截器捕获工具执行错误并实现重试逻辑:
出错时重试
您还可以捕获特定的错误类型并返回回退值:
带回退的错误处理

进度通知

订阅长时间运行的工具执行的进度更新:
进度回调
CallbackContext 提供:
  • server_name:MCP 服务器的名称
  • tool_name:正在执行的工具的名称(在工具调用期间可用)

日志记录

MCP 协议支持来自服务器的日志记录通知。使用 Callbacks 类订阅这些事件。
日志记录回调

引导

引导允许 MCP 服务器在工具执行期间向用户请求额外的输入。服务器无需预先要求所有输入,而是可以根据需要交互式地询问信息。

服务器设置

定义一个使用 ctx.elicit() 通过模式请求用户输入的工具:
带有引导的 MCP 服务器

客户端设置

通过向 MultiServerMCPClient 提供回调来处理引导请求:
处理引导请求

响应操作

引导回调可以返回以下三种操作之一:
响应操作示例

附加资源