LangChain激发MCP
本项目演示了如何使用人机交互(HITL)模式在LangChain/LangGraph代理中处理MCP(模型上下文协议)启发请求。
安装
- 使用安装依赖项
uv:
uv sync- 设置环境变量:
创建一个 .env 使用您的OpenAI API密钥在项目根目录中创建文件:
OPENAI_API_KEY=your_api_key_here概述
该项目实现了一个航班搜索服务,演示了MCP启发。在搜索国际航班时,服务器通过MCP启发协议请求额外的旅行者信息(护照详细信息)。客户端使用LangGraph的中断机制来处理这些请求,以暂停执行并收集用户输入。
架构:如何处理MCP激励
服务器端(flights_mcp_service.py)
MCP服务器公开了一个 flight_search 该工具:
- 检查航班是否为国际航班(跨越国界)
- 如果是国际性的,则使用以下方式触发启发
ctx.elicit():
elicitation_result = await ctx.elicit(
message="Please enter your passport id",
schema=TravellerInformation
)- 使用收集到的数据来丰富签证要求的航班结果
客户端(client_langchain_adapters.py)
客户端实现了一个复杂的启发式处理系统,主要由三个部分组成:
1. 急救HITLMiddleware
- 在代理级别拦截工具调用
- 通过检查挂起的模式来检测何时需要启发
- 使用LangGraph的
interrupt()暂停执行并收集用户输入 - 处理简单的文本提示和基于结构化模式的输入
- 根据请求的架构验证用户输入
- 管理数据提交的确认流程
2. MCP激发回拨(handle_elicitation)
- 直接从MCP服务器接收启发请求
- 将模式存储为共享状态,供中间件处理
- 等待中间件通过收集用户输入
interrupt() - 将收集到的数据返回给服务器
3. 复苏状态(共享状态)
- 协调中间件和MCP回调之间的通信
- 使用异步锁来确保线程安全的状态管理
- 跟踪待处理的模式、结果和已处理的启发
流程图
flowchart TD
A[LangChain Agent
Tool Call] --> B[ElicitationHITLMiddleware
Intercepts tool call
Checks for pending schema]
B --> C[MCP Client Session
Executes tool]
C --> D[MCP Server
flight_search tool
Detects int'l flight
Calls ctx.elicit]
D --> E[handle_elicitation callback
Receives schema
Stores in shared state]
E --> F[Middleware detects schema
Calls interrupt
Graph pauses execution]
F --> G[User provides input
via Command resume]
G --> H[Middleware validates & stores result]
H --> I[Callback returns result to server]
I --> J[Server continues with
enriched flight data]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#e1f5ff
style D fill:#ffe1f5
style E fill:#e1ffe1
style F fill:#fff4e1
style G fill:#f5e1ff
style H fill:#fff4e1
style I fill:#e1ffe1
style J fill:#ffe1f5主要特点
- 非阻塞架构:中间件和回调协同工作,在不阻塞代理执行流的情况下处理启发
- 架构验证:用户输入在发送到服务器之前,会根据请求的JSON模式进行验证
- 确认流程:包括提交前确保数据准确性的确认步骤
- 错误处理:优雅地处理用户取消、拒绝和验证错误
- LangGraph集成:使用LangGraph的原生语言
interrupt()HITL相互作用机制
用法
运行MCP服务器
uv run flights_mcp_service.py服务器将于启动 http://localhost:8000/mcp
运行客户端
uv run client_langchain_adapters.py或者使用LangGraph CLI:
langgraph dev交互示例
当代理搜索国际航班时(例如ATL→ CUN),它将:
- 检测到需要启发
- 使用暂停执行
interrupt() - 提示用户输入护照信息
- 验证并确认输入
- 使用收集的数据恢复执行
- 带签证要求的回程航班结果
MCP检查员
您可以使用MCP检查器检查MCP服务器:
npx @modelcontextprotocol/inspectorVS代码配置
要将此MCP服务器与VS Code Copilot一起使用,请添加到您的VS Code设置中:
{
"servers": {
"flight-search-mcp-service": {
"url": "http://localhost:8000/mcp",
"type": "http"
}
},
"inputs": []
}