网页抓取编排系统

Agno MCP编排系统是一个基于模型上下文协议(MCP)的网页数据抓取框架,具有自动回退机制和全面的日志记录功能,适用于需要高效、可靠数据提取的场景。

  • by Iamkrmayank
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Iamkrmayank/mcp-server

使用说明

Agno MCP编排系统

一个基于模型上下文协议(MCP)的具有自动回退机制的全面网络抓取编排框架。

🎯 系统概述

Agno编排系统为web数据提取提供了一个强大的、生产就绪的解决方案,包括:

  • 多源抓取 具有智能回退功能
  • 综合录井 带有时间戳和性能指标
  • MCP集成 实现无缝工具协调
  • 自然语言查询 具有自动预处理功能
  • 透明的反馈 关于执行状态

建筑

User Input
   ↓
Agno Orchestrator (preprocesses & coordinates)
   ↓
MCP Tools Framework (manages execution)
   ↓
Primary: Tavily API (fast, structured extraction)
   ↓ (on failure)
Fallback: Jina API (semantic understanding)
   ↓
Formatted Response + Execution Logs

🚀 快速开始

先决条件

  • Python 3.10或更高版本
  • API密钥用于:

安装

  1. 克隆存储库:
git clone https://github.com/yourusername/mcp-server.git
cd mcp-server
  1. 安装依赖项:
pip install -r requirements.txt
  1. 配置环境变量:
# Copy example environment file
cp .env.example .env

# Edit .env with your API keys
# Required:
TAVILY_API_KEY=your_tavily_api_key_here

# Optional:
JINA_API_KEY=your_jina_api_key_here

# Configuration (optional):
LOG_LEVEL=INFO
LOG_FILE=agno_system.log
MAX_RETRIES=3
TIMEOUT_SECONDS=30

用法

作为MCP服务器

作为MCP服务器运行(用于与MCP兼容客户端集成):

python -m src.server

作为CLI工具

从命令行运行独立查询:

# Basic usage
python -m src.cli "Tell me about Microsoft 2024 report"

# With custom formatting
python -m src.cli "What happened in AI in 2024?" --format markdown

# With more results
python -m src.cli "Latest climate change news" --max-results 10

# Show statistics
python -m src.cli "Search query" --stats

程序化使用

import asyncio
from src.agno_orchestrator import AgnoOrchestrator

async def main():
    # Initialize orchestrator
    orchestrator = AgnoOrchestrator()
    
    # Process a request
    response = await orchestrator.process_request(
        user_input="Tell me about Microsoft 2024 report",
        max_results=5
    )
    
    # Format and display
    if response.success:
        formatted = orchestrator.format_response(response, format_type="markdown")
        print(formatted)
    else:
        print(f"Error: {response.error}")

asyncio.run(main())

📋 核心组件

1.阿格诺编曲家(src/agno_orchestrator.py)

中央控制层:

  • 预处理自然语言查询
  • 通过基于优先级的选择协调工具执行
  • 管理自动回退机制
  • 提供透明的用户反馈
  • 跟踪系统统计信息

关键方法:

  • process_request(user_input, **kwargs) -查询的主要入口点
  • format_response(response, format_type) -将结果格式化为结构化/JSON/Markdown
  • get_statistics() -检索系统性能指标

2.MCP工具框架(src/mcp_tools_integration.py)

工具管理统一界面:

  • 动态工具注册和发现
  • 基于优先级的执行顺序
  • 通过置信度评分进行结果验证
  • 执行历史跟踪
  • 自动故障转移处理

关键类别:

  • BaseTool -所有刮削工具的抽象基础
  • ToolRegistry -工具管理中央注册表
  • MCPToolsFramework -主要协调框架
  • ToolResult -标准化结果容器

3.报废工具

塔维利工具(src/tools/tavily_tool.py)

  • 优先: 0(最高)
  • 目的: 快速、结构化的web提取
  • 特征:
    • 可配置的搜索深度(基本/高级)
    • 域过滤(包括/排除)
    • 自动置信度计算
    • 丰富的结果元数据

工具 名称src/tools/jina_tool.py)

  • 优先: 1(回退)
  • 目的: 语义网理解
  • 特征:
    • 搜索API集成
    • 用于内容提取的阅读器API
    • 后备搜索机制
    • 在没有API密钥的情况下工作(速率受限)

4.测井系统(src/logging_system.py)

全面的日志记录,包括:

  • 所有事件的UTC时间戳
  • 操作级别跟踪(开始/结束)
  • 持续时间测量值(毫秒)
  • 成功/失败状态
  • 数据质量指标(置信度、完整性)
  • 回退事件日志记录

日志格式:

2024-10-14 15:30:45 UTC - AgnoSystem - INFO - [Tavily_Request] Status: success | Duration: 1250.45ms | Quality: {"confidence": 0.85}

5.配置管理(src/config.py)

集中配置:

  • 环境变量加载
  • 配置验证
  • 默认值管理
  • 安全的API密钥处理

🔧 配置选项

变量 描述 默认值 必填
TAVILY_API_KEY Tavilly API密钥 - 是*
JINA_API_KEY Jina API密钥 - 否
LOG_LEVEL 日志记录级别 信息 否
LOG_FILE 日志文件路径 agno_system.Log 否
TIMEOUT_SECONDS 请求超时 30 否
MAX_RETRIES 最大重试次数 3 否
MIN_CONFIDENCE 最小置信阈值 0.5 否

*必须至少配置一个API密钥(Tavily或Jina)。

📊 系统功能

基于优先级的执行

工具按优先级顺序执行:

  1. 塔维利 (优先级0)-主要快速提取
  2. 姓名 (优先级1)-语义回退

如果失败或置信度低,系统会自动尝试下一个工具。

自动回退

# Fallback triggers when:
1. Primary tool fails (error, timeout)
2. Result confidence below threshold
3. Empty or invalid data returned

# Fallback is logged:
{
  "timestamp": "2024-10-14T15:30:45.123Z",
  "operation": "Fallback_Triggered",
  "from": "Tavily",
  "to": "Jina",
  "reason": "Tavily request timeout"
}

信心评分

每个结果都包括一个基于以下因素的置信度得分(0.0-1.0):

  • 找到的结果数量
  • 来源的质量分数
  • 摘要答案的存在
  • 内容完整性

透明反馈

用户收到明确的状态消息:

  • ✓ 成功: “已成功从Tavily检索到结果。”
  • ✓ 使用回退: 主源不可用,已使用回退机制
  • ⚠ 超时: “请求超时。请重试。”
  • ✗ 失败: “无法检索结果。所有源都失败。”

📝 测井标准

每个操作日志:

  1. 时间戳 -UTC ISO格式
  2. 操作名称 -例如,“Tavily_Request”
  3. 持续时间 -执行时间(毫秒)
  4. 状态 -成功/失败/超时/进程中
  5. 错误信息 -如果适用
  6. 数据质量 -置信度和完整性指标
  7. 元数据 -附加上下文

日志条目示例:

{
  "timestamp": "2024-10-14T15:30:45.123456Z",
  "operation": "Tavily_Request_End",
  "status": "success",
  "duration_ms": 1250.45,
  "error": null,
  "data_quality": {
    "confidence": 0.85
  },
  "metadata": {
    "result_count": 5,
    "search_depth": "basic"
  }
}

🛠️ 发展

项目结构

mcp-server/
├── src/
│   ├── __init__.py
│   ├── server.py              # MCP server entry point
│   ├── cli.py                 # Command-line interface
│   ├── config.py              # Configuration management
│   ├── logging_system.py      # Comprehensive logging
│   ├── agno_orchestrator.py   # Main orchestration logic
│   ├── mcp_tools_integration.py  # Tool framework
│   └── tools/
│       ├── __init__.py
│       ├── tavily_tool.py     # Tavily integration
│       └── jina_tool.py       # Jina integration
├── requirements.txt           # Python dependencies
├── .env.example              # Example environment file
├── .gitignore                # Git ignore rules
└── README.md                 # This file

添加新工具

  1. 创建一个新的工具类,继承自 BaseTool:
from src.mcp_tools_integration import BaseTool, ToolResult, ToolStatus

class MyCustomTool(BaseTool):
    def __init__(self, api_key=None):
        super().__init__(name="MyTool", priority=2)  # Lower priority = fallback
        self.api_key = api_key
    
    def is_available(self) -> bool:
        return bool(self.api_key)
    
    async def execute(self, query: str, **kwargs) -> ToolResult:
        # Implement your scraping logic
        try:
            # ... scraping code ...
            return ToolResult(
                status=ToolStatus.SUCCESS,
                data={"results": []},
                confidence=0.8
            )
        except Exception as e:
            return ToolResult(
                status=ToolStatus.FAILURE,
                error=str(e)
            )
  1. 在编排器中注册该工具:
from src.tools.my_custom_tool import MyCustomTool

# In AgnoOrchestrator._register_tools()
custom_tool = MyCustomTool(api_key=custom_api_key)
self.framework.register_tool(custom_tool)

运行测试

# Test CLI
python -m src.cli "test query" --format json

# Test specific queries
python -m src.cli "Microsoft 2024 report" --stats
python -m src.cli "Latest AI news" --max-results 10 --format markdown

📈 系统统计

轨道系统性能:

stats = orchestrator.get_statistics()
# Returns:
{
  "total_requests": 100,
  "successful_requests": 95,
  "success_rate": 95.0,
  "fallback_count": 12,
  "fallback_rate": 12.0,
  "available_tools": 2,
  "registered_tools": 2
}

🔒 安全

  • 存储在环境变量中的API密钥
  • 输出中从未记录或公开密钥
  • 用于所有API通信的HTTPS
  • 日志中未存储敏感数据

🐛 故障排除

“没有可用的刮削工具”

  • 检查中是否至少配置了一个API密钥 .env
  • 验证API密钥是否有效

“请求超时”

  • 增加 TIMEOUT_SECONDS 在 .env
  • 检查互联网连接
  • 验证API服务是否可运行

“所有工具都失败了”

  • 检查API密钥的有效性
  • 查看登录 agno_system.log
  • 确保查询格式正确
  • 尝试不同的查询

低置信度结果

  • 调整 MIN_CONFIDENCE 阈值
  • 使用更具体的查询
  • 试试看 search_depth=advanced 为塔维利

📄 许可证

MIT许可证-有关详细信息,请参阅许可证文件

🤝 贡献

欢迎投稿!拜托:

  1. 复刻仓库
  2. 创建要素分支
  3. 进行更改
  4. 如果适用,添加测试
  5. 提交拉取请求

📞 支持

对于问题、疑问或功能请求:

  • 在GitHub上打开一个问题
  • 检查现有问题的解决方案
  • 查看日志以获取调试信息

🎉 致谢

内置:


版本: 1.0.0
最后更新时间: 2025年10月