使用说明
MCP代理系统
这个项目实现了一个动态代理系统,该系统利用LangChain和LangGraph与模型上下文协议(MCP)服务器集成,以实现智能路由和执行。
特点/特性
- 动态代理流使用LangGraph创建能够根据用户查询动态调整的推理流程
- MCP集成连接到各种MCP服务器(天气、股票、Context7)并发现其工具和资源
- 智能路由利用大型语言模型(LLM)进行路由查询决策,以将查询路由到合适的MCP服务器
- 工具发现自动发现连接到MCP服务器上的可用工具
- 资源发现自动发现连接的MCP服务器上的可用资源
- 元数据管理MCP工具和资源的全面元数据存储与管理
- 标准化工具接口与MCP工具交互的一致性接口
- 缓存层缓存大型语言模型(LLM)的响应以优化交易并降低成本
- Streamlit 前端交互式网页界面,用于可视化代理流量并管理系统
- 数据库准备已准备好与包含结构化元数据的数据库进行集成
建筑学
┌─────────────────┐ ┌────────────────────┐ ┌──────────────────┐
│ Streamlit │ │ Node.js Proxy │ │ MCP Servers │
│ Frontend │◄──►│ Server │◄──►│ │
│ │ │ │ │ ┌─────────────┐ │
│ │ │ ┌─────────────┐ │ │ │ WeatherMCP │ │
│ │ │ │ LangGraph │ │ │ └─────────────┘ │
│ │ │ │ Agents │ │ │ │
│ │ │ ├─────────────┤ │ │ ┌─────────────┐ │
│ │ │ │ LLM Caching │ │ │ │ StocksMCP │ │
│ │ │ ├─────────────┤ │ │ └─────────────┘ │
│ │ │ │ MCP Router │ │ │ │
│ │ │ ├─────────────┤ │ │ ┌─────────────┐ │
│ │ │ │ Tool Reg. │ │ │ │ Context7 │ │
│ │ │ ├─────────────┤ │ │ └─────────────┘ │
│ │ │ │ Metadata │ │ │ │
│ │ │ └─────────────┘ │ └──────────────────┘
└─────────────────┘ └────────────────────┘
组件
后端(Node.js)
- MCP客户端使用不同的传输方式(HTTP、WebSocket、Stdio)连接到各种MCP服务器
- LangGraph 代理动态推理流程,用于决定使用哪种MCP工具
- 大语言模型(LLM)集成通过LangChain集成OpenAI以辅助决策
- 工具注册表使用元数据集中管理MCP工具
- 元数据管理器全面工具和资源元数据的存储与检索
- 缓存系统基于文件的缓存机制,用于大型语言模型(LLM)响应,以优化事务处理
- REST API为前端交互暴露端点
前端(Streamlit)
- 代理流可视化展示代理推理的逐步执行过程
- **MCP Explorer(可译为“MCP浏览器”或根据具体上下文调整为更贴切的名称,如“MCP探索器”等,但“MCP浏览器”较为通用)**显示已连接的MCP服务器及其可用的工具和资源
- 工具注册表查看所有已注册工具的详细视图,包括元数据
- 文档查看器所有MCP工具的综合文档
- 资源浏览器所有可用MCP资源的详细视图
- 缓存管理器允许查看和清除缓存的大语言模型(LLM)响应
设置
-
安装后端依赖项:
cd backend npm install -
安装前端依赖项:
cd frontend pip install -r requirements.txt -
设置环境变量: 创建一个
.env后端目录中的文件包含您的API密钥:OPENAI_API_KEY=your_openai_api_key -
运行后端服务器:
cd backend npm run dev -
运行前端:
cd frontend streamlit run main.py
API终端点
GET /mcp/servers- 列出已连接的MCP服务器GET /mcp/tools- 在所有MCP服务器上发现工具GET /mcp/resources- 发现所有MCP服务器上的资源GET /mcp/metadata- 获取所有MCP服务器的全面元数据POST /mcp/query- 在MCP服务器上执行一个工具POST /mcp/tool-details- 获取特定工具的详细信息POST /mcp/resource-details- 获取特定资源的详细信息POST /reasoning/execute- 执行完整的代理推理流程GET /tools/registry- 获取所有带有元数据的已注册工具GET /tools/signatures- 获取用于大型语言模型(LLM)提示的工具签名GET /tools/documentation- 获取全面的工具文档POST /tools/refresh- 刷新工具注册表GET /metadata/database-structure- 获取适用于数据库的元数据结构GET /cache/stats- 获取缓存统计信息POST /cache/clear- 清除大型语言模型(LLM)的响应缓存
项目结构
.
├── backend/
│ ├── agentic/
│ │ ├── flow.js # LangGraph agent implementation
│ │ └── reasoning.js # Reasoning flow execution
│ ├── mcp/
│ │ ├── discovery.js # MCP tool and resource discovery
│ │ ├── index.js # MCP exports
│ │ ├── client.js # MCP client connections
│ │ ├── ai.js # LLM integration with caching
│ │ ├── router.js # Query routing
│ │ ├── toolInterface.js # Standardized tool interface
│ │ └── toolRegistry.js # Tool registry management
│ ├── metadata/
│ │ └── manager.js # Metadata storage and management
│ ├── utils/
│ │ └── cache.js # LLM response caching
│ ├── server.js # Main server with enhanced endpoints
│ └── package.json # Dependencies
├── frontend/
│ ├── main.py # Streamlit interface
│ └── requirements.txt # Python dependencies
├── tasks.py # Project tasks
└── README.md # Project documentation
已实现的关键特性
- 动态代理流基于LangGraph的代理,能够根据用户查询动态决定使用哪种MCP工具
- 工具与资源发现自动发现连接的MCP服务器上可用的工具和资源
- 全面的元数据管理工具和资源的丰富元数据存储,包括参数、返回类型、示例、使用信息和分类
- 标准化接口在不同服务器上与MCP工具交互时保持一致的接口
- 智能路由利用大型语言模型(LLM)进行路由查询决策,将其分配到合适的MCP服务器
- 缓存层基于文件的缓存机制用于大型语言模型(LLM)响应,以优化交易并降低成本
- 可视化用于可视化智能体推理过程和全面元数据的Streamlit前端
- 数据库准备结构化元数据,已准备好进行数据库集成
- 可扩展性模块化设计,便于添加新的MCP服务器、工具和资源
它是如何工作的
- 用户通过Streamlit前端提交查询
- 查询被发送给LangGraph代理进行处理
- 代理使用大型语言模型(LLM)来决定将查询路由到哪个MCP服务器
- 代理发现选定MCP服务器上的可用工具和资源
- 代理根据查询选择最合适的工具
- 代理执行工具并处理结果
- 代理使用大型语言模型(LLM)生成最终回复
- 所有大型语言模型(LLM)的响应都被缓存起来,以优化未来的交易处理
- 整个过程在前端可视化展示,以确保透明度
这一实现为一个代理型MCP(可能是指某种多智能体或模块化计算平台)系统提供了完整的基础,该系统能够动态适应用户查询,并通过缓存优化大语言模型(LLM)的使用。该系统已准备好集成数据库,并且未来可以轻松对接实际的MCP服务器。