MCP LangChain聊天机器人
一个对话式AI聊天机器人,将Workato的模型上下文协议(MCP)服务器与LangChain集成在一起,实现了与Workato数据和工具的自然语言交互。
项目概述
该项目创建了一个智能聊天机器人,可以与Workato的MCP服务器交互,查询客户数据、检索配方详细信息、访问帐户信息并执行数据分析。聊天机器人使用LangChain进行代理编排,使用OpenAI的GPT模型进行自然语言理解。
文件结构和描述
main.py
目的: 主要入口点和应用程序编排器
责任:
- 启动时验证配置
- 初始化MCP客户端连接
- 加载可用的MCP工具
- 创建和管理聊天代理
- 处理主对话循环(用户输入/输出)
- 通过用户友好的消息提供错误处理
- 显示欢迎消息并处理优雅关机
主要功能:
main():编排整个应用程序流print_welcome():显示启动信息handle_error():提供上下文错误消息
______________________________________________________________________
config.py
目的: 集中式配置管理
责任:
- 从加载环境变量
.env文件使用python-dotenv - 定义所有应用程序设置(API密钥、服务器URL、LLM参数)
- 包含指导代理行为的系统提示
- 验证是否存在所需的配置值
关键配置:
- API密钥(OpenAI、Workato MCP)
- MCP服务器URL
- LLM型号设置(型号名称、温度)
- 代理行为设置(详细程度、最大迭代次数)
- AI代理的系统提示
主要功能:
validate_config():确保设置了所有必需的环境变量
______________________________________________________________________
mcp_client.py
目的: 用于与Workato MCP服务器通信的HTTP客户端
责任:
- 与MCP服务器建立经过身份验证的连接
- 从MCP服务器发现可用工具
- 使用正确的请求格式执行工具调用
- 处理MCP协议特定的响应解析
- 管理身份验证标头和请求超时
关键类别:
MCPClient:处理所有MCP服务器交互
关键方法:
discover_tools():从MCP服务器检索可用工具列表call_tool():使用给定的参数执行特定的工具
______________________________________________________________________
tools.py
目的: MCP工具和LangChain工具之间的桥梁
责任:
- 将MCP工具定义转换为LangChain
Tool物体 - 将MCP工具调用封装在与LangChain兼容的函数中
- 加载并注册代理的所有可用MCP工具
- 提供工具发现和加载功能
主要功能:
create_langchain_tool_from_mcp():将单个MCP工具转换为LangChain格式load_mcp_tools():发现并加载所有MCP工具作为LangChain工具
为什么存在: LangChain代理需要特定格式的工具,因此此模块将MCP工具定义转换为LangChain期望的格式。
______________________________________________________________________
agent.py
目的: 管理对话式AI代理
责任:
- 使用OpenAI的聊天模型创建和配置LangChain代理
- 管理对话历史和消息存储
- 处理代理的决策过程(工具选择和执行)
- 处理用户消息并生成代理响应
- 将代理与可用的MCP工具集成
关键类别:
ChatAgent:封装代理和对话管理
关键方法:
_create_conversation():使用工具和系统提示设置LangChain代理chat():处理用户输入并返回代理响应
主要特点:
- 维护多个回合的对话历史记录
- 使用LangChain的
create_agent用于现代代理创建的API - 与OpenAI的ChatOpenAI模型集成
______________________________________________________________________
requirements.txt
目的: Python包依赖关系
依赖关系:
langchain:用于代理编排的核心LangChain框架langchain-openai:LangChain的OpenAI集成langchain-community:社区贡献的LangChain组件(聊天消息历史记录)python-dotenv:环境变量管理requests:用于MCP服务器通信的HTTP客户端
______________________________________________________________________
文件如何相互关联
应用流
┌─────────────┐
│ main.py │ ← Entry point: Orchestrates everything
└──────┬──────┘
│
├──→ config.py ────────────┐
│ (validates config) │
│ │
├──→ mcp_client.py ────────┤
│ (creates client) │
│ │
├──→ tools.py ──────────────┤
│ (loads MCP tools) │ All modules use
│ │ config.py for settings
├──→ agent.py ──────────────┤
│ (creates agent) │
│ │
└──→ (conversation loop) │
│
┌──────────────────────────────────┘
│
│ Dependencies:
│ - tools.py uses mcp_client.py
│ - agent.py uses tools.py
│ - main.py uses all modules
│ - All modules use config.py详细关系
main.py→config.py
- 呼叫 validate_config() 确保环境设置得当 - 导入配置常量(不直接使用,但可用)
main.py→mcp_client.py
- 创建一个 MCPClient 连接到Workato MCP服务器的实例
main.py→tools.py
- 呼叫 load_mcp_tools() 使用MCP客户端获取LangChain工具
main.py→agent.py
- 创建一个 ChatAgent 带有加载工具的实例 - 呼叫 chat() 会话循环中的方法
tools.py→mcp_client.py
- 用途 MCPClient 发现工具(discover_tools()) - 用途 MCPClient 执行工具调用(通过包装器函数)
agent.py→config.py
- 导入LLM设置(型号、温度) - 导入代理配置(详细,最大迭代次数) - 导入系统提示
mcp_client.py→config.py
- 导入MCP服务器URL和API密钥以进行身份验证
数据流示例
当用户提出问题时:
main.py接收用户输入main.py电话chat_agent.chat(user_input)agent.py通过LangChain代理处理消息agent.py决定使用哪种工具(如果有的话)tools.py调用包装器函数mcp_client.py向MCP服务器发出HTTP请求mcp_client.py返回结果tools.py将结果返回给代理agent.py格式化响应并返回main.pymain.py向用户显示响应
配置依赖关系
所有模块都依赖于 config.py 用于:
- API密钥和身份验证
- 服务器URL
- LLM参数
- 代理行为设置
这种集中化使得在不涉及业务逻辑的情况下修改设置变得容易。
用法
- 在中设置环境变量
.env:
- OPENAI_API_KEY - WORKATO_MCP_API_KEY - MCP_SERVER_URL
- 安装依赖项:
pip install -r requirements.txt- 运行应用程序:
python main.py- 与终端中的聊天机器人交互。类型
quit退出。
架构模式
该项目遵循 分层架构:
- 表示层:
main.py(用户交互) - 业务逻辑层:
agent.py(对话管理) - 集成层:
tools.py,mcp_client.py(外部服务集成) - 配置层:
config.py(设置管理)
每一层都有明确的责任和依赖关系流向一个方向,使代码库可维护和可测试。
