内容
# MCP-AG2 集成示例
本项目演示了[模型上下文协议 (Model Context Protocol, MCP)](https://modelcontextprotocol.io/)与[AutoGen (AG2)](https://github.com/ag2ai/ag2)的集成,展示了一种构建模块化、工具驱动的 AI 代理的强大模式。
## 概述
该示例实现了三个关键组件:
1. **MCP Server**:一个遵循 MCP 规范的进程,暴露资源和工具
2. **MCPAssistantAgent**:一个实现 MCP 客户端接口的 AutoGen AssistantAgent 扩展
3. **示例脚本**:演示了一个使用 MCP 资源/工具的 LLM 能力的 MCP 启用代理
## 设置
### 先决条件
1. 安装 `uv` 包管理器:
```bash
# macOS
brew install uv
# 其他平台
curl -LsSf https://astral.sh/uv/install.sh | sh
```
### 安装
```bash
# 克隆仓库
git clone https://github.com/jtanningbed/mcp-ag2-example
cd mcp-ag2-example
# 安装依赖
uv sync
# 运行示例
uv run example.py
```
## 主要优势
这种集成模式相较于传统的工具/函数调用实现提供了几个优势:
### 1. 协议级接口抽象
- MCP 客户端接口本身(`read_resource`、`call_tool` 等)通过 AG2 的工具注册暴露给 LLM 代理
- 我们只注册核心 MCP 接口方法,而不是直接将单个工具注册到 AG2
- 所有特定工具(例如,`write_file`)通过 `call_tool` 接口代理到 MCP 服务器
- 这意味着在 MCP 服务器上定义的工具不需要针对不同 LLM 进行格式转换 - 它们保持在 Anthropic 模式格式中
### 2. 动态工具发现和模型无关性
- 代理使用 `list_tools` 来发现可用的服务器工具
- 虽然 MCP 服务器使用 Anthropic 的模式格式定义工具,但 LLM 从未直接看到这些工具
- LLM 只需理解如何使用 `call_tool` 及其名称和参数
- 不需要在不同 LLM 格式之间转换工具模式,因为它们被抽象在 MCP 接口后面
### 3. 清晰的关注点分离
- MCP 服务器处理:
- 工具实现细节
- 工具模式定义(以 Anthropic 格式)
- 资源管理
- 代理仅处理:
- 理解核心 MCP 接口方法
- 使用 `call_tool` 将特定工具请求代理到服务器
- LLM 集成层仅处理:
- 将 MCP 接口方法注册为工具(例如,OpenAI 格式中的 `call_tool`)
- 通过 MCP 客户端路由工具调用
### AutoGen 特定优势
与传统的 AutoGen 工具实现相比:
1. **简化的工具集成**
- 无需在多种格式中定义工具模式
- 工具在 MCP 服务器上以 Anthropic 格式定义一次
- AG2 只需注册 `call_tool` 接口
2. **增强的模块化**
- MCP 服务器可以被任何兼容 MCP 的客户端使用
- 工具和资源与代理实现完全解耦
- 可以在不更改代理的情况下向服务器添加新工具
## 架构概述
```mermaid
graph LR
A[LLM] -->|使用| B[AG2 工具接口]
B -->|注册| C[MCP 接口方法]
C -->|代理| D[MCP 客户端]
D -->|协议| E[MCP 服务器]
E -->|实现| F[工具与资源]
```