AI代理协调平台

SCOUT是一个多AI提供商协调平台,通过统一接口管理Gemini、OpenAI、Claude等AI代理,用于架构分析、战略规划等复杂任务。

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

使用说明

SCOUT - 战略首席技术官运营与统一工具平台

个人MCP服务器,通过协调AI团队提升CTO(首席技术官)的生产力。

SCOUT协调专门的人工智能代理(Gemini、OpenAI、Claude、OpenRouter、Grok)来完成复杂的架构设计、分析和战略任务,遵循 模型上下文协议(MCP)。


📋 功能

  • 多供应商AI编排无缝使用5家AI提供商,统一界面
  • 基于团队的执行配置主节点+验证器模型以达成共识
  • **MCP协议原生(或:MCP协议本地)**与Claude桌面版和网页版完全兼容
  • 合同优先开发JSON模式定义了严格的工具契约
  • 80%以上的测试覆盖率强制检测确保可靠性
  • 结构化日志记录完整可追溯性,支持请求关联
  • 成本追踪实时监控API使用情况和成本
  • 智能缓存基于Redis的缓存减少了冗余的API调用

🚀 快速入门

先决条件

  • Python 3.11及以上版本
  • Redis(发音类似“雷迪斯”,但通常直接音译为“瑞迪斯”或保持原英文名) (本地或云端)
  • API密钥 对于至少一家人工智能提供商(Gemini、OpenAI、Anthropic、OpenRouter 或 Grok)

1. 克隆并设置

# Clone repository
git clone <repository-url>
cd SCOUT

# Create virtual environment
python -m venv .venv

# Activate virtual environment
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activate

# Install dependencies
pip install -e .

# Install development dependencies
pip install -e ".[dev]"

2. 配置环境

# Copy environment template
cp .env.example .env

# Edit .env and add your API keys
# Required: At least one AI provider API key
# Required: REDIS_URL (default: redis://localhost:6379)

所需的最少变量:

# Choose at least one provider
GEMINI_API_KEY=AIza...          # OR
OPENAI_API_KEY=sk-proj-...      # OR
ANTHROPIC_API_KEY=sk-ant-...    # OR
OPENROUTER_API_KEY=sk-or-v1-... # OR
GROK_API_KEY=xai-...

# Infrastructure
REDIS_URL=redis://localhost:6379

3. 设置 Redis

选项A:Docker(推荐)

# Run Redis container
docker run -d \
  --name scout-redis \
  -p 6379:6379 \
  redis:7-alpine

# Verify connection
docker exec scout-redis redis-cli ping
# Expected output: PONG

选项B:本地安装

Windows:

# Install via Chocolatey
choco install redis-64

# Start Redis
redis-server

macOS:

# Install via Homebrew
brew install redis

# Start Redis service
brew services start redis

Linux(Ubuntu/Debian):

# Install Redis
sudo apt update
sudo apt install redis-server

# Start Redis service
sudo systemctl start redis
sudo systemctl enable redis

选项C:云Redis(Upstash)

  1. 在(某网站/平台)创建免费账户 Upstash(注:这是一个专有名词,可能指某个特定的公司、服务或产品名称,在中文中没有直接对应的翻译,因此保持原样。)
  2. 创建Redis数据库
  3. 复制连接URL到 .env:
    REDIS_URL=redis://default:<password>@<host>:<port>
    

4. 测试安装

# Run tests
pytest

# Check coverage
pytest --cov=src/scout --cov-report=html

# Start MCP server (when implemented)
python -m scout

📁 项目结构

SCOUT/
├── .specify/                   # SpecKit framework
│   ├── memory/
│   │   └── constitution.md     # Project governance (7 principles)
│   └── templates/              # Feature spec/plan/tasks templates
├── src/scout/
│   ├── tools/                  # MCP-exposed tools (chat, planner, analyse, etc.)
│   ├── providers/              # AI provider abstractions
│   │   ├── base.py             # BaseAIProvider interface
│   │   ├── gemini.py           # Google Gemini
│   │   ├── openai.py           # OpenAI (GPT-4o, o3-mini)
│   │   ├── anthropic.py        # Anthropic Claude
│   │   ├── openrouter.py       # OpenRouter aggregator
│   │   ├── grok.py             # X.AI Grok
│   │   └── factory.py          # Provider factory
│   ├── core/
│   │   ├── orchestrator.py     # Tool routing and execution
│   │   ├── team_selector.py    # AI team selection logic
│   │   └── state_manager.py    # Redis state management
│   ├── config/
│   │   ├── loader.py           # YAML configuration loader
│   │   └── models.py           # Pydantic configuration schemas
│   └── utils/
│       ├── cache.py            # Redis caching
│       ├── rate_limiter.py     # Request rate limiting
│       ├── retry.py            # Retry logic with backoff
│       └── logger.py           # Structured logging setup
├── config/
│   └── scout.yaml              # Main configuration (providers, teams, mappings)
├── tests/
│   ├── unit/                   # Unit tests (mocked dependencies)
│   └── integration/            # Integration tests (mocked providers)
├── docs/
│   ├── api/                    # Auto-generated API docs
│   ├── architecture.md         # System architecture
│   └── quickstart.md           # This file
├── pyproject.toml              # Python project metadata & dependencies
├── .env.example                # Environment variables template
└── README.md                   # This file

🏗️ 建筑学

SCOUT遵循一个 契约优先, 模块化架构 如……中所定义 宪法。

┌─────────────────────────────────────────────────────────────┐
│                  Claude Desktop/Web (MCP Client)             │
└─────────────────────┬───────────────────────────────────────┘
                      │ MCP Protocol (STDIO/HTTP+SSE)
┌─────────────────────▼───────────────────────────────────────┐
│                  SCOUT MCP Server                            │
│  ┌────────────────────────────────────────────────────────┐ │
│  │         Tool Router & Orchestrator                      │ │
│  │         (FastMCP + Tool Registry)                       │ │
│  └───┬──────────────────────────────────────────────┬─────┘ │
│      │                                               │       │
│  ┌───▼────────┐  ┌──────────────┐  ┌───────────────▼────┐ │
│  │   Tools    │  │   AI Team    │  │   State Manager    │ │
│  │  Registry  │  │   Selector   │  │   (Redis)          │ │
│  └───┬────────┘  └──────┬───────┘  └───────────────┬────┘ │
│      │                  │                           │       │
│  ┌───▼──────────────────▼───────────────────────────▼────┐ │
│  │            Provider Abstraction Layer                  │ │
│  │   (Unified Interface: Gemini, OpenAI, Claude, etc.)   │ │
│  └───┬──────┬──────┬─────────┬──────────┬───────────────┘ │
└──────┼──────┼──────┼─────────┼──────────┼─────────────────┘
       │      │      │         │          │
   ┌───▼──┐ ┌▼───┐ ┌▼──────┐ ┌▼────────┐ ┌▼────┐
   │Gemini│ │OAI │ │Claude │ │OpenRoute│ │Grok │
   └──────┘ └────┘ └───────┘ └─────────┘ └─────┘

核心原则(摘自宪法)

  1. 合同优先开发 - 每个工具均通过MCP架构定义
  2. 模块化架构 - 严格的职责分离
  3. 强制性检测 - 覆盖率≥80%(不可商量)
  4. 自动生成的文档 - 来自模式的文档
  5. 强大的错误处理 - 结构化异常处理 + 恢复
  6. 结构化日志记录 - 请求关联性 + 可观测性
  7. 提供者抽象 - 统一的多模型接口

🛠️ 配置

SCOUT 使用一种类型安全的YAML配置系统,支持环境变量替换和自动验证。

快速配置

创建 config/scout.yaml 来自示例:

cp config/scout.yaml.example config/scout.yaml

最小配置(单一提供商):

providers:
  gemini:
    api_key: ${GEMINI_API_KEY}
    models:
      flash:
        id: "gemini-2.0-flash-exp"
        max_tokens: 8192
        temperature: 0.7

teams:
  general:
    description: "General purpose team"
    primary:
      provider: "gemini"
      model: "flash"

tool_team_mapping:
  default: "general"

system:
  default_team: "general"
  request_timeout_seconds: 90
  max_retries: 3
  cache_ttl_seconds: 7200

integrations:
  notion_api_key: null
  tavily_api_key: null

多供应商验证:

providers:
  gemini:
    api_key: ${GEMINI_API_KEY}
    models:
      flash: { id: "gemini-2.0-flash-exp", max_tokens: 8192 }

  openai:
    api_key: ${OPENAI_API_KEY}
    models:
      gpt4o: { id: "gpt-4o", max_tokens: 16384 }

teams:
  architect:
    description: "Architecture team with validation"
    primary:
      provider: "gemini"
      model: "flash"
    validators:
      - provider: "openai"
        model: "gpt4o"
        trigger: "always"  # Validate all responses

tool_team_mapping:
  system_design: "architect"

环境变量替换

  • 必需的: ${VAR} - 必须设置变量
  • 可选: ${VAR:-default} - 未设置时使用默认值
system:
  request_timeout_seconds: ${REQUEST_TIMEOUT:-90}  # Default: 90
  cache_ttl_seconds: ${CACHE_TTL:-7200}            # Default: 7200

配置特性

✅ 类型安全 - Pydantic 验证在启动时捕获错误 ✅(勾选标记,表示正确、确认或完成) 不可变的 - 冻结模型防止运行时修改 ✅ 安全 日志/错误中自动对API密钥进行遮蔽处理 ✅ 快 - 加载时间约5毫秒(在50个提供商、100个团队中测试) ✅ 交叉引用验证 - Teams引用现有的提供者/模型 ✅ 环境感知的 - 不同环境下的不同配置

文档

添加新的提供商(<5分钟)

  1. 添加到 config/scout.yaml:
providers:
  new_provider:
    api_key: "${NEW_PROVIDER_API_KEY}"
    models:
      model_name:
        id: "model-id"
        max_tokens: 8192
  1. 设置环境变量:
export NEW_PROVIDER_API_KEY=your-key-here
  1. 团队中的参考:
teams:
  new_team:
    primary:
      provider: "new_provider"
      model: "model_name"

就是这样!交叉引用验证确保所有设置都正确无误。


🧪 开发工作流程

SCOUT遵循 SpecKit(注:这是一个专有名词或特定软件/工具的名称,直接翻译为“光谱工具包”可能不够准确,具体翻译需根据上下文确定,此处仅为一种可能的翻译) 开发过程:

1. 指定功能

/speckit.specify <feature-description>

创建包含以下内容的详细规格说明:

  • 用户场景(按优先级排序)
  • 需求(功能需求+非功能需求)
  • MCP合同(JSON模式)
  • 验收标准

2. 消除歧义

/speckit.clarify

识别出未明确说明的领域,并提出有针对性的问题。

3. 制定实施计划

/speckit.plan

制定分阶段实施计划,包括:

  • 技术设计
  • 依赖分析
  • 风险缓解
  • 测试策略

4. 生成任务

/speckit.tasks

生成按用户故事组织的、具有依赖关系的检查清单。

5. 实施

/speckit.implement

遵循测试驱动开发(Test-Driven Development,TDD)原则执行实施。

6. 分析一致性

/speckit.analyze

对规范、计划、任务和代码进行交叉验证,确保一致性。


✅ 测试

运行所有测试

# Run full test suite
pytest

# Run with coverage report
pytest --cov=src/scout --cov-report=term-missing

# Run only unit tests
pytest tests/unit -m unit

# Run only integration tests
pytest tests/integration -m integration

# Run performance benchmarks
pytest -m benchmark

编写测试(必做)

每个工具都必须具备:

# tests/unit/test_chat.py
import pytest
from scout.tools.chat import chat_handler

@pytest.mark.asyncio
async def test_chat_valid_input(mock_dependencies):
    """Test nominal case with valid input."""
    result = await chat_handler(
        message="Hello",
        **mock_dependencies
    )
    assert "response" in result
    assert result["metadata"]["cost_usd"] > 0

@pytest.mark.asyncio
async def test_chat_invalid_input():
    """Test schema validation with invalid input."""
    with pytest.raises(ValidationError):
        await chat_handler(message="")  # Empty message

@pytest.mark.asyncio
async def test_chat_provider_failure(mock_failing_provider):
    """Test error handling when provider fails."""
    with pytest.raises(ProviderError):
        await chat_handler(
            message="Test",
            provider_factory=mock_failing_provider
        )

📊 监控与可观测性

结构化日志记录

所有日志均使用带有请求关联性的JSON格式:

{
  "event": "tool_execution_started",
  "request_id": "uuid-1234-5678",
  "tool_name": "analyse",
  "team": "architect",
  "timestamp": "2025-10-18T10:30:00Z"
}

指标(OpenTelemetry)

  • scout.tool.duration_ms - P50/P95/P99 延迟
  • scout.tool.errors - 按类型统计的错误数量
  • scout.tool.cost_usd - 每次工具执行的成本
  • scout.provider.requests - 每个提供商的请求数量

成本追踪

实时追踪成本:

# Automatic tracking per tool execution
logger.info(
    "tool_execution_completed",
    cost_usd=0.023,
    tokens={"input": 1200, "output": 800}
)

当预算达到每天50美元的阈值时,将触发预算提醒(可配置)。


🔒 安全

密钥管理(或“机密管理”)

  • 永远不要 提交(或“确定”、“执行”) .env (在 .gitignore)
  • 永远 使用环境变量来存储API密钥
  • 旋转 API密钥,每90天一次
  • 使用 用于检测秘密的pre-commit钩子:
# Install pre-commit hook
pip install pre-commit
pre-commit install

# Manually scan for secrets
detect-secrets scan

输入验证

所有输入均通过 Pydantic 进行验证:

class AnalyseInput(BaseModel):
    target: constr(max_length=100000)
    analysis_type: Literal["code_quality", "architecture", "performance"]

    @validator('target')
    def sanitize_target(cls, v):
        return v.strip()

速率限制

自动速率限制防止滥用:

  • 每个用户每小时100次请求
  • 全球每日1000次请求
  • 特定提供者限制(Gemini:每分钟60次请求等)

📚 文档


🤝 贡献

SCOUT遵循严格的治理原则,通过 宪法.

拉取请求检查清单

  • [ ] 所有测试通过(pytest)
  • [ ] 覆盖率 ≥ 80%(pytest --cov)
  • [ ] 没有秘密泄露(detect-secrets scan)
  • [ ] 代码已格式化 (black src/ tests/)
  • [ ] 代码清理(Linting clean)ruff check src/ tests/)
  • [ ] 类型检查通过 (mypy src/)
  • [ ] 文档已更新
  • [ ] MCP模式已验证(无破坏性变更)
  • [ ] 公报中提及的宪法原则

在提交之前

# Format code
black src/ tests/

# Lint
ruff check --fix src/ tests/

# Type check
mypy src/

# Test
pytest --cov=src/scout --cov-fail-under=80

# Security scan
bandit -r src/
detect-secrets scan

📈 路线图

第一阶段:基础设施核心(第1-2周)

  • [x] 项目结构
  • [x] 宪法
  • [x] 配置系统 ✅(116个测试,覆盖率94.86%)
  • [ ] 提供者抽象层
  • [ ] 球队选择器
  • [ ] 工具注册表

第二阶段:首个工具“聊天”(第3-4周)

  • [ ] 聊天工具实现
  • [ ] 状态管理器(Redis)
  • [ ] MCP服务器入口点
  • [ ] 与Claude桌面版的集成

第三阶段:必备工具(第5-6周)

  • [ ] apilookup(API查询)
  • [ ] 计划者/规划者
  • [ ] 分析
  • [ ] 深思熟虑

第四阶段:高级工具(第7-8周)

  • [ ] 共识
  • [ ] 挑战
  • [ ] secaudit(注:此词可能为特定领域或上下文中的术语,直接翻译为“安全审计”可能不够准确,需根据具体语境调整)
  • [ ] 重构

🆘 故障排除

Redis 连接失败

错误: redis.exceptions.ConnectionError

解决方案:

# Check Redis is running
docker ps | grep redis

# Test connection
redis-cli ping

# Verify REDIS_URL in .env
echo $REDIS_URL

导入错误

错误: ModuleNotFoundError: No module named 'scout'

解决方案:

# Install in editable mode
pip install -e .

API密钥错误

错误: ConfigurationError: Missing API key

解决方案:

# Verify .env exists and has keys
cat .env | grep API_KEY

# Load environment variables
source .env  # macOS/Linux
# or reload terminal on Windows

📝 许可证

MIT 许可证 - 版权所有 (c) 2025 Christian Boulet,Boulet Stratégies TI


📧 联系方式

克里斯蒂安·布勒

  • 电子邮箱:christian@bouletstrategies.com
  • 公司:布勒信息技术战略公司

版本0.1.0 最后更新时间2025年10月18日