MCP in LangChain:无状态协议、Elicitation 与更多特性
LangChain 官方博客发布了关于 MCP(Model Context Protocol)在 LangChain 中集成的最新进展。文章介绍了 MCP 的采用情况、LangChain 中的无状态协议实现、Elicitation(启发式)机制以及其他重要特性。
MCP 的快速增长
MCP 正在经历爆发式增长:
- MCP 官方 Tier 1 SDK 的月下载量接近 5 亿次
- ChatGPT 用户的 MCP 工具调用量增长了 98 倍
- 越来越多的 AI 应用和平台开始支持 MCP 协议
MCP 已经成为 AI 代理(Agent)与外部工具和数据源交互的事实标准协议。它定义了一套标准化的接口,让 AI 模型可以统一地调用各种工具、查询数据源和执行操作。
什么是 MCP
MCP(Model Context Protocol)是由 Anthropic 发起的开放协议,旨在标准化 AI 模型与外部工具之间的交互方式。
核心概念
MCP 的核心概念包括:
- Server(服务器):提供工具和资源的服务端,每个 Server 可以暴露多个工具
- Client(客户端):AI 应用或代理,通过 MCP 协议连接 Server 并调用工具
- Tools(工具):Server 暴露的可调用函数,AI 模型可以调用它们执行操作
- Resources(资源):Server 提供的数据资源,AI 模型可以读取它们获取上下文
- Prompts(提示):Server 提供的预定义提示模板,AI 模型可以使用它们
协议架构
MCP 采用客户端-服务器架构,基于 JSON-RPC 2.0 协议进行通信。传输层支持:
- Stdio:通过标准输入/输出进行通信(适合本地工具)
- HTTP/SSE:通过 HTTP 和 Server-Sent Events 进行通信(适合远程服务)
- WebSocket:通过 WebSocket 进行双向通信
LangChain 中的 MCP 集成
LangChain 作为最流行的 AI 代理框架之一,深度集成了 MCP 协议。
无状态协议(Stateless Protocol)
LangChain 中的 MCP 实现采用了无状态协议设计。这意味着:
- 无会话状态:MCP 客户端不维护与 Server 的会话状态,每次调用都是独立的
- 可扩展性:无状态设计使得水平扩展变得容易,可以在多个实例之间负载均衡
- 容错性:如果某个 MCP Server 实例失败,可以无缝切换到另一个实例
- 简化部署:不需要管理会话亲和性(session affinity),部署更加简单
无状态协议的实现方式是:每次工具调用时,客户端重新建立连接或使用无状态的 HTTP 调用,不依赖之前的会话上下文。
Elicitation(启发式)机制
Elicitation 是 MCP 中的一个重要特性,它允许 Server 主动向 AI 模型提供信息和建议,而不仅仅是被动响应调用。
Elicitation 的工作方式:
- Server 可以在响应中包含额外的提示和建议
- 这些提示会被注入到 AI 模型的上下文中
- AI 模型可以根据这些提示做出更好的决策
例如,一个数据库 MCP Server 可以在返回查询结果的同时,提示 AI 模型"这个查询结果可能不完整,建议使用更宽泛的查询条件"。
Elicitation 使得 MCP Server 不仅仅是被动的工具提供者,还可以成为主动的协作者,帮助 AI 模型更好地使用工具。
工具调用的优化
LangChain 对 MCP 工具调用进行了多项优化:
- 批量工具调用:支持在一个请求中调用多个工具,减少网络往返
- 工具结果缓存:对相同参数的工具调用结果进行缓存,避免重复调用
- 异步工具调用:支持异步调用工具,提高并发性能
- 工具调用超时:为每个工具调用设置超时,避免长时间阻塞
- 错误重试:对可重试的错误自动重试,提高可靠性
资源和提示的支持
除了工具调用,LangChain 还支持 MCP 的资源和提示功能:
- 资源读取:AI 代理可以读取 MCP Server 提供的资源,将其作为上下文
- 提示使用:AI 代理可以使用 MCP Server 提供的预定义提示模板
- 资源变更通知:当资源发生变更时,Server 可以通知客户端更新缓存
实际使用示例
连接 MCP Server
from langchain_mcp import MCPToolkit
# 连接到本地 MCP Server(通过 stdio)
toolkit = MCPToolkit.from_stdio(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/files"]
)
# 获取所有工具
tools = toolkit.get_tools()
在代理中使用 MCP 工具
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
result = agent_executor.invoke({
"input": "读取项目中的 README.md 文件"
})
使用 Elicitation
# MCP Server 可以在工具响应中包含 elicitation
response = {
"content": [{"type": "text", "text": "查询结果: ..."}],
"elicitation": {
"suggestions": [
"建议检查相关的日志文件",
"这个结果可能需要进一步验证"
]
}
}
MCP 生态的发展
MCP 生态正在快速发展,越来越多的工具和平台开始支持 MCP:
主流 AI 平台支持
- ChatGPT:原生支持 MCP,用户可以直接在 ChatGPT 中使用 MCP 工具
- Claude:Anthropic 作为 MCP 的发起者,深度集成 MCP
- Google Gemini:支持 MCP 工具调用
- Cursor:AI 代码编辑器,支持 MCP 工具
- Windsurf:另一个 AI 代码编辑器,支持 MCP
常见 MCP Server
- 文件系统:读写本地文件
- GitHub:与 GitHub 交互(issues、PR、代码)
- 数据库:查询和操作数据库
- 浏览器:控制浏览器进行网页操作
- Slack:发送和读取 Slack 消息
- Google Drive:管理 Google Drive 文件
- PostgreSQL:查询 PostgreSQL 数据库
- Fetch:获取网页内容
挑战和未来方向
尽管 MCP 发展迅速,但仍面临一些挑战:
- 安全性:MCP 工具可以执行各种操作,需要严格的权限控制和沙箱隔离
- 可靠性:MCP Server 的质量参差不齐,需要错误处理和降级机制
- 标准化:MCP 协议仍在演进中,不同实现之间可能存在兼容性问题
- 性能:大量 MCP 工具调用可能导致延迟,需要优化和缓存
- 可观测性:需要更好的监控和调试工具来追踪 MCP 工具调用
未来方向包括:
- 更完善的权限和安全模型
- 标准化的工具描述和文档
- 更好的错误处理和重试机制
- 支持更复杂的工具组合和工作流
- 与更多 AI 平台和工具的集成
总结
MCP 在 LangChain 中的集成展示了 AI 代理工具调用的标准化趋势。通过无状态协议、Elicitation 机制和工具调用优化,LangChain 为开发者提供了强大而灵活的 MCP 支持。
MCP 的意义在于:
- 标准化:统一了 AI 模型与外部工具的交互方式
- 互操作性:不同 AI 平台和工具之间可以无缝协作
- 生态繁荣:降低了工具开发的门槛,促进了生态的快速发展
- 开发者体验:开发者可以使用统一的接口集成各种工具
对于 AI 应用开发者来说,了解和使用 MCP 已经变得越来越重要。它不仅可以简化工具集成的工作,还可以让 AI 代理访问更广泛的工具和数据源,从而实现更复杂的任务。
原文链接:https://www.langchain.com/blog/mcp-in-langchain-stateless-protocol-elicitation-and-more